ruby_raider 1.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/integration.yml +4 -6
  3. data/.github/workflows/reek.yml +6 -5
  4. data/.github/workflows/release.yml +175 -0
  5. data/.github/workflows/rubocop.yml +7 -6
  6. data/.github/workflows/system_tests.yml +83 -0
  7. data/.gitignore +1 -1
  8. data/.rubocop.yml +24 -0
  9. data/README.md +3 -1
  10. data/RELEASE.md +412 -0
  11. data/RELEASE_QUICK_GUIDE.md +77 -0
  12. data/bin/release +186 -0
  13. data/lib/adopter/adopt_menu.rb +150 -0
  14. data/lib/adopter/converters/base_converter.rb +85 -0
  15. data/lib/adopter/converters/identity_converter.rb +56 -0
  16. data/lib/adopter/migration_plan.rb +75 -0
  17. data/lib/adopter/migrator.rb +96 -0
  18. data/lib/adopter/plan_builder.rb +278 -0
  19. data/lib/adopter/project_analyzer.rb +256 -0
  20. data/lib/adopter/project_detector.rb +159 -0
  21. data/lib/commands/adopt_commands.rb +43 -0
  22. data/lib/generators/automation/templates/account.tt +9 -5
  23. data/lib/generators/automation/templates/appium_caps.tt +60 -6
  24. data/lib/generators/automation/templates/home.tt +4 -4
  25. data/lib/generators/automation/templates/login.tt +61 -4
  26. data/lib/generators/automation/templates/page.tt +13 -7
  27. data/lib/generators/automation/templates/partials/home_page_selector.tt +4 -4
  28. data/lib/generators/automation/templates/partials/initialize_selector.tt +3 -1
  29. data/lib/generators/automation/templates/partials/pdp_page_selector.tt +4 -4
  30. data/lib/generators/automation/templates/partials/visit_method.tt +11 -1
  31. data/lib/generators/automation/templates/pdp.tt +1 -1
  32. data/lib/generators/cucumber/templates/env.tt +6 -4
  33. data/lib/generators/cucumber/templates/partials/capybara_env.tt +20 -0
  34. data/lib/generators/cucumber/templates/partials/capybara_world.tt +6 -0
  35. data/lib/generators/cucumber/templates/partials/mobile_steps.tt +2 -2
  36. data/lib/generators/cucumber/templates/partials/web_steps.tt +4 -3
  37. data/lib/generators/cucumber/templates/steps.tt +2 -2
  38. data/lib/generators/cucumber/templates/world.tt +5 -3
  39. data/lib/generators/generator.rb +14 -2
  40. data/lib/generators/helper_generator.rb +16 -3
  41. data/lib/generators/infrastructure/github_generator.rb +6 -0
  42. data/lib/generators/infrastructure/templates/github.tt +11 -7
  43. data/lib/generators/infrastructure/templates/github_appium.tt +108 -0
  44. data/lib/generators/infrastructure/templates/gitlab.tt +5 -2
  45. data/lib/generators/invoke_generators.rb +1 -0
  46. data/lib/generators/menu_generator.rb +2 -0
  47. data/lib/generators/minitest/minitest_generator.rb +23 -0
  48. data/lib/generators/minitest/templates/test.tt +93 -0
  49. data/lib/generators/rspec/templates/spec.tt +12 -10
  50. data/lib/generators/template_renderer/partial_cache.rb +116 -0
  51. data/lib/generators/template_renderer/partial_resolver.rb +103 -0
  52. data/lib/generators/template_renderer/template_error.rb +50 -0
  53. data/lib/generators/template_renderer.rb +90 -0
  54. data/lib/generators/templates/common/config.tt +2 -2
  55. data/lib/generators/templates/common/gemfile.tt +15 -3
  56. data/lib/generators/templates/common/partials/web_config.tt +1 -1
  57. data/lib/generators/templates/common/read_me.tt +3 -1
  58. data/lib/generators/templates/helpers/allure_helper.tt +2 -2
  59. data/lib/generators/templates/helpers/browser_helper.tt +1 -0
  60. data/lib/generators/templates/helpers/capybara_helper.tt +28 -0
  61. data/lib/generators/templates/helpers/driver_helper.tt +1 -1
  62. data/lib/generators/templates/helpers/partials/allure_imports.tt +3 -1
  63. data/lib/generators/templates/helpers/partials/allure_requirements.tt +3 -1
  64. data/lib/generators/templates/helpers/partials/appium_driver.tt +46 -0
  65. data/lib/generators/templates/helpers/partials/axe_driver.tt +10 -0
  66. data/lib/generators/templates/helpers/partials/browserstack_config.tt +13 -0
  67. data/lib/generators/templates/helpers/partials/driver_and_options.tt +6 -114
  68. data/lib/generators/templates/helpers/partials/quit_driver.tt +3 -1
  69. data/lib/generators/templates/helpers/partials/screenshot.tt +3 -1
  70. data/lib/generators/templates/helpers/partials/selenium_driver.tt +25 -0
  71. data/lib/generators/templates/helpers/spec_helper.tt +17 -4
  72. data/lib/generators/templates/helpers/test_helper.tt +26 -0
  73. data/lib/generators/templates/helpers/visual_spec_helper.tt +1 -1
  74. data/lib/ruby_raider.rb +5 -0
  75. data/lib/version +1 -1
  76. data/spec/adopter/adopt_menu_spec.rb +176 -0
  77. data/spec/adopter/converters/identity_converter_spec.rb +145 -0
  78. data/spec/adopter/migration_plan_spec.rb +113 -0
  79. data/spec/adopter/migrator_spec.rb +277 -0
  80. data/spec/adopter/plan_builder_spec.rb +298 -0
  81. data/spec/adopter/project_analyzer_spec.rb +337 -0
  82. data/spec/adopter/project_detector_spec.rb +295 -0
  83. data/spec/generators/fixtures/templates/test.tt +1 -0
  84. data/spec/generators/fixtures/templates/test_partial.tt +1 -0
  85. data/spec/generators/template_renderer_spec.rb +298 -0
  86. data/spec/integration/commands/scaffolding_commands_spec.rb +2 -2
  87. data/spec/integration/commands/utility_commands_spec.rb +2 -2
  88. data/spec/integration/end_to_end_spec.rb +325 -0
  89. data/spec/integration/generators/automation_generator_spec.rb +11 -11
  90. data/spec/integration/generators/common_generator_spec.rb +40 -40
  91. data/spec/integration/generators/cucumber_generator_spec.rb +7 -7
  92. data/spec/integration/generators/github_generator_spec.rb +8 -8
  93. data/spec/integration/generators/gitlab_generator_spec.rb +8 -8
  94. data/spec/integration/generators/helpers_generator_spec.rb +73 -35
  95. data/spec/integration/generators/minitest_generator_spec.rb +70 -0
  96. data/spec/integration/generators/rspec_generator_spec.rb +7 -7
  97. data/spec/integration/settings_helper.rb +1 -1
  98. data/spec/integration/spec_helper.rb +20 -2
  99. data/spec/system/capybara_spec.rb +42 -0
  100. data/spec/system/selenium_spec.rb +19 -17
  101. data/spec/system/support/system_test_helper.rb +35 -0
  102. data/spec/system/watir_spec.rb +19 -17
  103. metadata +46 -16
  104. data/.github/workflows/push_gem.yml +0 -37
  105. data/.github/workflows/selenium.yml +0 -22
  106. data/.github/workflows/watir.yml +0 -22
  107. data/lib/generators/automation/templates/partials/android_caps.tt +0 -17
  108. data/lib/generators/automation/templates/partials/cross_platform_caps.tt +0 -25
  109. data/lib/generators/automation/templates/partials/ios_caps.tt +0 -18
  110. data/lib/generators/automation/templates/partials/selenium_account.tt +0 -9
  111. data/lib/generators/automation/templates/partials/selenium_login.tt +0 -34
  112. data/lib/generators/automation/templates/partials/watir_account.tt +0 -7
  113. data/lib/generators/automation/templates/partials/watir_login.tt +0 -32
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'template_renderer/partial_cache'
4
+ require_relative 'template_renderer/partial_resolver'
5
+ require_relative 'template_renderer/template_error'
6
+
7
+ # Template rendering module for Ruby Raider generators
8
+ #
9
+ # Provides a clean partial() helper for including ERB templates with:
10
+ # - Automatic caching of compiled ERB objects (10x performance improvement)
11
+ # - Context-aware path resolution (relative to caller, then all source_paths)
12
+ # - Helpful error messages when partials are missing
13
+ # - Flexible whitespace handling (trim_mode, strip options)
14
+ #
15
+ # Usage in templates:
16
+ # <%= partial('screenshot') %> # Default: trim_mode: '-', no strip
17
+ # <%= partial('screenshot', strip: true) %> # With .strip!
18
+ # <%= partial('screenshot', trim: false) %> # No trim_mode
19
+ # <%= partial('driver_config', trim_mode: '<>') %> # Custom trim_mode
20
+ #
21
+ # The partial() method automatically has access to all generator instance
22
+ # variables and methods (cucumber?, mobile?, selenium?, etc.) through binding.
23
+ module TemplateRenderer
24
+ # Render a partial template with caching and smart path resolution
25
+ #
26
+ # @param name [String] Partial name without .tt extension (e.g., 'screenshot')
27
+ # @param options [Hash] Rendering options
28
+ # @option options [String, nil] :trim_mode ERB trim mode (default: '-')
29
+ # - '-' : Trim lines ending with -%>
30
+ # - '<>' : Omit newlines for lines starting with <% and ending with %>
31
+ # - nil : No trimming
32
+ # @option options [Boolean] :strip Whether to call .strip! on result (default: false)
33
+ # @option options [Boolean] :trim Whether to use trim_mode (default: true)
34
+ #
35
+ # @return [String] Rendered template content
36
+ #
37
+ # @example Basic usage
38
+ # <%= partial('screenshot') %>
39
+ #
40
+ # @example With strip
41
+ # <%= partial('screenshot', strip: true) %>
42
+ #
43
+ # @example No trim mode
44
+ # <%= partial('quit_driver', trim: false) %>
45
+ #
46
+ # @raise [TemplateNotFoundError] If partial cannot be found
47
+ # @raise [TemplateRenderError] If rendering fails
48
+ def partial(name, options = {})
49
+ # Default options
50
+ options = {
51
+ trim_mode: '-',
52
+ strip: false,
53
+ trim: true
54
+ }.merge(options)
55
+
56
+ # Handle trim: false by setting trim_mode to nil
57
+ options[:trim_mode] = nil if options[:trim] == false
58
+
59
+ # Render the partial through the cache
60
+ result = self.class.template_renderer.render_partial(name, binding, options)
61
+
62
+ # Apply strip if requested
63
+ options[:strip] ? result.strip : result
64
+ end
65
+
66
+ # Module hook for including in classes
67
+ def self.included(base)
68
+ base.extend(ClassMethods)
69
+ end
70
+
71
+ # Class methods added to the including class
72
+ module ClassMethods
73
+ # Get the shared template renderer instance
74
+ # Each generator class gets its own cache instance
75
+ def template_renderer
76
+ @template_renderer ||= PartialCache.new(self)
77
+ end
78
+
79
+ # Clear the template cache (useful for testing)
80
+ def clear_template_cache
81
+ @template_renderer&.clear
82
+ @template_renderer = nil
83
+ end
84
+
85
+ # Get cache statistics (useful for debugging)
86
+ def template_cache_stats
87
+ @template_renderer&.stats || { size: 0, entries: [], memory_estimate: 0 }
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,5 @@
1
1
  <% if mobile? -%>
2
- <%= ERB.new(File.read(File.expand_path('./partials/mobile_config.tt', __dir__))).result(binding) %>
2
+ <%= partial('mobile_config', trim: false) %>
3
3
  <% else -%>
4
- <%= ERB.new(File.read(File.expand_path('./partials/web_config.tt', __dir__)), trim_mode: '-').result(binding) %>
4
+ <%= partial('web_config') %>
5
5
  <% end -%>
@@ -6,10 +6,16 @@ gem 'appium_lib'
6
6
  gem 'appium_console'
7
7
  <% end %>
8
8
  <%- if cucumber? -%>
9
- gem 'allure-cucumber', '2.23.0'
9
+ gem 'allure-cucumber', '2.28.0'
10
+ <%- elsif minitest? -%>
11
+ gem 'allure-ruby-commons', '2.28.0'
10
12
  <%- else -%>
11
- gem 'allure-rspec', '2.23.0'
12
- gem 'allure-ruby-commons', '2.23.0'
13
+ gem 'allure-rspec', '2.28.0'
14
+ gem 'allure-ruby-commons', '2.28.0'
15
+ <%- end -%>
16
+ <%- if capybara? -%>
17
+ gem 'capybara'
18
+ gem 'selenium-webdriver'
13
19
  <%- end -%>
14
20
  <%- if axe? -%>
15
21
  gem 'axe-core-rspec'
@@ -29,10 +35,16 @@ gem '<%= framework %>'
29
35
  <%- if cucumber? -%>
30
36
  gem 'rspec'
31
37
  <%- end -%>
38
+ <%- if minitest? -%>
39
+ gem 'minitest-reporters'
40
+ <%- end -%>
32
41
  gem 'rubocop'
33
42
  <%- if rspec? -%>
34
43
  gem 'rubocop-rspec'
35
44
  <%- end -%>
45
+ <%- if minitest? -%>
46
+ gem 'rubocop-minitest'
47
+ <%- end -%>
36
48
  gem 'ruby_raider', '~> 1.1.0'
37
49
  <%- if selenium_based? %>
38
50
  gem 'selenium-webdriver'
@@ -1,5 +1,5 @@
1
1
  browser: chrome
2
- url: 'https://automationteststore.com/'
2
+ url: 'https://raider-test-site.onrender.com/'
3
3
 
4
4
  <%- if selenium_based? -%>
5
5
  driver_options:
@@ -34,7 +34,9 @@ Ruby Raider is a generator and scaffolding gem to make UI test automation easier
34
34
  | | | Cucumber and Appium Cross-platform | |
35
35
  | | | Rspec and Appium Cross-platform | |
36
36
 
37
- ***In order to run the Appium tests, download the example [app](https://github.com/saucelabs/my-demo-app-rn).***
37
+ ***The web tests run against the [Raider Test Store](https://raider-test-site.onrender.com/).***
38
+
39
+ ***In order to run the Appium tests, download the example [app](https://github.com/RaiderHQ/raider_test_app).***
38
40
  ***Remember to use the full path of the app that you download in the capabilities file and start the server using one of
39
41
  the commands below:***
40
42
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- <%=- ERB.new(File.read(File.expand_path('./partials/allure_requirements.tt', __dir__))).result(binding).strip! -%>
4
- <%- allure = ERB.new(File.read(File.expand_path('./partials/allure_imports.tt', __dir__))).result(binding).strip! -%>
3
+ <%=- partial('allure_requirements', trim: false, strip: true) -%>
4
+ <%- allure = partial('allure_imports', trim: false, strip: true) -%>
5
5
 
6
6
 
7
7
  module AllureHelper
@@ -17,6 +17,7 @@ module BrowserHelper
17
17
 
18
18
  def create_browser(*args)
19
19
  args = args.empty? ? config['browser_arguments'][config['browser']] : args
20
+ args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
20
21
  Watir::Browser.new(config['browser'], options: { args: args })
21
22
  end
22
23
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capybara'
4
+ require 'capybara/dsl'
5
+ require 'selenium-webdriver'
6
+ require 'yaml'
7
+
8
+ module CapybaraHelper
9
+ def self.configure
10
+ config = YAML.load_file('config/config.yml')
11
+
12
+ Capybara.configure do |capybara_config|
13
+ capybara_config.default_driver = :selenium
14
+ capybara_config.javascript_driver = :selenium
15
+ capybara_config.app_host = config['url']
16
+ capybara_config.default_max_wait_time = 10
17
+ capybara_config.run_server = false
18
+ end
19
+
20
+ Capybara.register_driver :selenium do |app|
21
+ browser = config['browser'].to_sym
22
+ args = config['browser_arguments'][config['browser']] || []
23
+ args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
24
+ options = Selenium::WebDriver::Chrome::Options.new(args:)
25
+ Capybara::Selenium::Driver.new(app, browser:, options:)
26
+ end
27
+ end
28
+ end
@@ -29,5 +29,5 @@ module DriverHelper
29
29
 
30
30
  private
31
31
 
32
- <%= ERB.new(File.read(File.expand_path('./partials/driver_and_options.tt', __dir__)), trim_mode: '-').result(binding).strip! %>
32
+ <%= partial('driver_and_options', strip: true) %>
33
33
  end
@@ -1,5 +1,7 @@
1
1
  <% if rspec? %>
2
2
  AllureRspec
3
- <% else %>
3
+ <% elsif cucumber? %>
4
4
  AllureCucumber
5
+ <% else %>
6
+ Allure
5
7
  <% end %>
@@ -1,6 +1,8 @@
1
1
  <% if cucumber? %>
2
2
  require 'allure-cucumber'
3
- <% else %>
3
+ <% elsif rspec? %>
4
4
  require 'allure-ruby-commons'
5
5
  require 'allure-rspec'
6
+ <% else %>
7
+ require 'allure-ruby-commons'
6
8
  <% end %>
@@ -0,0 +1,46 @@
1
+ def create_driver
2
+ @driver = configure_driver
3
+ end
4
+ <%- if cross_platform? -%>
5
+
6
+ def platform
7
+ @platform ||= YAML.load_file('config/config.yml')['platform'].to_s
8
+ end
9
+
10
+ def platform_caps
11
+ @platform_caps ||= YAML.load_file('config/capabilities.yml')[platform]
12
+ end
13
+
14
+ # :reek:UtilityFunction
15
+ def parsed_caps
16
+ platform_caps['appium:options']['app'] = parse_app_path(platform_caps['appium:options']['app'])
17
+ platform_caps
18
+ end
19
+
20
+ def parse_app_path(path)
21
+ File.expand_path(path, Dir.pwd)
22
+ end
23
+ <%- else -%>
24
+
25
+ # :reek:UtilityFunction
26
+ def parsed_caps
27
+ caps = YAML.load_file('config/capabilities.yml')
28
+ caps['appium:options']['app'] = app_path(caps['appium:options']['app'])
29
+ caps
30
+ end
31
+
32
+ def app_path(path)
33
+ File.expand_path(path, Dir.pwd)
34
+ end
35
+ <%- end -%>
36
+
37
+ <%= partial('browserstack_config', strip: true) %>
38
+
39
+ def configure_driver
40
+ if browserstack?
41
+ Appium::Driver.new({ caps: browserstack_caps,
42
+ 'appium_lib': { server_url: parsed_browserstack_url}}, true)
43
+ else
44
+ Appium::Driver.new({ caps: parsed_caps })
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ def create_driver(browser, js_path, skip_iframes)
2
+ if ENV['HEADLESS']
3
+ options = Selenium::WebDriver::Chrome::Options.new(args: ['--headless'])
4
+ @driver = Selenium::WebDriver.for(browser, options:)
5
+ end
6
+ AxeSelenium.configure(@driver || browser) do |config|
7
+ config.jslib_path = js_path if js_path
8
+ config.skip_iframes = skip_iframes if skip_iframes
9
+ end.page
10
+ end
@@ -0,0 +1,13 @@
1
+ def browserstack?
2
+ ENV['TEST_ENV'] == 'browserstack'
3
+ end
4
+
5
+ def browserstack_caps
6
+ @browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
7
+ end
8
+
9
+ def parsed_browserstack_url
10
+ username = ENV['BROWSERSTACK_USER']
11
+ access_key = ENV['BROWSERSTACK_KEY']
12
+ "https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
13
+ end
@@ -1,115 +1,7 @@
1
1
  <% if axe? -%>
2
- def create_driver(browser, js_path, skip_iframes)
3
- AxeSelenium.configure(browser) do |config|
4
- config.jslib_path = js_path if js_path
5
- config.skip_iframes = skip_iframes if skip_iframes
6
- end.page
7
- end
8
- <% elsif selenium_based? -%>
9
- def create_driver(*opts)
10
- @config = YAML.load_file('config/config.yml')
11
- browser = @config['browser']
12
- Selenium::WebDriver.for(browser.to_sym, options: create_webdriver_options(*opts))
13
- end
14
-
15
- def browser_arguments(*opts)
16
- opts.empty? ? @config['browser_arguments'][@config['browser']] : opts
17
- end
18
-
19
- def driver_options
20
- @config['driver_options']
21
- end
22
-
23
- # :reek:FeatureEnvy
24
- def create_webdriver_options(*opts)
25
- load_browser = @config['browser'].to_s
26
- browser = load_browser == 'ie' ? load_browser.upcase : load_browser.capitalize
27
- options = "Selenium::WebDriver::#{browser}::Options".constantize.new
28
- browser_arguments(*opts).each { |arg| options.add_argument(arg) }
29
- driver_options.each { |opt| options.add_option(opt.first, opt.last) }
30
- options
31
- end
32
- <% elsif cross_platform? -%>
33
- def create_driver
34
- @driver = configure_driver
35
- end
36
-
37
- def platform
38
- @platform ||= YAML.load_file('config/config.yml')['platform'].to_s
39
- end
40
-
41
- def platform_caps
42
- @platform_caps ||= YAML.load_file('config/capabilities.yml')[platform]
43
- end
44
-
45
- # :reek:UtilityFunction
46
- def parsed_caps
47
- platform_caps['appium:options']['app'] = parse_app_path(platform_caps['appium:options']['app'])
48
- platform_caps
49
- end
50
-
51
- def parse_app_path(path)
52
- File.expand_path(path, Dir.pwd)
53
- end
54
-
55
- def browserstack?
56
- ENV['TEST_ENV'] == 'browserstack'
57
- end
58
-
59
- def browserstack_caps
60
- @browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
61
- end
62
-
63
- def configure_driver
64
- if browserstack?
65
- Appium::Driver.new({ caps: browserstack_caps,
66
- 'appium_lib': { server_url: parsed_browserstack_url}}, true)
67
- else
68
- Appium::Driver.new({ caps: parsed_caps })
69
- end
70
- end
71
-
72
- def parsed_browserstack_url
73
- username = ENV['BROWSERSTACK_USER']
74
- access_key = ENV['BROWSERSTACK_KEY']
75
- "https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
76
- end
77
- <% else -%>
78
- def create_driver
79
- @driver = configure_driver
80
- end
81
-
82
- # :reek:UtilityFunction
83
- def parsed_caps
84
- caps = YAML.load_file('config/capabilities.yml')
85
- caps['appium:options']['app'] = app_path(caps['appium:options']['app'])
86
- caps
87
- end
88
-
89
- def app_path(path)
90
- File.expand_path(path, Dir.pwd)
91
- end
92
-
93
- def browserstack?
94
- ENV['TEST_ENV'] == 'browserstack'
95
- end
96
-
97
- def browserstack_caps
98
- @browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
99
- end
100
-
101
- def configure_driver
102
- if browserstack?
103
- Appium::Driver.new({ caps: browserstack_caps,
104
- 'appium_lib': { server_url: parsed_browserstack_url}}, true)
105
- else
106
- Appium::Driver.new({ caps: parsed_caps })
107
- end
108
- end
109
-
110
- def parsed_browserstack_url
111
- username = ENV['BROWSERSTACK_USER']
112
- access_key = ENV['BROWSERSTACK_KEY']
113
- "https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
114
- end
115
- <% end -%>
2
+ <%= partial('axe_driver', strip: true) %>
3
+ <%- elsif selenium_based? -%>
4
+ <%= partial('selenium_driver', strip: true) %>
5
+ <%- else -%>
6
+ <%= partial('appium_driver', strip: true) %>
7
+ <%- end -%>
@@ -1,4 +1,6 @@
1
- <% if selenium_based? %>
1
+ <% if capybara? %>
2
+ Capybara.reset_sessions!
3
+ <% elsif selenium_based? %>
2
4
  driver.quit
3
5
  <% elsif watir? %>
4
6
  browser.quit
@@ -1,4 +1,6 @@
1
- <% if selenium_based? %>
1
+ <% if capybara? %>
2
+ screenshot = Capybara.page.save_screenshot("#{temp_folder}/#{example_name}.png")
3
+ <% elsif selenium_based? %>
2
4
  screenshot = driver.save_screenshot("#{temp_folder}/#{example_name}.png")
3
5
  <% elsif watir? %>
4
6
  screenshot = browser.screenshot.save("#{temp_folder}/#{example_name}.png")
@@ -0,0 +1,25 @@
1
+ def create_driver(*opts)
2
+ @config = YAML.load_file('config/config.yml')
3
+ browser = @config['browser']
4
+ Selenium::WebDriver.for(browser.to_sym, options: create_webdriver_options(*opts))
5
+ end
6
+
7
+ def browser_arguments(*opts)
8
+ args = opts.empty? ? @config['browser_arguments'][@config['browser']] : opts
9
+ args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
10
+ args
11
+ end
12
+
13
+ def driver_options
14
+ @config['driver_options']
15
+ end
16
+
17
+ # :reek:FeatureEnvy
18
+ def create_webdriver_options(*opts)
19
+ load_browser = @config['browser'].to_s
20
+ browser = load_browser == 'ie' ? load_browser.upcase : load_browser.capitalize
21
+ options = "Selenium::WebDriver::#{browser}::Options".constantize.new
22
+ browser_arguments(*opts).each { |arg| options.add_argument(arg) }
23
+ driver_options.each { |opt| options.add_option(opt.first, opt.last) }
24
+ options
25
+ end
@@ -6,7 +6,9 @@ require 'axe-rspec'
6
6
  require 'rspec'
7
7
  require 'tmpdir'
8
8
  require_relative 'allure_helper'
9
- <%- if watir? -%>
9
+ <%- if capybara? -%>
10
+ require_relative 'capybara_helper'
11
+ <%- elsif watir? -%>
10
12
  require_relative 'browser_helper'
11
13
  <%- else -%>
12
14
  require_relative 'driver_helper'
@@ -17,11 +19,22 @@ module SpecHelper
17
19
  AllureHelper.configure
18
20
  RSpec.configure do |config|
19
21
  config.formatter = AllureHelper.formatter
20
- <% if watir? %>config.include(BrowserHelper)<% else %>config.include(DriverHelper)<% end %>
22
+ <%- if capybara? -%>
23
+ config.include(Capybara::DSL)
24
+ CapybaraHelper.configure
25
+ <%- elsif watir? -%>
26
+ config.include(BrowserHelper)
27
+ <%- else -%>
28
+ config.include(DriverHelper)
29
+ <%- end -%>
21
30
  <%- if mobile? -%>
22
31
  config.before(:each) do
23
32
  driver.start_driver
24
33
  end
34
+ <%- elsif capybara? -%>
35
+ config.before(:each) do
36
+ Capybara.current_session.driver.browser.manage.window.maximize
37
+ end
25
38
  <%- elsif selenium_based? -%>
26
39
  config.before(:each) do
27
40
  driver.manage.window.maximize
@@ -35,10 +48,10 @@ module SpecHelper
35
48
  config.after(:each) do |example|
36
49
  example_name = example.description
37
50
  Dir.mktmpdir do |temp_folder|
38
- <%= ERB.new(File.read(File.expand_path('./partials/screenshot.tt', __dir__)), trim_mode: '-').result(binding).strip! %>
51
+ <%= partial('screenshot', strip: true) %>
39
52
  AllureHelper.add_screenshot(example_name, screenshot)
40
53
  end
41
- <%= ERB.new(File.read(File.expand_path('./partials/quit_driver.tt', __dir__)), trim_mode: '-').result(binding).strip! %>
54
+ <%= partial('quit_driver', strip: true) %>
42
55
  end
43
56
  end
44
57
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ <%- if axe? %>
4
+ require 'axe-minitest'
5
+ <%- end -%>
6
+ require 'minitest/autorun'
7
+ require 'tmpdir'
8
+ require_relative 'allure_helper'
9
+ <%- if watir? -%>
10
+ require_relative 'browser_helper'
11
+ <%- elsif capybara? -%>
12
+ require_relative 'capybara_helper'
13
+ <%- else -%>
14
+ require_relative 'driver_helper'
15
+ <%- end -%>
16
+
17
+ AllureHelper.configure
18
+ <%- if capybara? -%>
19
+ CapybaraHelper.configure
20
+ <%- end -%>
21
+
22
+ module TestHelper
23
+ <% if watir? %>include BrowserHelper<% elsif capybara? %>include Capybara::DSL<% else %>include DriverHelper<% end %>
24
+ end
25
+
26
+ Minitest::Test.include(TestHelper)
@@ -22,7 +22,7 @@ module SpecHelper
22
22
  config.after(:each) do |example|
23
23
  example_name = example.description
24
24
  Dir.mktmpdir do |temp_folder|
25
- <%= ERB.new(File.read(File.expand_path('./partials/screenshot.tt', __dir__)), trim_mode: '-').result(binding).strip! %>
25
+ <%= partial('screenshot', strip: true) %>
26
26
  AllureHelper.add_screenshot(example_name, screenshot)
27
27
  end
28
28
  @eyes.close
data/lib/ruby_raider.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative '../lib/plugin/plugin'
4
4
  require_relative '../lib/commands/plugin_commands'
5
5
  require_relative '../lib/commands/loaded_commands'
6
+ require_relative '../lib/commands/adopt_commands'
6
7
  require_relative '../lib/commands/scaffolding_commands'
7
8
  require_relative '../lib/commands/utility_commands'
8
9
 
@@ -45,6 +46,10 @@ module RubyRaider
45
46
 
46
47
  map 'v' => 'version'
47
48
 
49
+ desc 'adopt', 'Adopts an existing test project into Ruby Raider conventions'
50
+ subcommand 'adopt', AdoptCommands
51
+ map 'a' => 'adopt'
52
+
48
53
  desc 'generate', 'Provides access to all the scaffolding commands'
49
54
  subcommand 'generate', ScaffoldingCommands
50
55
  map 'g' => 'generate'
data/lib/version CHANGED
@@ -1 +1 @@
1
- 1.1.4
1
+ 2.0.0