diff options
author | eileencodes <eileencodes@gmail.com> | 2016-11-06 18:55:15 -0500 |
---|---|---|
committer | eileencodes <eileencodes@gmail.com> | 2017-02-20 15:07:33 -0500 |
commit | 5bf0aa6745db27c45c0778f9f6e9046f9ee9fb94 (patch) | |
tree | 7ba85a8ea15146725c68ce6b9e5a94ebac6d0c9c /actionsystemtest/lib/action_system_test/test_helpers | |
parent | a21e18d5080a2c4808330271885f5664a725d3f3 (diff) | |
download | rails-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')
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 |