Pour lancer : bundle exec rspec --color screenshots_spec.rb
Pour uploader et partager : surge .
Pour lancer : bundle exec rspec --color screenshots_spec.rb
Pour uploader et partager : surge .
require "fileutils" | |
# require "slim" | |
# rubocop:disable Metrics/BlockLength | |
class Group | |
attr_reader :screenshots, :name | |
def initialize(name:) | |
@name = name | |
@screenshots = [] | |
end | |
end | |
RSpec.describe "public pages", type: :feature, js: true do | |
before(:all) do | |
@timestamp = Time.zone.now.strftime("%Y-%m-%d_%H-%M-%S").to_s | |
@dirpath = File.join(__dir__, @timestamp) | |
FileUtils.mkdir_p(@dirpath) | |
end | |
before(:each) do | |
Capybara.register_driver :mobile do |capybara_app| | |
Capybara::Selenium::Driver.new( | |
capybara_app, | |
browser: :firefox, | |
options: Selenium::WebDriver::Firefox::Options.new(args: %w[--headless --width=390 --height=844]) | |
) | |
end | |
Capybara.register_driver :desktop do |capybara_app| | |
Capybara::Selenium::Driver.new( | |
capybara_app, | |
browser: :firefox, | |
options: Selenium::WebDriver::Firefox::Options.new(args: %w[--headless --width=1280 --height=1024]) | |
) | |
end | |
end | |
context "default" do | |
let(:now) { Time.zone.now } | |
# from spec/features/users/online_booking/default_spec.rb | |
let!(:territory92) { create(:territory, departement_number: "92") } | |
let!(:organisation) { create(:organisation, :with_contact, territory: territory92) } | |
let!(:service_medical) { create(:service, name: "Service Médical") } | |
let!(:service_social) { create(:service, name: "Service Social") } | |
let!(:motif_vaccination) { create(:motif, name: "Vaccination", organisation: organisation, restriction_for_rdv: nil, service: service_medical) } | |
let!(:motif_tel) { create(:motif, :by_phone, name: "Télé consultation", organisation: organisation, restriction_for_rdv: nil, service: service_medical) } | |
let!(:motif_collectif) { create(:motif, :collectif, name: "Atelier collectif", organisation: organisation, restriction_for_rdv: nil, service: service_social) } | |
let!(:motif_rsa) { create(:motif, name: "poursuite RSA", organisation: organisation, restriction_for_rdv: nil, service: service_social) } | |
let!(:lieu_centre) { create(:lieu, name: "MDS Centre", organisation: organisation) } | |
let!(:lieu_est) { create(:lieu, name: "MJD Est", organisation: organisation) } | |
let!(:plage_ouverture_vaccination) { create(:plage_ouverture, :daily, first_day: now + 1.month, motifs: [motif_vaccination], lieu: lieu_centre, organisation: organisation) } | |
let!(:plage_ouverture_motif_tel) { create(:plage_ouverture, :daily, first_day: now + 1.month, motifs: [motif_tel], lieu: lieu_centre, organisation: organisation) } | |
let!(:plage_ouverture_rsa) { create(:plage_ouverture, :daily, first_day: now + 1.month, motifs: [motif_rsa], lieu: lieu_est, organisation: organisation) } | |
let!(:agent) { create(:agent, organisations: [organisation]) } | |
let!(:rdv_collectifs) do | |
3.times do |i| | |
create( | |
:rdv, | |
starts_at: now + 1.month + i.days + 10.hours, | |
motif: motif_collectif, | |
lieu: lieu_est, | |
organisation: organisation, | |
agents: [agent] | |
) | |
end | |
end | |
let!(:user) { create(:user, first_name: "Jean", last_name: "Dupont", email: "[email protected]", password: "Rdvservicepublictest1!") } | |
it "screenshots" do | |
@viewports = { mobile: {}, desktop: {} } | |
@viewports.each_key do |viewport| | |
puts "--- running for #{viewport} ---" | |
@current_viewport = viewport | |
run_screenshots | |
end | |
page.driver.browser.close | |
puts "stitching screenshots..." | |
system "pngquant --ext .png --force #{File.join(@dirpath, '**/*.png')}" | |
html = Slim::Template.new(File.join(__dir__, "template.slim")).render(OpenStruct.new(timestamp: @timestamp, viewports: @viewports)) | |
File.write(File.join(@dirpath, "index.html"), html) | |
system "cp #{File.join(__dir__, 'style.css')} #{@dirpath}" | |
system "open #{@dirpath}/index.html" | |
puts "run `cd #{@dirpath} && python -m http.server && open http://localhost:8000` to see the screenshots" | |
end | |
def enter_group(name) | |
@current_group_name = name | |
puts " group #{@current_group_name}" | |
end | |
def run_screenshots # rubocop:disable Metrics/MethodLength | |
Capybara.current_driver = @current_viewport | |
%w[mairie aide-numerique].each do |domain| | |
base_url = "http://www.rdv-#{domain}.localhost:3000" | |
enter_group domain | |
["", "presentation_agent", "prendre_rdv"].each do |path| | |
visit "#{base_url}/#{path}" | |
screenshot "#{domain}-#{path.parameterize}" | |
end | |
end | |
enter_group "static-pages" | |
[ | |
"/contact", | |
"/mds", | |
"/accessibility", | |
"/mentions_legales", | |
"/cgu", | |
"/politique_de_confidentialite", | |
"/domaines", | |
"/stats/", | |
"/stats/notifications", | |
"/connexion_super_admins", | |
].each do |path| | |
visit path | |
screenshot path.parameterize | |
end | |
enter_group "prise-rdv" | |
visit root_path | |
screenshot "home" | |
# from spec/features/users/online_booking/default_spec.rb | |
fill_in("search_where", with: "79 Rue de Plaisance, 92250 La Garenne-Colombes") | |
find("#search_departement", visible: :all) # permet d'attendre que l'élément soit dans le DOM | |
page.execute_script("document.querySelector('#search_departement').value = '92'") | |
page.execute_script("document.querySelector('#search_submit').disabled = false") | |
click_button("Rechercher") | |
screenshot "selection-service" | |
click_on "Service Médical" | |
screenshot "selection-motif" | |
click_on "Vaccination" | |
screenshot "selection-lieu" | |
find(".card-title", text: /MDS Centre/).ancestor(".card").find("a.stretched-link").click | |
screenshot "selection-creneau" | |
click_on "sem. prochaine" | |
first(:link, "11:00").click | |
screenshot "connexion" | |
fill_in "user_email", with: "[email protected]" | |
fill_in "user[password]", with: "Rdvservicepublictest1!" | |
click_button "Se connecter" | |
screenshot "etape-informations-usager" | |
click_on "Continuer" | |
screenshot "etape-choix-usager" | |
click_on "Continuer" | |
screenshot "etape-confirmation" | |
click_on "Confirmer mon RDV" | |
enter_group "user-account" | |
visit "/users/informations" | |
screenshot "mes-informations" | |
click_on "Ajouter un proche" | |
screenshot "modale-ajouter-un-proche" | |
first_name = { mobile: "Bryony", desktop: "Karim" }[@current_viewport] | |
within "#modal-holder" do | |
fill_in "user_first_name", with: first_name | |
fill_in "user_last_name", with: "Dupont" | |
click_on "Enregistrer" | |
end | |
screenshot "DEBUG" | |
find("div.col", text: /#{first_name}/).ancestor("li").click_on "Modifier" | |
screenshot "modifier-un-proche" | |
visit "/users/edit" | |
screenshot "mon-compte" | |
visit "/users/rdvs" | |
screenshot "mes-rdvs" | |
first(".btn", text: "Déplacer le RDV").click | |
screenshot "deplacer-rdv" | |
first(:link, "08:00").click | |
screenshot "deplacer-rdv-confirmation" | |
click_on "Confirmer le nouveau créneau" | |
click_on "Annuler le RDV" | |
screenshot "annuler-rdv" | |
enter_group "invitation" | |
visit "/invitation" | |
screenshot "invitation-manuelle" | |
visit "/users/user_name_initials_verification/new" | |
screenshot "verification-initiales" | |
# user = User.create!(first_name: "Claudia", last_name: "La Pobla", organisations: [organisation]) | |
# user.invite!(domain: Domain::RDV_SOLIDARITES, invited_by: agent) | |
# fill_in "invitation_token", with: user.invitation_token | |
# click_on "Créer son compte" | |
# user.assign_rdv_invitation_token | |
# user.save! | |
# visit "/prendre_rdv?address=Garennecolombes&city_code=92035&departement=92&latitude=48.904582&longitude=2.25391&service_id=1&street_ban_id=92035_7145&invitation_token=#{user.rdv_invitation_token}" | |
# exit | |
enter_group "prise-rdv-collectif" | |
visit root_path | |
# from spec/features/users/online_booking/default_spec.rb | |
fill_in("search_where", with: "79 Rue de Plaisance, 92250 La Garenne-Colombes") | |
find("#search_departement", visible: :all) | |
page.execute_script("document.querySelector('#search_departement').value = '92'") | |
page.execute_script("document.querySelector('#search_submit').disabled = false") | |
click_button("Rechercher") | |
click_on "Service Social" | |
screenshot "selection-motif" | |
click_on "Atelier collectif" | |
find(".card-title", text: /MJD Est/).ancestor(".card").find("a.stretched-link").click | |
screenshot "selection-creneau" | |
first(:link, "S'inscrire").click | |
click_on "Continuer" | |
click_on "Continuer" | |
screenshot "etape-confirmation" | |
click_on "Confirmer ma participation" | |
screenshot "rdv" | |
click_on "modifier" | |
screenshot "modifier-participants" | |
find('button[aria-controls="modal-header-menu"]').click if @current_viewport == :mobile | |
screenshot "menu-user-logged-in" | |
click_on "Déconnexion" | |
enter_group "inscription" | |
visit "/users/sign_up" | |
screenshot "inscription" | |
fill_in "user_first_name", with: "Zineb" | |
fill_in "user_last_name", with: "Moussaoui" | |
fill_in "user_email", with: "[email protected]" | |
click_on "Je m'inscris" | |
visit "/users/confirmation?confirmation_token=#{User.find_by(email: '[email protected]').confirmation_token}" | |
screenshot "definir-mot-de-passe" | |
visit "/users/password/new" | |
screenshot "mot-de-passe-oublie" | |
end | |
def screenshot(name) | |
@viewports[@current_viewport][@current_group_name] ||= Group.new(name: @current_group_name) | |
sleep 0.2 | |
index = (@viewports[@current_viewport][@current_group_name].screenshots.count + 1).to_s.rjust(2, "0") | |
filename = "screenshot-#{@current_viewport}-#{index}-#{name.parameterize}.png" | |
filepath_rel = File.join @current_viewport.to_s, @current_group_name, filename | |
filepath_abs = File.join @dirpath, filepath_rel | |
FileUtils.mkdir_p File.dirname(filepath_abs) | |
page.driver.browser.save_full_page_screenshot filepath_abs | |
@viewports[@current_viewport][@current_group_name].screenshots << OpenStruct.new(path: filepath_rel, filename:, name:) | |
end | |
end | |
end | |
# rubocop:enable Metrics/BlockLength |
html, body { | |
margin: 0; | |
padding: 0; | |
height: 100%; | |
} | |
.container { | |
display: flex; | |
flex-direction: column; | |
height: 100%; | |
main { | |
overflow-y: hidden; | |
display: flex; | |
flex-wrap: nowrap; | |
gap: 50px; | |
aside { | |
flex-grow: 0; | |
overflow: auto; | |
} | |
.screenshots-wrapper { | |
flex: 1; | |
overflow: auto; | |
} | |
} | |
} | |
section { | |
display: flex; | |
flex-wrap: nowrap; | |
gap: 50px; | |
} | |
img { | |
border: 1px solid #ccc; | |
} | |
ul { | |
list-style-type: none; | |
margin: 0; | |
padding-left: 10px; | |
} |
doctype html | |
html lang="en" | |
head | |
meta charset="UTF-8" | |
meta name="viewport" content="width=device-width, initial-scale=1.0" | |
meta http-equiv="X-UA-Compatible" content="ie=edge" | |
title | |
= "RDV Screenshots #{timestamp}" | |
link rel="stylesheet" href="style.css" | |
body | |
.container | |
header | |
h1 | |
| RDV Screenshots | |
= timestamp | |
main | |
aside | |
ul | |
- viewports.each do |viewport, groups| | |
li | |
a href="##{viewport}" | |
= viewport | |
ul | |
- groups.each_value do |group| | |
li | |
a href="##{group.name}" | |
= group.name | |
ul | |
- group.screenshots.each do |screenshot| | |
li | |
a href="##{screenshot.filename}" | |
= screenshot.name | |
.screenshots-wrapper | |
- viewports.each do |viewport, groups| | |
h2 id=viewport | |
= viewport | |
- groups.each_value do |group| | |
h3 id=group.name | |
= group.name | |
section | |
- group.screenshots.each do |screenshot| | |
div | |
h3 id=screenshot.filename | |
= screenshot.name | |
img loading="lazy" src=screenshot.path |