diff options
| author | jpl | 2016-08-23 11:28:06 +0200 |
|---|---|---|
| committer | jpl | 2016-08-23 11:28:06 +0200 |
| commit | 8b3f3055ec5ee19bdaf9f334c83cfcdd01c7ed0b (patch) | |
| tree | 5f542928e52540fd2d7bead72644e11186a9f3ca | |
| parent | cdd593a7faddbcf61ca71eb57421478623aed897 (diff) | |
| download | chouette-core-8b3f3055ec5ee19bdaf9f334c83cfcdd01c7ed0b.tar.bz2 | |
Refs #1482: adding cucumber for tests
| -rw-r--r-- | Gemfile | 9 | ||||
| -rw-r--r-- | Gemfile.lock | 24 | ||||
| -rw-r--r-- | config/cucumber.yml | 13 | ||||
| -rw-r--r-- | config/database.yml | 7 | ||||
| -rw-r--r-- | features/authentification.feature | 9 | ||||
| -rw-r--r-- | features/step_definitions/.gitkeep | 0 | ||||
| -rw-r--r-- | features/step_definitions/authentification_steps.rb | 0 | ||||
| -rw-r--r-- | features/step_definitions/general_steps.rb | 10 | ||||
| -rw-r--r-- | features/step_definitions/users_steps.rb | 16 | ||||
| -rw-r--r-- | features/support/env.rb | 58 | ||||
| -rw-r--r-- | lib/tasks/ci.rake | 4 | ||||
| -rw-r--r-- | lib/tasks/cucumber.rake | 76 | ||||
| -rwxr-xr-x | script/cucumber | 10 | ||||
| -rw-r--r-- | spec/fabricators/user_fabricator.rb | 8 |
14 files changed, 239 insertions, 5 deletions
@@ -119,6 +119,7 @@ group :development do # MetaRequest is incompatible with rgeo-activerecord # gem 'meta_request' gem 'quiet_assets', '~> 1.0' + platforms :ruby_20, :ruby_21, :ruby_22 do gem 'better_errors' gem 'binding_of_caller' @@ -126,10 +127,16 @@ group :development do end group :test do + gem 'cucumber-rails', require: false gem 'simplecov', :require => false gem 'simplecov-rcov', :require => false end +group :test, :development, :dev do + gem 'fabrication', '~> 2.14.1' + gem 'ffaker', '~> 2.1.0' +end + group :test, :development do gem 'awesome_print' gem 'pry-rails' @@ -137,13 +144,13 @@ group :test, :development do gem 'fakeweb' gem 'webmock' gem 'capybara', '~> 2.4.0' + gem 'database_cleaner' gem 'poltergeist' gem 'launchy' gem 'factory_girl_rails', '~> 4.0' gem 'rb-inotify', require: RUBY_PLATFORM.include?('linux') && 'rb-inotify' gem 'rb-fsevent', require: RUBY_PLATFORM.include?('darwin') && 'rb-fsevent' gem 'transpec' - gem 'database_cleaner' gem 'shoulda-matchers' end diff --git a/Gemfile.lock b/Gemfile.lock index 752ae9d2a..8bc64b5ad 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -105,6 +105,23 @@ GEM coffee-script-source (1.9.1) crack (0.4.3) safe_yaml (~> 1.0.0) + cucumber (2.4.0) + builder (>= 2.1.2) + cucumber-core (~> 1.5.0) + cucumber-wire (~> 0.0.1) + diff-lcs (>= 1.1.3) + gherkin (~> 4.0) + multi_json (>= 1.7.5, < 2.0) + multi_test (>= 0.1.2) + cucumber-core (1.5.0) + gherkin (~> 4.0) + cucumber-rails (1.4.4) + capybara (>= 1.1.2, < 3) + cucumber (>= 1.3.8, < 3) + mime-types (>= 1.16, < 4) + nokogiri (~> 1.5) + railties (>= 3, < 5.1) + cucumber-wire (0.0.1) daemons (1.1.9) database_cleaner (1.4.1) dbf (3.0.3) @@ -146,6 +163,7 @@ GEM activesupport (>= 3.2) erubis (2.7.0) execjs (2.6.0) + fabrication (2.14.1) factory_girl (4.5.0) activesupport (>= 3.0.0) factory_girl_rails (4.5.0) @@ -156,6 +174,7 @@ GEM multipart-post (>= 1.2, < 3) faraday_middleware (0.9.1) faraday (>= 0.7.4, < 0.10) + ffaker (2.1.0) ffi (1.9.10) ffi (1.9.10-java) ffi-geos (1.1.0) @@ -178,6 +197,7 @@ GEM geokit (= 1.6.7) georuby (>= 1.9.8) rgeo (>= 0.3.20) + gherkin (4.0.0) google-analytics-rails (0.0.6) guard (2.12.4) formatador (>= 0.2.4) @@ -247,6 +267,7 @@ GEM mini_portile2 (2.1.0) minitest (5.8.3) multi_json (1.11.2) + multi_test (0.1.2) multipart-post (2.0.0) nenv (0.2.0) net-scp (1.2.1) @@ -521,6 +542,7 @@ DEPENDENCIES cocoon codifligne! coffee-rails (~> 4.0.0) + cucumber-rails daemons database_cleaner deep_cloneable (~> 2.0.0) @@ -532,10 +554,12 @@ DEPENDENCIES devise_cas_authenticatable devise_invitable enumerize (~> 0.10.0) + fabrication (~> 2.14.1) factory_girl_rails (~> 4.0) fakeweb faraday (~> 0.9.1) faraday_middleware (~> 0.9.1) + ffaker (~> 2.1.0) font-awesome-sass (~> 4.2.0) foreigner (~> 1.7.4) formtastic (= 2.3.1) diff --git a/config/cucumber.yml b/config/cucumber.yml new file mode 100644 index 000000000..836931b61 --- /dev/null +++ b/config/cucumber.yml @@ -0,0 +1,13 @@ +<% +rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" +rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" + +if ENV['JOB_NAME'] + ci_opts = "--format json --out cucumber.json --format html --out cucumber.html" +end + +std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{ci_opts} --strict --tags ~@wip" +%> +default: <%= std_opts %> features +wip: --tags @wip:3 --wip features +rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip diff --git a/config/database.yml b/config/database.yml index 81951d183..2a3ddf5d0 100644 --- a/config/database.yml +++ b/config/database.yml @@ -10,15 +10,18 @@ default: &default development: <<: *default - database: chouette_dev + database: chouette2 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. -test: +test: &test <<: *default database: chouette_test production: <<: *default database: chouette2 + +cucumber: + <<: *test diff --git a/features/authentification.feature b/features/authentification.feature new file mode 100644 index 000000000..330959178 --- /dev/null +++ b/features/authentification.feature @@ -0,0 +1,9 @@ +# language: fr +Fonctionnalité: Authentification + + Contexte: Utilisateur enregistré + Etant donné un compte confirmé pour "john@stif-boiv.info" avec un nom d'utilisateur "john" + + Scénario: Un utilisateur non connecté ne doit pas pouvoir accéder à l'application + Etant donné que je suis déconnecté + # Alors je ne dois pas pouvoir visiter la page "d'accueil"
\ No newline at end of file diff --git a/features/step_definitions/.gitkeep b/features/step_definitions/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/features/step_definitions/.gitkeep diff --git a/features/step_definitions/authentification_steps.rb b/features/step_definitions/authentification_steps.rb new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/features/step_definitions/authentification_steps.rb diff --git a/features/step_definitions/general_steps.rb b/features/step_definitions/general_steps.rb new file mode 100644 index 000000000..cb3a6a69c --- /dev/null +++ b/features/step_definitions/general_steps.rb @@ -0,0 +1,10 @@ +# language: fr + +##### Alors ##### +Alors(/^je ne dois pas pouvoir visiter la page (.+)$/) do |name| + case name + when "d'accueil" + visit root_path + end + expect(page.status_code).to eq(403) +end
\ No newline at end of file diff --git a/features/step_definitions/users_steps.rb b/features/step_definitions/users_steps.rb new file mode 100644 index 000000000..b84ec1fa5 --- /dev/null +++ b/features/step_definitions/users_steps.rb @@ -0,0 +1,16 @@ +# language: fr + +##### Utility methods ##### +def create_user email, password, username + Fabricate.build(:user, email: email, username: username, password: password).save +end + +##### Etant donné ##### +Etantdonné(/^un compte confirmé pour "([^\"]+)"(?: avec un nom d'utilisateur "(.+)")?$/) do |email, username| + username ||= email.split("@").first + create_user email, 'password', username +end + +Etantdonnéque(/^je suis déconnecté$/) do + # visit destroy_user_session_path +end
\ No newline at end of file diff --git a/features/support/env.rb b/features/support/env.rb new file mode 100644 index 000000000..64ddf6108 --- /dev/null +++ b/features/support/env.rb @@ -0,0 +1,58 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + +require 'cucumber/rails' + +# Capybara defaults to CSS3 selectors rather than XPath. +# If you'd prefer to use XPath, just uncomment this line and adjust any +# selectors in your step definitions to use the XPath syntax. +# Capybara.default_selector = :xpath + +# By default, any exception happening in your Rails application will bubble up +# to Cucumber so that your scenario will fail. This is a different from how +# your application behaves in the production environment, where an error page will +# be rendered instead. +# +# Sometimes we want to override this default behaviour and allow Rails to rescue +# exceptions and display an error page (just like when the app is running in production). +# Typical scenarios where you want to do this is when you test your error pages. +# There are two ways to allow Rails to rescue exceptions: +# +# 1) Tag your scenario (or feature) with @allow-rescue +# +# 2) Set the value below to true. Beware that doing this globally is not +# recommended as it will mask a lot of errors for you! +# +ActionController::Base.allow_rescue = false + +# Remove/comment out the lines below if your app doesn't have a database. +# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead. +begin + DatabaseCleaner.strategy = :transaction +rescue NameError + raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." +end + +# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios. +# See the DatabaseCleaner documentation for details. Example: +# +# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do +# # { :except => [:widgets] } may not do what you expect here +# # as Cucumber::Rails::Database.javascript_strategy overrides +# # this setting. +# DatabaseCleaner.strategy = :truncation +# end +# +# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do +# DatabaseCleaner.strategy = :transaction +# end +# + +# Possible values are :truncation and :transaction +# The :transaction strategy is faster, but might give you threading problems. +# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature +Cucumber::Rails::Database.javascript_strategy = :truncation + diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake index beb3b19d1..b6c7d2352 100644 --- a/lib/tasks/ci.rake +++ b/lib/tasks/ci.rake @@ -23,7 +23,7 @@ namespace :ci do desc "Deploy after CI" task :deploy do - sh "cap #{deploy_env} deploy:migrations deploy:seed" + sh "cap #{deploy_env} deploy:migrations deploy:seed deploy:cucumber" end desc "Clean test files" @@ -33,4 +33,4 @@ namespace :ci do end desc "Run continuous integration tasks (spec, ...)" -task :ci => ["ci:setup", "spec", "ci:deploy", "ci:clean"] +task :ci => ["ci:setup", "spec", "cucumber", "ci:deploy", "ci:clean"] diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake new file mode 100644 index 000000000..23d9b3eb4 --- /dev/null +++ b/lib/tasks/cucumber.rake @@ -0,0 +1,76 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + + +unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks + +vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil? + +begin + require 'cucumber/rake/task' + + namespace :cucumber do + Cucumber::Rake::Task.new({:ok => 'test:prepare'}, 'Run features that should pass') do |t| + t.binary = vendored_cucumber_bin # If nil, the gem's binary is used. + t.fork = true # You may get faster startup if you set this to false + t.profile = 'default' + end + + Cucumber::Rake::Task.new({:wip => 'test:prepare'}, 'Run features that are being worked on') do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = 'wip' + end + + Cucumber::Rake::Task.new({:rerun => 'test:prepare'}, 'Record failing features and run only them if any exist') do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = 'rerun' + end + + desc 'Run all features' + task :all => [:ok, :wip] + + task :statsetup do + require 'rails/code_statistics' + ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features') + ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features') + end + + task :annotations_setup do + Rails.application.configure do + if config.respond_to?(:annotations) + config.annotations.directories << 'features' + config.annotations.register_extensions('feature') { |tag| /#\s*(#{tag}):?\s*(.*)$/ } + end + end + end + end + desc 'Alias for cucumber:ok' + task :cucumber => 'cucumber:ok' + + task :default => :cucumber + + task :features => :cucumber do + STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***" + end + + # In case we don't have the generic Rails test:prepare hook, append a no-op task that we can depend upon. + task 'test:prepare' do + end + + task :stats => 'cucumber:statsetup' + + task :notes => 'cucumber:annotations_setup' +rescue LoadError + desc 'cucumber rake task not available (cucumber not installed)' + task :cucumber do + abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' + end +end + +end diff --git a/script/cucumber b/script/cucumber new file mode 100755 index 000000000..7fa5c9208 --- /dev/null +++ b/script/cucumber @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby + +vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +if vendored_cucumber_bin + load File.expand_path(vendored_cucumber_bin) +else + require 'rubygems' unless ENV['NO_RUBYGEMS'] + require 'cucumber' + load Cucumber::BINARY +end diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb new file mode 100644 index 000000000..04c1c6279 --- /dev/null +++ b/spec/fabricators/user_fabricator.rb @@ -0,0 +1,8 @@ +Fabricator :user do + email { sequence(:email) { |i| "user#{i}@example.com" } } + name { sequence(:name) { |i| "fname#{i}" } } + + password { 'password' } + + username { "#{FFaker::Name.first_name.parameterize}.#{FFaker::Name.last_name.parameterize}" } +end
\ No newline at end of file |
