summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Speicher <rspeicher@gmail.com>2015-06-14 20:33:29 -0400
committerRobert Speicher <rspeicher@gmail.com>2015-06-16 12:52:52 -0400
commit0d4eb312d95e3518386202a776cd1a0ce5573d2c (patch)
tree5b429939e41afd4d19e219be19f08c20f2258b7c
parentf323b8c4e5f43597d126dbed2fa27455a8c2e416 (diff)
downloadgitlab-ce-0d4eb312d95e3518386202a776cd1a0ce5573d2c.tar.gz
Add `allowing_for_delay` helper method for feature specs
cherry-picked
-rw-r--r--spec/features/profiles/preferences_spec.rb14
-rw-r--r--spec/support/capybara.rb33
2 files changed, 41 insertions, 6 deletions
diff --git a/spec/features/profiles/preferences_spec.rb b/spec/features/profiles/preferences_spec.rb
index dcef436c573..c4d9281b1f0 100644
--- a/spec/features/profiles/preferences_spec.rb
+++ b/spec/features/profiles/preferences_spec.rb
@@ -21,9 +21,10 @@ describe 'Profile > Preferences' do
it 'updates their preference' do
choose "user_theme_id_#{theme.id}"
- visit page.current_path
-
- expect(page).to have_checked_field("user_theme_id_#{theme.id}")
+ allowing_for_delay do
+ visit page.current_path
+ expect(page).to have_checked_field("user_theme_id_#{theme.id}")
+ end
end
it 'reflects the changes immediately' do
@@ -46,9 +47,10 @@ describe 'Profile > Preferences' do
it 'updates their preference' do
choose 'user_color_scheme_id_5'
- visit page.current_path
-
- expect(page).to have_checked_field('user_color_scheme_id_5')
+ allowing_for_delay do
+ visit page.current_path
+ expect(page).to have_checked_field('user_color_scheme_id_5')
+ end
end
end
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index fed1ab6ee33..3e41aec425a 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -19,3 +19,36 @@ unless ENV['CI'] || ENV['CI_SERVER']
# Keep only the screenshots generated from the last failing test suite
Capybara::Screenshot.prune_strategy = :keep_last_run
end
+
+module CapybaraHelpers
+ # Execute a block a certain number of times before considering it a failure
+ #
+ # The given block is called, and if it raises a `Capybara::ExpectationNotMet`
+ # error, we wait `interval` seconds and then try again, until `retries` is
+ # met.
+ #
+ # This allows for better handling of timing-sensitive expectations in a
+ # sketchy CI environment, for example.
+ #
+ # interval - Delay between retries in seconds (default: 0.5)
+ # retries - Number of times to execute before failing (default: 5)
+ def allowing_for_delay(interval: 0.5, retries: 5)
+ tries = 0
+
+ begin
+ yield
+ rescue Capybara::ExpectationNotMet => ex
+ if tries <= retries
+ tries += 1
+ sleep interval
+ retry
+ else
+ raise ex
+ end
+ end
+ end
+end
+
+RSpec.configure do |config|
+ config.include CapybaraHelpers, type: :feature
+end