Merge pull request #1163 from tchak/use-headless-chrome
Use capybara-selenium with headless chrome
This commit is contained in:
commit
23e0655a80
16 changed files with 80 additions and 86 deletions
|
@ -1,68 +1,43 @@
|
|||
version: 2
|
||||
|
||||
defaults: &defaults
|
||||
working_directory: /tps
|
||||
working_directory: ~/tps
|
||||
docker:
|
||||
- image: ruby:2.3.5
|
||||
- image: postgres:9.4.1
|
||||
- image: circleci/ruby:2.3.6-node-browsers
|
||||
- image: circleci/postgres:9.5
|
||||
environment:
|
||||
POSTGRES_USER: tps_test
|
||||
POSTGRES_PASSWORD: tps_test
|
||||
POSTGRES_DB: tps_test
|
||||
|
||||
install_system_deps: &install_system_deps
|
||||
run:
|
||||
name: Install System Dependencies
|
||||
command: apt-get update -qq && apt-get install -y build-essential nodejs
|
||||
|
||||
restore_phantomjs_cache: &restore_phantomjs_cache
|
||||
restore_cache:
|
||||
key: phantomjs-2-1-1
|
||||
|
||||
bundle_restore_cache: &bundle_restore_cache
|
||||
restore_cache:
|
||||
key: bundle-install-v4-{{ arch }}-{{ checksum "Gemfile.lock" }}
|
||||
key: bundle-install-v7-{{ arch }}-{{ checksum "Gemfile.lock" }}
|
||||
|
||||
bundle_save_cache: &bundle_save_cache
|
||||
save_cache:
|
||||
key: bundle-install-v7-{{ arch }}-{{ checksum "Gemfile.lock" }}
|
||||
paths:
|
||||
- ~/vendor/bundle
|
||||
|
||||
bundle_install: &bundle_install
|
||||
run:
|
||||
name: Install Ruby Dependencies
|
||||
command: bundle install
|
||||
command: bundle install --path ~/vendor/bundle
|
||||
|
||||
jobs:
|
||||
build:
|
||||
<<: *defaults
|
||||
steps:
|
||||
- checkout
|
||||
- *install_system_deps
|
||||
- *bundle_restore_cache
|
||||
- *bundle_install
|
||||
- save_cache:
|
||||
key: bundle-install-v4-{{ arch }}-{{ checksum "Gemfile.lock" }}
|
||||
paths:
|
||||
- /usr/local/bundle
|
||||
- *restore_phantomjs_cache
|
||||
- run:
|
||||
name: Install PhantomJS Dependencies
|
||||
command: |
|
||||
[ -f /usr/local/bin/phantomjs ] || apt-get update
|
||||
[ -f /usr/local/bin/phantomjs ] || apt-get install -y fontconfig wget
|
||||
- run:
|
||||
name: Install PhantomJS
|
||||
command: |
|
||||
[ -f /usr/local/bin/phantomjs ] || wget -O /tmp/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
|
||||
[ -f /usr/local/bin/phantomjs ] || tar -xjf /tmp/phantomjs.tar.bz2 -C /tmp
|
||||
[ -f /usr/local/bin/phantomjs ] || mv /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs
|
||||
- save_cache:
|
||||
key: phantomjs-2-1-1
|
||||
paths:
|
||||
- /usr/local/bin/phantomjs
|
||||
- *bundle_save_cache
|
||||
test:
|
||||
<<: *defaults
|
||||
parallelism: 4
|
||||
steps:
|
||||
- checkout
|
||||
- *install_system_deps
|
||||
- *restore_phantomjs_cache
|
||||
- *bundle_restore_cache
|
||||
- *bundle_install
|
||||
- run:
|
||||
|
@ -77,16 +52,15 @@ jobs:
|
|||
command: |
|
||||
bundle exec rspec --profile 10 \
|
||||
--format RspecJunitFormatter \
|
||||
--out $CIRCLE_TEST_REPORTS/rspec.xml \
|
||||
--out ~/test_results/rspec.xml \
|
||||
--format progress \
|
||||
$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
|
||||
- store_test_results:
|
||||
path: $CIRCLE_TEST_REPORTS/rspec.xml
|
||||
path: ~/test_results/rspec.xml
|
||||
lint:
|
||||
<<: *defaults
|
||||
steps:
|
||||
- checkout
|
||||
- *install_system_deps
|
||||
- *bundle_restore_cache
|
||||
- *bundle_install
|
||||
- run:
|
||||
|
@ -105,7 +79,6 @@ jobs:
|
|||
<<: *defaults
|
||||
steps:
|
||||
- checkout
|
||||
- *install_system_deps
|
||||
- *bundle_restore_cache
|
||||
- *bundle_install
|
||||
- add_ssh_keys:
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.3.5
|
||||
2.3.6
|
||||
|
|
4
Gemfile
4
Gemfile
|
@ -94,6 +94,8 @@ gem 'skylight'
|
|||
|
||||
gem 'scenic'
|
||||
|
||||
gem 'sanitize-url'
|
||||
|
||||
# Cron jobs
|
||||
gem 'delayed_job_active_record'
|
||||
gem "daemons"
|
||||
|
@ -120,7 +122,7 @@ group :test do
|
|||
gem 'database_cleaner'
|
||||
gem 'webmock'
|
||||
gem 'shoulda-matchers', require: false
|
||||
gem 'poltergeist'
|
||||
gem 'capybara-selenium'
|
||||
gem 'timecop'
|
||||
gem 'guard'
|
||||
gem 'guard-rspec', require: false
|
||||
|
|
19
Gemfile.lock
19
Gemfile.lock
|
@ -105,6 +105,9 @@ GEM
|
|||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
xpath (~> 2.0)
|
||||
capybara-selenium (0.0.6)
|
||||
capybara
|
||||
selenium-webdriver
|
||||
carrierwave (0.11.2)
|
||||
activemodel (>= 3.2.0)
|
||||
activesupport (>= 3.2.0)
|
||||
|
@ -113,9 +116,10 @@ GEM
|
|||
mimemagic (>= 0.3.0)
|
||||
carrierwave-i18n (0.2.0)
|
||||
chartkick (2.2.1)
|
||||
childprocess (0.8.0)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
chunky_png (1.3.8)
|
||||
clamav-client (3.1.0)
|
||||
cliver (0.3.2)
|
||||
coderay (1.1.1)
|
||||
coffee-rails (4.2.1)
|
||||
coffee-script (>= 2.2.0)
|
||||
|
@ -466,10 +470,6 @@ GEM
|
|||
ast (~> 2.2)
|
||||
pdf-core (0.6.1)
|
||||
pg (0.19.0)
|
||||
poltergeist (1.14.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
websocket-driver (>= 0.2.0)
|
||||
powerpack (0.1.1)
|
||||
prawn (2.0.2)
|
||||
pdf-core (~> 0.6.0)
|
||||
|
@ -593,6 +593,7 @@ GEM
|
|||
sexp_processor (~> 4.9)
|
||||
rubyzip (1.0.0)
|
||||
safe_yaml (1.0.4)
|
||||
sanitize-url (0.1.4)
|
||||
sass (3.4.22)
|
||||
sass-rails (5.0.6)
|
||||
railties (>= 4.0.0, < 6)
|
||||
|
@ -613,6 +614,9 @@ GEM
|
|||
select2-rails (4.0.3)
|
||||
thor (~> 0.14)
|
||||
selectize-rails (0.12.4.1)
|
||||
selenium-webdriver (3.8.0)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.0)
|
||||
sentry-raven (2.2.0)
|
||||
faraday (>= 0.7.6, < 1.0)
|
||||
sexp_processor (4.10.0)
|
||||
|
@ -726,6 +730,7 @@ DEPENDENCIES
|
|||
browser
|
||||
byebug
|
||||
capybara
|
||||
capybara-selenium
|
||||
carrierwave
|
||||
carrierwave-i18n
|
||||
chartkick
|
||||
|
@ -765,7 +770,6 @@ DEPENDENCIES
|
|||
openid_connect
|
||||
openstack
|
||||
pg
|
||||
poltergeist
|
||||
prawn (~> 2.0.1)
|
||||
prawn_rails (~> 0.0.11)
|
||||
pry-byebug
|
||||
|
@ -779,6 +783,7 @@ DEPENDENCIES
|
|||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-rspec-focused
|
||||
sanitize-url
|
||||
sass-rails (~> 5.0)
|
||||
scenic
|
||||
scss_lint
|
||||
|
@ -804,4 +809,4 @@ DEPENDENCIES
|
|||
xray-rails
|
||||
|
||||
BUNDLED WITH
|
||||
1.16.0
|
||||
1.16.1
|
||||
|
|
|
@ -20,7 +20,7 @@ Téléprocédures Simplifiées, ou TPS pour les intimes, est une plateforme 100
|
|||
|
||||
### Tests
|
||||
|
||||
- PhantomJS
|
||||
- Chrome
|
||||
|
||||
|
||||
## Initialisation de l'environnement de développement
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
module ApplicationHelper
|
||||
include SanitizeUrl
|
||||
|
||||
def sanitize_url(url)
|
||||
super(url, schemes: ['http', 'https'], replace_evil_with: root_url)
|
||||
end
|
||||
|
||||
def flash_class(level)
|
||||
case level
|
||||
when "notice" then "alert-success"
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
%h3 Lien procédure
|
||||
%div{ style: 'margin-left: 3%;' }
|
||||
- if @facade.procedure.publiee_ou_archivee?
|
||||
= link_to @facade.procedure.lien, @facade.procedure.lien, target: '_blank'
|
||||
= link_to @facade.procedure.lien, sanitize_url(@facade.procedure.lien), target: :blank
|
||||
- else
|
||||
%b
|
||||
Cette procédure n'a pas encore été publiée et n'est donc pas accessible par le public.
|
||||
|
|
|
@ -20,5 +20,4 @@
|
|||
|
||||
- if @facade.procedure.lien_site_web.present?
|
||||
.center
|
||||
%a{ href: @facade.procedure.lien_site_web, target: '_blank' }
|
||||
En savoir plus ...
|
||||
= link_to "En savoir plus ...", sanitize_url(@facade.procedure.lien_site_web), target: '_blank'
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
- if dossier.procedure.lien_demarche.present?
|
||||
%em
|
||||
Récupérer le formulaire de demande ou CERFA vierge pour mon dossier :
|
||||
= link_to "Télécharger", "#{dossier.procedure.lien_demarche}", target: :blank, id: :lien_cerfa
|
||||
= link_to "Télécharger", sanitize_url(dossier.procedure.lien_demarche), target: :blank, id: :lien_cerfa
|
||||
-# %a#lien_cerfa{ href: "#{dossier.procedure.lien_demarche}", target: '_blank' } Télécharger
|
||||
|
||||
%td
|
||||
|
|
|
@ -10,17 +10,17 @@ feature 'As an administrateur I wanna create a new procedure', js: true do
|
|||
|
||||
context 'Right after sign_in I shall see all procedure states links' do
|
||||
scenario 'Finding draft procedures' do
|
||||
page.find_by_id('draft-procedures').trigger('click')
|
||||
page.find_by_id('draft-procedures').click
|
||||
expect(page).to have_current_path(admin_procedures_draft_path, only_path: true)
|
||||
end
|
||||
|
||||
scenario 'Finding active procedures' do
|
||||
page.find_by_id('active-procedures').trigger('click')
|
||||
page.find_by_id('active-procedures').click
|
||||
expect(page).to have_current_path(admin_procedures_path, only_path: true)
|
||||
end
|
||||
|
||||
scenario 'Finding archived procedures' do
|
||||
page.find_by_id('archived-procedures').trigger('click')
|
||||
page.find_by_id('archived-procedures').click
|
||||
expect(page).to have_current_path(admin_procedures_archived_path, only_path: true)
|
||||
end
|
||||
end
|
||||
|
@ -58,13 +58,13 @@ feature 'As an administrateur I wanna create a new procedure', js: true do
|
|||
page.find_by_id('procedure_types_de_champ_attributes_1_libelle')
|
||||
expect(Procedure.first.types_de_champ.first.libelle).to eq('libelle de champ')
|
||||
|
||||
page.find_by_id('onglet-pieces').trigger('click')
|
||||
page.find_by_id('onglet-pieces').click
|
||||
expect(page).to have_current_path(admin_procedure_pieces_justificatives_path(Procedure.first.id.to_s))
|
||||
page.find_by_id('procedure_types_de_piece_justificative_attributes_0_libelle').set 'libelle de piece'
|
||||
page.find_by_id('add_piece_justificative').click
|
||||
page.find_by_id('procedure_types_de_piece_justificative_attributes_1_libelle')
|
||||
|
||||
page.find_by_id('onglet-preview').trigger('click')
|
||||
page.find_by_id('onglet-preview').click
|
||||
expect(page).to have_current_path(admin_procedure_previsualisation_path(Procedure.first.id.to_s))
|
||||
expect(page.find("input[type='text']")['placeholder']).to eq('libelle de champ')
|
||||
expect(page.first('.piece-libelle').text).to eq('libelle de piece')
|
||||
|
@ -73,21 +73,21 @@ feature 'As an administrateur I wanna create a new procedure', js: true do
|
|||
scenario 'After adding champ and file, check impossibility to publish procedure, add accompagnateur and make publication' do
|
||||
page.find_by_id('procedure_types_de_champ_attributes_0_libelle').set 'libelle de champ'
|
||||
page.find_by_id('add_type_de_champ').click
|
||||
page.find_by_id('onglet-pieces').trigger('click')
|
||||
page.find_by_id('onglet-pieces').click
|
||||
page.find_by_id('procedure_types_de_piece_justificative_attributes_0_libelle').set 'libelle de piece'
|
||||
page.find_by_id('add_piece_justificative').click
|
||||
|
||||
page.find_by_id('onglet-infos').trigger('click')
|
||||
page.find_by_id('onglet-infos').click
|
||||
expect(page).to have_current_path(admin_procedure_path(Procedure.first.id.to_s))
|
||||
expect(page.find_by_id('publish-procedure')['disabled']).to eq('disabled')
|
||||
expect(page.find_by_id('publish-procedure')['disabled']).to eq('true')
|
||||
|
||||
page.find_by_id('onglet-accompagnateurs').trigger('click')
|
||||
page.find_by_id('onglet-accompagnateurs').click
|
||||
expect(page).to have_current_path(admin_procedure_accompagnateurs_path(Procedure.first.id.to_s))
|
||||
page.find_by_id('gestionnaire_email').set 'gestionnaire@apientreprise.fr'
|
||||
page.find_by_id('add-gestionnaire-email').click
|
||||
page.first('.gestionnaire-affectation').click
|
||||
|
||||
page.find_by_id('onglet-infos').trigger('click')
|
||||
page.find_by_id('onglet-infos').click
|
||||
expect(page).to have_selector('#publish-procedure', visible: true)
|
||||
page.find_by_id('publish-procedure').click
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ feature 'user path for dossier creation' do
|
|||
context 'when validating info entreprise recap page' do
|
||||
before do
|
||||
page.check('dossier_autorisation_donnees')
|
||||
page.find_by_id('etape_suivante').trigger('click')
|
||||
page.find_by_id('etape_suivante').click
|
||||
end
|
||||
scenario 'user is on description page' do
|
||||
expect(page).to have_css('#description-page')
|
||||
|
@ -69,7 +69,7 @@ feature 'user path for dossier creation' do
|
|||
context 'user fill and validate description page' do
|
||||
before do
|
||||
page.find_by_id("champs_#{Dossier.last.champs.first.id}").set 'Mon super projet'
|
||||
page.find_by_id('suivant').trigger('click')
|
||||
page.find_by_id('suivant').click
|
||||
end
|
||||
scenario 'user is on recap page' do
|
||||
expect(page).to have_css('#users-recapitulatif-dossier-show')
|
||||
|
|
|
@ -55,14 +55,14 @@ feature 'As a User I wanna create a dossier' do
|
|||
stub_request(:get, "https://staging.entreprise.api.gouv.fr/v2/associations/#{siret}?token=#{SIADETOKEN}")
|
||||
.to_return(status: 404, body: '')
|
||||
page.find_by_id('dossier-siret').set siret
|
||||
page.find_by_id('submit-siret').trigger('click')
|
||||
page.find_by_id('submit-siret').click
|
||||
expect(page).to have_css('#recap-info-entreprise')
|
||||
find(:css, "#dossier_autorisation_donnees[value='1']").set(true)
|
||||
page.find_by_id('etape_suivante').trigger('click')
|
||||
page.find_by_id('etape_suivante').click
|
||||
expect(page).to have_current_path(users_dossier_carte_path(procedure_with_siret.dossiers.last.id.to_s), only_path: true)
|
||||
page.find_by_id('etape_suivante').trigger('click')
|
||||
page.find_by_id('etape_suivante').click
|
||||
fill_in "champs_#{procedure_with_siret.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
|
||||
page.find_by_id('suivant').trigger('click')
|
||||
page.find_by_id('suivant').click
|
||||
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_with_siret.dossiers.last.id.to_s), only_path: true)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -37,7 +37,7 @@ feature 'As a User I want to edit a dossier I own' do
|
|||
linked_dossier_id = dossier.champs.find { |c| c.type_de_champ.type_champ == 'dossier_link' }.value
|
||||
expect(page).to have_link("Dossier #{linked_dossier_id}")
|
||||
|
||||
page.find_by_id('maj_infos').trigger('click')
|
||||
page.find_by_id('edit-dossier').click
|
||||
expect(page).to have_current_path(users_dossier_description_path(dossier.id.to_s), only_path: true)
|
||||
champ_id = dossier.champs.find { |t| t.type_champ == "text" }.id
|
||||
fill_in "champs_#{champ_id.to_s}", with: 'Contenu du champ 1'
|
||||
|
|
|
@ -11,8 +11,8 @@ feature 'As a User I want to sort and paginate dossiers', js: true do
|
|||
fill_in 'dossier_individual_attributes_prenom', with: 'Prenom'
|
||||
fill_in 'dossier_individual_attributes_birthdate', with: '14/10/1987'
|
||||
find(:css, "#dossier_autorisation_donnees[value='1']").set(true)
|
||||
page.find_by_id('etape_suivante').trigger('click')
|
||||
page.find_by_id('suivant').trigger('click')
|
||||
page.find_by_id('etape_suivante').click
|
||||
page.find_by_id('suivant').click
|
||||
50.times do
|
||||
Dossier.create(procedure_id: procedure_for_individual.id, user_id: user.id, state: "en_construction")
|
||||
end
|
||||
|
@ -35,15 +35,15 @@ feature 'As a User I want to sort and paginate dossiers', js: true do
|
|||
scenario 'Using pagination' do
|
||||
visit "/users/dossiers?dossiers_smart_listing[sort][id]=asc"
|
||||
expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s)
|
||||
page.find('.next_page a').trigger('click')
|
||||
page.find('.next_page a').click
|
||||
wait_for_ajax
|
||||
expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 10).to_s)
|
||||
page.find('.next_page a').trigger('click')
|
||||
page.find('.next_page a').click
|
||||
wait_for_ajax
|
||||
expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 20).to_s)
|
||||
page.find('.prev a').trigger('click')
|
||||
page.find('.prev a').click
|
||||
wait_for_ajax
|
||||
page.find('.prev a').trigger('click')
|
||||
page.find('.prev a').click
|
||||
wait_for_ajax
|
||||
expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id).to_s)
|
||||
end
|
||||
|
|
|
@ -3,10 +3,8 @@ require 'spec_helper'
|
|||
describe Carto::Geocodeur do
|
||||
let(:address) { '50 av des champs elysees' }
|
||||
describe '.convert_adresse_to_point', vcr: { cassette_name: 'bano_octo' } do
|
||||
if ENV['CIRCLECI'].nil?
|
||||
it 'return a point' do
|
||||
expect(described_class.convert_adresse_to_point(address).class).to eq(RGeo::Cartesian::PointImpl)
|
||||
end
|
||||
it 'return a point' do
|
||||
expect(described_class.convert_adresse_to_point(address).class).to eq(RGeo::Cartesian::PointImpl)
|
||||
end
|
||||
context 'when RestClient::Exception' do
|
||||
before do
|
||||
|
|
|
@ -28,11 +28,22 @@ require 'shoulda-matchers'
|
|||
require 'devise'
|
||||
require 'factory_girl'
|
||||
|
||||
require 'capybara/poltergeist'
|
||||
Capybara.javascript_driver = :poltergeist
|
||||
require 'selenium/webdriver'
|
||||
Capybara.javascript_driver = :headless_chrome
|
||||
Capybara.ignore_hidden_elements = false
|
||||
Capybara.register_driver :poltergeist do |app|
|
||||
Capybara::Poltergeist::Driver.new(app, js_errors: true, port: 44_678, phantomjs_options: ['--proxy-type=none'], timeout: 180)
|
||||
|
||||
Capybara.register_driver :chrome do |app|
|
||||
Capybara::Selenium::Driver.new(app, browser: :chrome)
|
||||
end
|
||||
|
||||
Capybara.register_driver :headless_chrome do |app|
|
||||
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
|
||||
chromeOptions: { args: %w(headless disable-gpu window-size=2560,1600) }
|
||||
)
|
||||
|
||||
Capybara::Selenium::Driver.new app,
|
||||
browser: :chrome,
|
||||
desired_capabilities: capabilities
|
||||
end
|
||||
|
||||
ActiveSupport::Deprecation.silenced = true
|
||||
|
|
Loading…
Reference in a new issue