ruby_raider 2.0.0 → 3.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.
- checksums.yaml +4 -4
- data/.github/workflows/e2e_tests.yml +58 -0
- data/.github/workflows/steep.yml +21 -0
- data/.gitignore +1 -1
- data/.reek.yml +46 -4
- data/.ruby-version +1 -1
- data/README.md +138 -77
- data/Steepfile +22 -0
- data/assets/ruby_raider_logo.svg +51 -0
- data/lib/adopter/adopt_menu.rb +11 -15
- data/lib/adopter/converters/base_converter.rb +1 -2
- data/lib/adopter/converters/identity_converter.rb +3 -6
- data/lib/adopter/migration_plan.rb +0 -1
- data/lib/adopter/plan_builder.rb +2 -5
- data/lib/adopter/project_analyzer.rb +1 -5
- data/lib/adopter/project_detector.rb +3 -5
- data/lib/commands/adopt_commands.rb +0 -1
- data/lib/commands/plugin_commands.rb +0 -2
- data/lib/commands/scaffolding_commands.rb +220 -37
- data/lib/commands/utility_commands.rb +82 -2
- data/lib/generators/automation/automation_generator.rb +0 -7
- data/lib/generators/automation/templates/partials/element.tt +1 -1
- data/lib/generators/automation/templates/partials/initialize_selector.tt +0 -7
- data/lib/generators/automation/templates/partials/url_methods.tt +0 -1
- data/lib/generators/common_generator.rb +12 -0
- data/lib/generators/cucumber/cucumber_generator.rb +36 -0
- data/lib/generators/cucumber/templates/accessibility_feature.tt +5 -0
- data/lib/generators/cucumber/templates/accessibility_steps.tt +21 -0
- data/lib/generators/cucumber/templates/cucumber.tt +8 -1
- data/lib/generators/cucumber/templates/feature.tt +0 -4
- data/lib/generators/cucumber/templates/partials/appium_env.tt +5 -0
- data/lib/generators/cucumber/templates/partials/capybara_env.tt +19 -1
- data/lib/generators/cucumber/templates/partials/driver_world.tt +1 -4
- data/lib/generators/cucumber/templates/partials/selenium_env.tt +22 -35
- data/lib/generators/cucumber/templates/partials/watir_env.tt +20 -1
- data/lib/generators/cucumber/templates/partials/web_steps.tt +6 -12
- data/lib/generators/cucumber/templates/performance_feature.tt +5 -0
- data/lib/generators/cucumber/templates/performance_steps.tt +17 -0
- data/lib/generators/cucumber/templates/visual_feature.tt +5 -0
- data/lib/generators/cucumber/templates/visual_steps.tt +19 -0
- data/lib/generators/generator.rb +38 -7
- data/lib/generators/helper_generator.rb +24 -7
- data/lib/generators/infrastructure/templates/github.tt +1 -1
- data/lib/generators/infrastructure/templates/github_appium.tt +2 -2
- data/lib/generators/infrastructure/templates/gitlab.tt +1 -1
- data/lib/generators/invoke_generators.rb +42 -9
- data/lib/generators/menu_generator.rb +120 -11
- data/lib/generators/minitest/minitest_generator.rb +16 -4
- data/lib/generators/minitest/templates/accessibility_test.tt +26 -0
- data/lib/generators/minitest/templates/performance_test.tt +18 -0
- data/lib/generators/minitest/templates/test.tt +5 -34
- data/lib/generators/minitest/templates/visual_test.tt +23 -0
- data/lib/generators/rspec/rspec_generator.rb +16 -4
- data/lib/generators/rspec/templates/accessibility_spec.tt +25 -0
- data/lib/generators/rspec/templates/performance_spec.tt +18 -0
- data/lib/generators/rspec/templates/spec.tt +5 -35
- data/lib/generators/rspec/templates/visual_spec.tt +20 -0
- data/lib/generators/template_renderer/partial_cache.rb +11 -1
- data/lib/generators/template_renderer/partial_resolver.rb +17 -10
- data/lib/generators/template_renderer.rb +17 -1
- data/lib/generators/templates/common/gemfile.tt +21 -6
- data/lib/generators/templates/common/git_ignore.tt +6 -1
- data/lib/generators/templates/common/partials/mobile_config.tt +5 -1
- data/lib/generators/templates/common/partials/web_config.tt +16 -7
- data/lib/generators/templates/common/rakefile.tt +36 -0
- data/lib/generators/templates/common/read_me.tt +41 -91
- data/lib/generators/templates/common/rspec.tt +3 -0
- data/lib/generators/templates/common/ruby_version.tt +1 -0
- data/lib/generators/templates/helpers/allure_helper.tt +11 -0
- data/lib/generators/templates/helpers/browser_helper.tt +12 -2
- data/lib/generators/templates/helpers/capybara_helper.tt +5 -1
- data/lib/generators/templates/helpers/debug_helper.tt +190 -0
- data/lib/generators/templates/helpers/driver_helper.tt +2 -10
- data/lib/generators/templates/helpers/partials/appium_driver.tt +0 -2
- data/lib/generators/templates/helpers/partials/debug_diagnostics.tt +7 -0
- data/lib/generators/templates/helpers/partials/debug_start.tt +7 -0
- data/lib/generators/templates/helpers/partials/driver_and_options.tt +1 -3
- data/lib/generators/templates/helpers/partials/selenium_driver.tt +8 -7
- data/lib/generators/templates/helpers/partials/video_start.tt +9 -0
- data/lib/generators/templates/helpers/partials/video_stop.tt +4 -0
- data/lib/generators/templates/helpers/performance_helper.tt +57 -0
- data/lib/generators/templates/helpers/spec_helper.tt +57 -8
- data/lib/generators/templates/helpers/test_helper.tt +69 -1
- data/lib/generators/templates/helpers/video_helper.tt +270 -0
- data/lib/generators/templates/helpers/visual_helper.tt +39 -46
- data/lib/llm/client.rb +79 -0
- data/lib/llm/config.rb +57 -0
- data/lib/llm/prompts.rb +84 -0
- data/lib/llm/provider.rb +27 -0
- data/lib/llm/providers/anthropic_provider.rb +43 -0
- data/lib/llm/providers/ollama_provider.rb +56 -0
- data/lib/llm/providers/openai_provider.rb +42 -0
- data/lib/llm/response_parser.rb +67 -0
- data/lib/plugin/plugin.rb +22 -20
- data/lib/plugin/plugin_exposer.rb +16 -38
- data/lib/ruby_raider.rb +47 -12
- data/lib/scaffolding/crud_generator.rb +94 -0
- data/lib/scaffolding/dry_run_presenter.rb +16 -0
- data/lib/scaffolding/name_normalizer.rb +63 -0
- data/lib/scaffolding/page_introspector.rb +45 -0
- data/lib/scaffolding/project_detector.rb +72 -0
- data/lib/scaffolding/scaffold_menu.rb +103 -0
- data/lib/scaffolding/scaffolding.rb +158 -11
- data/lib/scaffolding/templates/component.tt +30 -0
- data/lib/scaffolding/templates/feature.tt +4 -4
- data/lib/scaffolding/templates/helper.tt +15 -1
- data/lib/scaffolding/templates/page_from_url.tt +75 -0
- data/lib/scaffolding/templates/page_object.tt +50 -1
- data/lib/scaffolding/templates/spec.tt +33 -2
- data/lib/scaffolding/templates/spec_from_page.tt +31 -0
- data/lib/scaffolding/templates/spec_from_url.tt +46 -0
- data/lib/scaffolding/templates/steps.tt +17 -5
- data/lib/scaffolding/url_analyzer.rb +179 -0
- data/lib/utilities/desktop_downloader.rb +177 -0
- data/lib/utilities/logo.rb +83 -0
- data/lib/utilities/utilities.rb +53 -20
- data/lib/version +1 -1
- data/ruby_raider.gemspec +1 -0
- data/sig/adopter/adopt_menu.rbs +25 -0
- data/sig/adopter/converters/base_converter.rbs +23 -0
- data/sig/adopter/converters/identity_converter.rbs +16 -0
- data/sig/adopter/migration_plan.rbs +34 -0
- data/sig/adopter/migrator.rbs +21 -0
- data/sig/adopter/plan_builder.rbs +38 -0
- data/sig/adopter/project_analyzer.rbs +39 -0
- data/sig/adopter/project_detector.rbs +26 -0
- data/sig/commands/adopt_commands.rbs +8 -0
- data/sig/commands/loaded_commands.rbs +5 -0
- data/sig/commands/plugin_commands.rbs +9 -0
- data/sig/commands/scaffolding_commands.rbs +28 -0
- data/sig/commands/utility_commands.rbs +21 -0
- data/sig/generators/automation/automation_generator.rbs +20 -0
- data/sig/generators/common_generator.rbs +12 -0
- data/sig/generators/cucumber/cucumber_generator.rbs +16 -0
- data/sig/generators/generator.rbs +40 -0
- data/sig/generators/helper_generator.rbs +18 -0
- data/sig/generators/infrastructure/github_generator.rbs +5 -0
- data/sig/generators/infrastructure/gitlab_generator.rbs +4 -0
- data/sig/generators/invoke_generators.rbs +10 -0
- data/sig/generators/menu_generator.rbs +29 -0
- data/sig/generators/minitest/minitest_generator.rbs +8 -0
- data/sig/generators/rspec/rspec_generator.rbs +8 -0
- data/sig/generators/template_renderer/partial_cache.rbs +20 -0
- data/sig/generators/template_renderer/partial_resolver.rbs +20 -0
- data/sig/generators/template_renderer/template_error.rbs +19 -0
- data/sig/generators/template_renderer.rbs +10 -0
- data/sig/llm/client.rbs +15 -0
- data/sig/llm/config.rbs +20 -0
- data/sig/llm/prompts.rbs +8 -0
- data/sig/llm/provider.rbs +12 -0
- data/sig/llm/providers/anthropic_provider.rbs +16 -0
- data/sig/llm/providers/ollama_provider.rbs +18 -0
- data/sig/llm/providers/openai_provider.rbs +16 -0
- data/sig/llm/response_parser.rbs +13 -0
- data/sig/plugin/plugin.rbs +24 -0
- data/sig/plugin/plugin_exposer.rbs +20 -0
- data/sig/ruby_raider.rbs +15 -0
- data/sig/scaffolding/crud_generator.rbs +16 -0
- data/sig/scaffolding/dry_run_presenter.rbs +4 -0
- data/sig/scaffolding/name_normalizer.rbs +17 -0
- data/sig/scaffolding/page_introspector.rbs +14 -0
- data/sig/scaffolding/project_detector.rbs +14 -0
- data/sig/scaffolding/scaffold_menu.rbs +18 -0
- data/sig/scaffolding/scaffolding.rbs +55 -0
- data/sig/scaffolding/url_analyzer.rbs +28 -0
- data/sig/utilities/desktop_downloader.rbs +23 -0
- data/sig/utilities/logger.rbs +13 -0
- data/sig/utilities/logo.rbs +16 -0
- data/sig/utilities/utilities.rbs +30 -0
- data/sig/vendor/thor.rbs +34 -0
- data/sig/vendor/tty_prompt.rbs +15 -0
- data/spec/adopter/adopt_menu_spec.rb +12 -12
- data/spec/adopter/migration_plan_spec.rb +1 -1
- data/spec/adopter/migrator_spec.rb +2 -2
- data/spec/adopter/project_detector_spec.rb +1 -1
- data/spec/commands/raider_commands_spec.rb +129 -0
- data/spec/generators/generator_spec.rb +23 -0
- data/spec/integration/commands/scaffolding_commands_spec.rb +1 -1
- data/spec/integration/commands/utility_commands_spec.rb +23 -3
- data/spec/integration/content/ci_content_spec.rb +119 -0
- data/spec/integration/content/common_content_spec.rb +288 -0
- data/spec/integration/content/config_content_spec.rb +175 -0
- data/spec/integration/content/content_helper.rb +32 -0
- data/spec/integration/content/gemfile_content_spec.rb +209 -0
- data/spec/integration/content/helper_content_spec.rb +485 -0
- data/spec/integration/content/page_content_spec.rb +259 -0
- data/spec/integration/content/reporter_content_spec.rb +236 -0
- data/spec/integration/content/skip_flags_content_spec.rb +206 -0
- data/spec/integration/content/syntax_validation_spec.rb +30 -0
- data/spec/integration/content/test_content_spec.rb +266 -0
- data/spec/integration/end_to_end_features_spec.rb +690 -0
- data/spec/integration/end_to_end_spec.rb +52 -16
- data/spec/integration/generators/automation_generator_spec.rb +0 -12
- data/spec/integration/generators/axe_addon_spec.rb +150 -0
- data/spec/integration/generators/common_generator_spec.rb +12 -13
- data/spec/integration/generators/config_features_spec.rb +155 -0
- data/spec/integration/generators/debug_helper_spec.rb +68 -0
- data/spec/integration/generators/helpers_generator_spec.rb +0 -12
- data/spec/integration/generators/lighthouse_addon_spec.rb +132 -0
- data/spec/integration/generators/minitest_generator_spec.rb +0 -6
- data/spec/integration/generators/reporter_spec.rb +159 -0
- data/spec/integration/generators/skip_flags_spec.rb +134 -0
- data/spec/integration/generators/visual_addon_spec.rb +148 -0
- data/spec/integration/settings_helper.rb +0 -3
- data/spec/integration/spec_helper.rb +30 -13
- data/spec/llm/client_spec.rb +79 -0
- data/spec/llm/config_spec.rb +92 -0
- data/spec/llm/prompts_spec.rb +49 -0
- data/spec/llm/response_parser_spec.rb +92 -0
- data/spec/menus/adopter_adopt_menu_spec.rb +97 -0
- data/spec/menus/menu_generator_spec.rb +263 -0
- data/spec/scaffolding/name_normalizer_spec.rb +113 -0
- data/spec/scaffolding/page_introspector_spec.rb +82 -0
- data/spec/scaffolding/scaffold_project_detector_spec.rb +104 -0
- data/spec/scaffolding/scaffolding_features_spec.rb +311 -0
- data/spec/scaffolding/url_analyzer_spec.rb +110 -0
- data/spec/system/adopt_matrix_spec.rb +537 -0
- data/spec/system/adopt_spec.rb +225 -0
- data/spec/system/support/system_test_helper.rb +0 -2
- data/spec/utilities/desktop_downloader_spec.rb +92 -0
- metadata +150 -5
- data/lib/generators/automation/templates/visual_options.tt +0 -16
- data/lib/generators/templates/helpers/partials/axe_driver.tt +0 -10
- data/lib/generators/templates/helpers/visual_spec_helper.tt +0 -35
|
@@ -186,10 +186,6 @@ describe 'End-to-End Project Generation and Execution' do
|
|
|
186
186
|
include_examples 'executable cucumber project', 'cucumber_capybara'
|
|
187
187
|
end
|
|
188
188
|
|
|
189
|
-
describe 'Axe + Cucumber' do
|
|
190
|
-
include_examples 'executable cucumber project', 'cucumber_axe'
|
|
191
|
-
end
|
|
192
|
-
|
|
193
189
|
describe 'Selenium + Minitest' do
|
|
194
190
|
include_examples 'executable minitest project', 'minitest_selenium'
|
|
195
191
|
end
|
|
@@ -218,6 +214,32 @@ describe 'End-to-End Project Generation and Execution' do
|
|
|
218
214
|
end
|
|
219
215
|
end
|
|
220
216
|
|
|
217
|
+
describe 'iOS + Cucumber' do
|
|
218
|
+
it 'generates valid project structure' do
|
|
219
|
+
expect(File).to exist('cucumber_ios/features/support/env.rb')
|
|
220
|
+
expect(File).to exist('cucumber_ios/Gemfile')
|
|
221
|
+
expect(File).to exist('cucumber_ios/features')
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it 'has valid Ruby syntax in generated files' do
|
|
225
|
+
result = run_in_project('cucumber_ios', 'ruby -c features/support/env.rb')
|
|
226
|
+
expect(result[:success]).to be true
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe 'Android + RSpec' do
|
|
231
|
+
it 'generates valid project structure' do
|
|
232
|
+
expect(File).to exist('rspec_android/helpers/spec_helper.rb')
|
|
233
|
+
expect(File).to exist('rspec_android/Gemfile')
|
|
234
|
+
expect(File).to exist('rspec_android/spec')
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it 'has valid Ruby syntax in generated files' do
|
|
238
|
+
result = run_in_project('rspec_android', 'ruby -c helpers/spec_helper.rb')
|
|
239
|
+
expect(result[:success]).to be true
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
221
243
|
describe 'Android + Cucumber' do
|
|
222
244
|
it 'generates valid project structure' do
|
|
223
245
|
expect(File).to exist('cucumber_android/features/support/env.rb')
|
|
@@ -235,6 +257,25 @@ describe 'End-to-End Project Generation and Execution' do
|
|
|
235
257
|
it 'generates valid project structure' do
|
|
236
258
|
expect(File).to exist('rspec_cross_platform/helpers/appium_helper.rb')
|
|
237
259
|
expect(File).to exist('rspec_cross_platform/Gemfile')
|
|
260
|
+
expect(File).to exist('rspec_cross_platform/spec')
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it 'has valid Ruby syntax in generated files' do
|
|
264
|
+
result = run_in_project('rspec_cross_platform', 'ruby -c helpers/spec_helper.rb')
|
|
265
|
+
expect(result[:success]).to be true
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
describe 'Cross-Platform + Cucumber' do
|
|
270
|
+
it 'generates valid project structure' do
|
|
271
|
+
expect(File).to exist('cucumber_cross_platform/helpers/appium_helper.rb')
|
|
272
|
+
expect(File).to exist('cucumber_cross_platform/Gemfile')
|
|
273
|
+
expect(File).to exist('cucumber_cross_platform/features')
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it 'has valid Ruby syntax in generated files' do
|
|
277
|
+
result = run_in_project('cucumber_cross_platform', 'ruby -c features/support/env.rb')
|
|
278
|
+
expect(result[:success]).to be true
|
|
238
279
|
end
|
|
239
280
|
end
|
|
240
281
|
end
|
|
@@ -265,22 +306,17 @@ describe 'End-to-End Project Generation and Execution' do
|
|
|
265
306
|
expect(result[:success]).to be true
|
|
266
307
|
end
|
|
267
308
|
end
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
context 'Visual Testing Frameworks (structure validation only)' do
|
|
271
|
-
describe 'Applitools + RSpec' do
|
|
272
|
-
it 'generates valid project structure with visual helper' do
|
|
273
|
-
expect(File).to exist('rspec_applitools/helpers/visual_helper.rb')
|
|
274
|
-
expect(File).to exist('rspec_applitools/helpers/spec_helper.rb')
|
|
275
|
-
end
|
|
276
309
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
expect(
|
|
310
|
+
describe 'Cross-Platform + Minitest' do
|
|
311
|
+
it 'generates valid project structure' do
|
|
312
|
+
expect(File).to exist('minitest_cross_platform/helpers/test_helper.rb')
|
|
313
|
+
expect(File).to exist('minitest_cross_platform/helpers/appium_helper.rb')
|
|
314
|
+
expect(File).to exist('minitest_cross_platform/Gemfile')
|
|
315
|
+
expect(File).to exist('minitest_cross_platform/test')
|
|
280
316
|
end
|
|
281
317
|
|
|
282
318
|
it 'has valid Ruby syntax in generated files' do
|
|
283
|
-
result = run_in_project('
|
|
319
|
+
result = run_in_project('minitest_cross_platform', 'ruby -c helpers/test_helper.rb')
|
|
284
320
|
expect(result[:success]).to be true
|
|
285
321
|
end
|
|
286
322
|
end
|
|
@@ -36,19 +36,8 @@ describe AutomationGenerator do
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
shared_examples 'creates web visual framework' do |name|
|
|
40
|
-
it 'creates a login page file' do
|
|
41
|
-
expect(File).to exist("#{name}/page_objects/pages/login.rb")
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it 'creates an abstract page file' do
|
|
45
|
-
expect(File).to exist("#{name}/page_objects/abstract/page.rb")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
39
|
context 'with rspec and selenium' do
|
|
50
40
|
include_examples 'creates web automation framework', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
51
|
-
include_examples 'creates web visual framework', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
52
41
|
end
|
|
53
42
|
|
|
54
43
|
context 'with rspec and watir' do
|
|
@@ -57,7 +46,6 @@ describe AutomationGenerator do
|
|
|
57
46
|
|
|
58
47
|
context 'with cucumber and selenium' do
|
|
59
48
|
include_examples 'creates web automation framework', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
60
|
-
include_examples 'creates web visual framework', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::APPLITOOLS}"
|
|
61
49
|
end
|
|
62
50
|
|
|
63
51
|
context 'with cucumber and watir' do
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require_relative '../../../lib/generators/invoke_generators'
|
|
5
|
+
require_relative '../settings_helper'
|
|
6
|
+
|
|
7
|
+
describe 'Axe accessibility addon generation' do
|
|
8
|
+
include InvokeGenerators
|
|
9
|
+
include SettingsHelper
|
|
10
|
+
|
|
11
|
+
# rubocop:disable RSpec/BeforeAfterAll, RSpec/InstanceVariable
|
|
12
|
+
before(:all) do
|
|
13
|
+
@axe_projects = []
|
|
14
|
+
%w[rspec cucumber minitest].each do |framework|
|
|
15
|
+
%w[selenium watir capybara].each do |automation|
|
|
16
|
+
name = "axe_#{framework}_#{automation}"
|
|
17
|
+
@axe_projects << name
|
|
18
|
+
InvokeGenerators.generate_framework(
|
|
19
|
+
automation:, framework:, name:, accessibility: true
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
after(:all) do
|
|
26
|
+
@axe_projects.each { |name| FileUtils.rm_rf(name) }
|
|
27
|
+
end
|
|
28
|
+
# rubocop:enable RSpec/BeforeAfterAll, RSpec/InstanceVariable
|
|
29
|
+
|
|
30
|
+
context 'with rspec and selenium' do
|
|
31
|
+
let(:name) { 'axe_rspec_selenium' }
|
|
32
|
+
|
|
33
|
+
it 'creates accessibility_spec.rb' do
|
|
34
|
+
expect(File).to exist("#{name}/spec/accessibility_spec.rb")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'includes axe gems in Gemfile' do
|
|
38
|
+
gemfile = File.read("#{name}/Gemfile")
|
|
39
|
+
expect(gemfile).to include('axe')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'accessibility spec has valid Ruby syntax' do
|
|
43
|
+
content = File.read("#{name}/spec/accessibility_spec.rb")
|
|
44
|
+
expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'with cucumber and selenium' do
|
|
49
|
+
let(:name) { 'axe_cucumber_selenium' }
|
|
50
|
+
|
|
51
|
+
it 'creates accessibility.feature' do
|
|
52
|
+
expect(File).to exist("#{name}/features/accessibility.feature")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'creates accessibility_steps.rb' do
|
|
56
|
+
expect(File).to exist("#{name}/features/step_definitions/accessibility_steps.rb")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'includes axe gems in Gemfile' do
|
|
60
|
+
gemfile = File.read("#{name}/Gemfile")
|
|
61
|
+
expect(gemfile).to include('axe')
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'with minitest and selenium' do
|
|
66
|
+
let(:name) { 'axe_minitest_selenium' }
|
|
67
|
+
|
|
68
|
+
it 'creates test_accessibility.rb' do
|
|
69
|
+
expect(File).to exist("#{name}/test/test_accessibility.rb")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'includes axe gems in Gemfile' do
|
|
73
|
+
gemfile = File.read("#{name}/Gemfile")
|
|
74
|
+
expect(gemfile).to include('axe')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'accessibility test has valid Ruby syntax' do
|
|
78
|
+
content = File.read("#{name}/test/test_accessibility.rb")
|
|
79
|
+
expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'with rspec and watir' do
|
|
84
|
+
let(:name) { 'axe_rspec_watir' }
|
|
85
|
+
|
|
86
|
+
it 'creates accessibility_spec.rb' do
|
|
87
|
+
expect(File).to exist("#{name}/spec/accessibility_spec.rb")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'with rspec and capybara' do
|
|
92
|
+
let(:name) { 'axe_rspec_capybara' }
|
|
93
|
+
|
|
94
|
+
it 'creates accessibility_spec.rb' do
|
|
95
|
+
expect(File).to exist("#{name}/spec/accessibility_spec.rb")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context 'with cucumber and watir' do
|
|
100
|
+
let(:name) { 'axe_cucumber_watir' }
|
|
101
|
+
|
|
102
|
+
it 'creates accessibility.feature' do
|
|
103
|
+
expect(File).to exist("#{name}/features/accessibility.feature")
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'with cucumber and capybara' do
|
|
108
|
+
let(:name) { 'axe_cucumber_capybara' }
|
|
109
|
+
|
|
110
|
+
it 'creates accessibility.feature' do
|
|
111
|
+
expect(File).to exist("#{name}/features/accessibility.feature")
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'with minitest and watir' do
|
|
116
|
+
let(:name) { 'axe_minitest_watir' }
|
|
117
|
+
|
|
118
|
+
it 'creates test_accessibility.rb' do
|
|
119
|
+
expect(File).to exist("#{name}/test/test_accessibility.rb")
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context 'with minitest and capybara' do
|
|
124
|
+
let(:name) { 'axe_minitest_capybara' }
|
|
125
|
+
|
|
126
|
+
it 'creates test_accessibility.rb' do
|
|
127
|
+
expect(File).to exist("#{name}/test/test_accessibility.rb")
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context 'without accessibility flag' do
|
|
132
|
+
let(:name) { 'no_axe_rspec_selenium' }
|
|
133
|
+
|
|
134
|
+
# rubocop:disable RSpec/BeforeAfterAll
|
|
135
|
+
before(:all) do
|
|
136
|
+
InvokeGenerators.generate_framework(
|
|
137
|
+
automation: 'selenium', framework: 'rspec', name: 'no_axe_rspec_selenium'
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
after(:all) do
|
|
142
|
+
FileUtils.rm_rf('no_axe_rspec_selenium')
|
|
143
|
+
end
|
|
144
|
+
# rubocop:enable RSpec/BeforeAfterAll
|
|
145
|
+
|
|
146
|
+
it 'does not create accessibility_spec.rb' do
|
|
147
|
+
expect(File).not_to exist("#{name}/spec/accessibility_spec.rb")
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -18,6 +18,16 @@ describe CommonGenerator do
|
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
shared_examples 'creates a ruby-version file' do |name|
|
|
22
|
+
it 'creates a .ruby-version file' do
|
|
23
|
+
expect(File).to exist("#{name}/.ruby-version")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'contains the default ruby version' do
|
|
27
|
+
expect(File.read("#{name}/.ruby-version").strip).to eq('3.4')
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
21
31
|
shared_examples 'creates a config file' do |name|
|
|
22
32
|
it 'creates a config file' do
|
|
23
33
|
expect(File).to exist("#{name}/config/config.yml")
|
|
@@ -30,12 +40,6 @@ describe CommonGenerator do
|
|
|
30
40
|
end
|
|
31
41
|
end
|
|
32
42
|
|
|
33
|
-
shared_examples 'creates an options file' do |name|
|
|
34
|
-
it 'creates an options file' do
|
|
35
|
-
expect(File).to exist("#{name}/config/options.yml")
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
43
|
shared_examples 'creates a capabilities file' do |name|
|
|
40
44
|
it 'creates a capabilities file' do
|
|
41
45
|
expect(File).to exist("#{name}/config/capabilities.yml")
|
|
@@ -52,6 +56,7 @@ describe CommonGenerator do
|
|
|
52
56
|
include_examples 'creates common files', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
53
57
|
include_examples 'creates a config file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
54
58
|
include_examples 'creates a gitignore file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
59
|
+
include_examples 'creates a ruby-version file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
context 'with rspec and watir' do
|
|
@@ -60,17 +65,11 @@ describe CommonGenerator do
|
|
|
60
65
|
include_examples 'creates a gitignore file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::WATIR}"
|
|
61
66
|
end
|
|
62
67
|
|
|
63
|
-
context 'with rspec, selenium and applitools' do
|
|
64
|
-
include_examples 'creates common files', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
65
|
-
include_examples 'creates a config file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
66
|
-
include_examples 'creates an options file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
67
|
-
include_examples 'creates a gitignore file', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
68
|
-
end
|
|
69
|
-
|
|
70
68
|
context 'with cucumber and selenium' do
|
|
71
69
|
include_examples 'creates common files', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
72
70
|
include_examples 'creates a config file', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
73
71
|
include_examples 'creates a gitignore file', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
72
|
+
include_examples 'creates a ruby-version file', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
74
73
|
end
|
|
75
74
|
|
|
76
75
|
context 'with cucumber and watir' do
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'yaml'
|
|
5
|
+
require_relative '../../../lib/generators/invoke_generators'
|
|
6
|
+
|
|
7
|
+
describe 'Config features for generated projects' do
|
|
8
|
+
include InvokeGenerators
|
|
9
|
+
|
|
10
|
+
after(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
11
|
+
%w[config_selenium_test config_capybara_test config_watir_test
|
|
12
|
+
reporter_json_rspec_test reporter_json_cucumber_test reporter_json_minitest_test].each do |name|
|
|
13
|
+
FileUtils.rm_rf(name)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe 'timeout and viewport in config.yml' do
|
|
18
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
19
|
+
InvokeGenerators.generate_framework(
|
|
20
|
+
automation: 'selenium', framework: 'rspec', name: 'config_selenium_test', reporter: 'none'
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'includes timeout key with default value of 10' do
|
|
25
|
+
config = YAML.load_file('config_selenium_test/config/config.yml')
|
|
26
|
+
expect(config['timeout']).to eq 10
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'includes viewport with width and height' do
|
|
30
|
+
config = YAML.load_file('config_selenium_test/config/config.yml')
|
|
31
|
+
expect(config['viewport']).to eq({ 'width' => 1920, 'height' => 1080 })
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'does not include hardcoded driver_options timeouts' do
|
|
35
|
+
config = YAML.load_file('config_selenium_test/config/config.yml')
|
|
36
|
+
expect(config['driver_options']).to be_nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'generates driver_helper with timeout from config' do
|
|
40
|
+
helper = File.read('config_selenium_test/helpers/driver_helper.rb')
|
|
41
|
+
expect(helper).to include("config.fetch('timeout', 10)")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'generates spec_helper with viewport-aware window setup' do
|
|
45
|
+
helper = File.read('config_selenium_test/helpers/spec_helper.rb')
|
|
46
|
+
expect(helper).to include('viewport')
|
|
47
|
+
expect(helper).to include('resize_to')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'generates spec_helper with valid Ruby syntax' do
|
|
51
|
+
helper = File.read('config_selenium_test/helpers/spec_helper.rb')
|
|
52
|
+
expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe 'timeout in Capybara helper' do
|
|
57
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
58
|
+
InvokeGenerators.generate_framework(
|
|
59
|
+
automation: 'capybara', framework: 'rspec', name: 'config_capybara_test', reporter: 'none'
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'reads timeout from config in capybara_helper' do
|
|
64
|
+
helper = File.read('config_capybara_test/helpers/capybara_helper.rb')
|
|
65
|
+
expect(helper).to include("config.fetch('timeout', 10)")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'generates spec_helper with viewport-aware window setup' do
|
|
69
|
+
helper = File.read('config_capybara_test/helpers/spec_helper.rb')
|
|
70
|
+
expect(helper).to include('viewport')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'generates spec_helper with valid Ruby syntax' do
|
|
74
|
+
helper = File.read('config_capybara_test/helpers/spec_helper.rb')
|
|
75
|
+
expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe 'timeout in Watir helper' do
|
|
80
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
81
|
+
InvokeGenerators.generate_framework(
|
|
82
|
+
automation: 'watir', framework: 'rspec', name: 'config_watir_test', reporter: 'none'
|
|
83
|
+
)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'sets Watir.default_timeout from config' do
|
|
87
|
+
helper = File.read('config_watir_test/helpers/browser_helper.rb')
|
|
88
|
+
expect(helper).to include("Watir.default_timeout = config.fetch('timeout', 10)")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'generates spec_helper with viewport-aware window setup' do
|
|
92
|
+
helper = File.read('config_watir_test/helpers/spec_helper.rb')
|
|
93
|
+
expect(helper).to include('viewport')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'generates spec_helper with valid Ruby syntax' do
|
|
97
|
+
helper = File.read('config_watir_test/helpers/spec_helper.rb')
|
|
98
|
+
expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe 'reporter: json with RSpec' do
|
|
103
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
104
|
+
InvokeGenerators.generate_framework(
|
|
105
|
+
automation: 'selenium', framework: 'rspec', name: 'reporter_json_rspec_test', reporter: 'json'
|
|
106
|
+
)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'includes json formatter in spec_helper' do
|
|
110
|
+
helper = File.read('reporter_json_rspec_test/helpers/spec_helper.rb')
|
|
111
|
+
expect(helper).to include("config.add_formatter('json', 'results/results.json')")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'does not include allure in spec_helper' do
|
|
115
|
+
helper = File.read('reporter_json_rspec_test/helpers/spec_helper.rb')
|
|
116
|
+
expect(helper).not_to include('AllureHelper')
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'generates spec_helper with valid Ruby syntax' do
|
|
120
|
+
helper = File.read('reporter_json_rspec_test/helpers/spec_helper.rb')
|
|
121
|
+
expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
describe 'reporter: json with Cucumber' do
|
|
126
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
127
|
+
InvokeGenerators.generate_framework(
|
|
128
|
+
automation: 'selenium', framework: 'cucumber', name: 'reporter_json_cucumber_test', reporter: 'json'
|
|
129
|
+
)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'includes json profile in cucumber.yml' do
|
|
133
|
+
cucumber_yml = File.read('reporter_json_cucumber_test/cucumber.yml')
|
|
134
|
+
expect(cucumber_yml).to include('--format json --out results/results.json')
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
describe 'reporter: json with Minitest' do
|
|
139
|
+
before(:all) do # rubocop:disable RSpec/BeforeAfterAll
|
|
140
|
+
InvokeGenerators.generate_framework(
|
|
141
|
+
automation: 'selenium', framework: 'minitest', name: 'reporter_json_minitest_test', reporter: 'json'
|
|
142
|
+
)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'includes JsonReporter in test_helper' do
|
|
146
|
+
helper = File.read('reporter_json_minitest_test/helpers/test_helper.rb')
|
|
147
|
+
expect(helper).to include('Minitest::Reporters::JsonReporter')
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it 'generates test_helper with valid Ruby syntax' do
|
|
151
|
+
helper = File.read('reporter_json_minitest_test/helpers/test_helper.rb')
|
|
152
|
+
expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../lib/generators/helper_generator'
|
|
4
|
+
require_relative '../spec_helper'
|
|
5
|
+
|
|
6
|
+
describe 'Debug helper generation' do
|
|
7
|
+
shared_examples 'creates debug helper' do |name|
|
|
8
|
+
it 'creates a debug_helper.rb file' do
|
|
9
|
+
expect(File).to exist("#{name}/helpers/debug_helper.rb")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
shared_examples 'does not create debug helper' do |name|
|
|
14
|
+
it 'does not create a debug_helper.rb file' do
|
|
15
|
+
expect(File).not_to exist("#{name}/helpers/debug_helper.rb")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Web frameworks should get debug_helper
|
|
20
|
+
context 'with rspec and selenium' do
|
|
21
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'with rspec and watir' do
|
|
25
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::WATIR}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'with rspec and capybara' do
|
|
29
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::CAPYBARA}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'with cucumber and selenium' do
|
|
33
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'with cucumber and watir' do
|
|
37
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::WATIR}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context 'with cucumber and capybara' do
|
|
41
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::CAPYBARA}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context 'with minitest and selenium' do
|
|
45
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::MINITEST}_#{AutomationIndex::SELENIUM}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'with minitest and watir' do
|
|
49
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::MINITEST}_#{AutomationIndex::WATIR}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context 'with minitest and capybara' do
|
|
53
|
+
include_examples 'creates debug helper', "#{FrameworkIndex::MINITEST}_#{AutomationIndex::CAPYBARA}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Mobile frameworks should NOT get debug_helper
|
|
57
|
+
context 'with rspec and appium android' do
|
|
58
|
+
include_examples 'does not create debug helper', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::ANDROID}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context 'with rspec and appium ios' do
|
|
62
|
+
include_examples 'does not create debug helper', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::IOS}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'with cucumber and appium cross platform' do
|
|
66
|
+
include_examples 'does not create debug helper', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::CROSS_PLATFORM}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -40,12 +40,6 @@ describe HelpersGenerator do
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
shared_examples 'creates common visual helpers' do |name|
|
|
44
|
-
it 'creates a visual helper file' do
|
|
45
|
-
expect(File).to exist("#{name}/helpers/visual_helper.rb")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
43
|
context 'with rspec and selenium' do
|
|
50
44
|
include_examples 'creates common helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
51
45
|
include_examples 'creates selenium helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::SELENIUM}"
|
|
@@ -58,12 +52,6 @@ describe HelpersGenerator do
|
|
|
58
52
|
include_examples 'creates rspec helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::WATIR}"
|
|
59
53
|
end
|
|
60
54
|
|
|
61
|
-
context 'with rspec, selenium and applitools' do
|
|
62
|
-
include_examples 'creates common visual helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
63
|
-
include_examples 'creates selenium helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
64
|
-
include_examples 'creates rspec helpers', "#{FrameworkIndex::RSPEC}_#{AutomationIndex::APPLITOOLS}"
|
|
65
|
-
end
|
|
66
|
-
|
|
67
55
|
context 'with cucumber and selenium' do
|
|
68
56
|
include_examples 'creates common helpers', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|
|
69
57
|
include_examples 'creates selenium helpers', "#{FrameworkIndex::CUCUMBER}_#{AutomationIndex::SELENIUM}"
|