aboutsummaryrefslogtreecommitdiffstats
path: root/actionsystemtest/lib/action_system_test/test_helpers
diff options
context:
space:
mode:
authoreileencodes <eileencodes@gmail.com>2016-11-06 18:55:15 -0500
committereileencodes <eileencodes@gmail.com>2017-02-20 15:07:33 -0500
commit5bf0aa6745db27c45c0778f9f6e9046f9ee9fb94 (patch)
tree7ba85a8ea15146725c68ce6b9e5a94ebac6d0c9c /actionsystemtest/lib/action_system_test/test_helpers
parenta21e18d5080a2c4808330271885f5664a725d3f3 (diff)
downloadrails-5bf0aa6745db27c45c0778f9f6e9046f9ee9fb94.tar.gz
rails-5bf0aa6745db27c45c0778f9f6e9046f9ee9fb94.tar.bz2
rails-5bf0aa6745db27c45c0778f9f6e9046f9ee9fb94.zip
Turn system testing into it's own gem and rename
Renames `Rails::SystemTestCase` to `ActionSystemTest` and moves it to a gem under the Rails name. We need to name the class `ActionSystemTestCase` because the gem expects a module but tests themselves expect a class. Adds MIT-LICENSE, CHANGELOG, and README for the future.
Diffstat (limited to 'actionsystemtest/lib/action_system_test/test_helpers')
-rw-r--r--actionsystemtest/lib/action_system_test/test_helpers/assertions.rb40
-rw-r--r--actionsystemtest/lib/action_system_test/test_helpers/form_helper.rb58
-rw-r--r--actionsystemtest/lib/action_system_test/test_helpers/screenshot_helper.rb47
3 files changed, 145 insertions, 0 deletions
diff --git a/actionsystemtest/lib/action_system_test/test_helpers/assertions.rb b/actionsystemtest/lib/action_system_test/test_helpers/assertions.rb
new file mode 100644
index 0000000000..edc8dbaa7f
--- /dev/null
+++ b/actionsystemtest/lib/action_system_test/test_helpers/assertions.rb
@@ -0,0 +1,40 @@
+module ActionSystemTest
+ module TestHelpers
+ # Assertions for system testing that aren't included by default in Capybara.
+ # These are assertions that are useful specifically for Rails applications.
+ module Assertions
+ # Asserts that all of the provided selectors are present on the given page.
+ #
+ # assert_all_of_selectors('p', 'td')
+ def assert_all_of_selectors(*items)
+ options = items.extract_options!
+ type = type_for_selector(items)
+
+ items.each do |item|
+ assert_selector type, item, options
+ end
+ end
+
+ # Asserts that none of the provided selectors are present on the page.
+ #
+ # assert_none_of_selectors('ul', 'ol')
+ def assert_none_of_selectors(*items)
+ options = items.extract_options!
+ type = type_for_selector(items)
+
+ items.each do |item|
+ assert_no_selector type, item, options
+ end
+ end
+
+ private
+ def type_for_selector(*items)
+ if items.first.is_a?(Symbol)
+ items.shift
+ else
+ Capybara.default_selector
+ end
+ end
+ end
+ end
+end
diff --git a/actionsystemtest/lib/action_system_test/test_helpers/form_helper.rb b/actionsystemtest/lib/action_system_test/test_helpers/form_helper.rb
new file mode 100644
index 0000000000..3c65c23f6d
--- /dev/null
+++ b/actionsystemtest/lib/action_system_test/test_helpers/form_helper.rb
@@ -0,0 +1,58 @@
+module ActionSystemTest
+ module TestHelpers
+ # Form helpers for system testing that aren't included by default in
+ # Capybara.
+ module FormHelper
+ # Finds all provided fields or text areas and fills in with supplied values.
+ #
+ # fill_in_all_fields('Name' => 'Eileen', 'Job Title' => 'Programmer')
+ def fill_in_all_fields(fields)
+ fields.each do |name, value|
+ fill_in name, with: value
+ end
+ end
+
+ # Locates a checkbox that is present inside a label and checks it. When
+ # using styled boxes Selenium may not be able to see the checkbox. This
+ # form helper looks inside the checkbox and clicks the label instead of
+ # setting the value of the checkbox.
+ #
+ # click_checkbox_label 'Admin'
+ #
+ # By default +click_checkbox_label+ looks for checkboxes that are not
+ # checked by default. To locate an already checked box and uncheck it
+ # set checked to true:
+ #
+ # click_checkbox_label 'Admin', checked: true
+ def click_checkbox_label(name, checked: false)
+ field = find_checkbox(name, checked)
+ label = find_label_wrapper(field)
+ label.click
+ end
+
+ # In lieu of locating a button and calling +click_on+, +press_enter+ will
+ # submit the form via enter. This method will only work for drivers that
+ # load a browser like Selenium.
+ #
+ # test 'Adding a User' do
+ # fill_in 'Name', with: 'Arya'
+ #
+ # press_enter
+ #
+ # assert_text 'Arya'
+ # end
+ def press_enter
+ page.driver.browser.action.send_keys(:enter).perform
+ end
+
+ private
+ def find_checkbox(name, checked)
+ find(:field, name, visible: :all, checked: checked)
+ end
+
+ def find_label_wrapper(field, location: "./ancestor::label")
+ field.find :xpath, location
+ end
+ end
+ end
+end
diff --git a/actionsystemtest/lib/action_system_test/test_helpers/screenshot_helper.rb b/actionsystemtest/lib/action_system_test/test_helpers/screenshot_helper.rb
new file mode 100644
index 0000000000..37336e976f
--- /dev/null
+++ b/actionsystemtest/lib/action_system_test/test_helpers/screenshot_helper.rb
@@ -0,0 +1,47 @@
+module ActionSystemTest
+ module TestHelpers
+ # Screenshot helper for system testing
+ module ScreenshotHelper
+ # Takes a screenshot of the current page in the browser if the system
+ # test driver supports screenshots and the test failed.
+ #
+ # Additionally +take_screenshot+ can be used within your tests at points
+ # you want to take a screenshot if the driver supports screenshots. The
+ # Rack Test driver does not support screenshots.
+ #
+ # You can check of the driver supports screenshots by running
+ #
+ # ActionSystemTest.driver.supports_screenshots?
+ # => true
+ def take_screenshot
+ puts "[Screenshot]: #{image_path}"
+ puts find_image
+ end
+
+ private
+ def supported?
+ ActionSystemTest.driver.supports_screenshots? && !passed?
+ end
+
+ def image_path
+ path = "tmp/screenshots/failures_#{method_name}.png"
+ page.save_screenshot(Rails.root.join(path))
+ path
+ end
+
+ def find_image
+ if ENV["CAPYBARA_INLINE_SCREENSHOT"] == "artifact"
+ "\e]1338;url=artifact://#{image_path}\a"
+ else
+ name = inline_base64(File.basename(image_path))
+ image = inline_base64(File.read(image_path))
+ "\e]1337;File=name=#{name};height=400px;inline=1:#{image}\a"
+ end
+ end
+
+ def inline_base64(path)
+ Base64.encode64(path).gsub("\n", "")
+ end
+ end
+ end
+end