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.
Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/e2e_tests.yml +58 -0
  3. data/.github/workflows/steep.yml +21 -0
  4. data/.gitignore +1 -1
  5. data/.reek.yml +46 -4
  6. data/.ruby-version +1 -1
  7. data/README.md +138 -77
  8. data/Steepfile +22 -0
  9. data/assets/ruby_raider_logo.svg +51 -0
  10. data/lib/adopter/adopt_menu.rb +11 -15
  11. data/lib/adopter/converters/base_converter.rb +1 -2
  12. data/lib/adopter/converters/identity_converter.rb +3 -6
  13. data/lib/adopter/migration_plan.rb +0 -1
  14. data/lib/adopter/plan_builder.rb +2 -5
  15. data/lib/adopter/project_analyzer.rb +1 -5
  16. data/lib/adopter/project_detector.rb +3 -5
  17. data/lib/commands/adopt_commands.rb +0 -1
  18. data/lib/commands/plugin_commands.rb +0 -2
  19. data/lib/commands/scaffolding_commands.rb +220 -37
  20. data/lib/commands/utility_commands.rb +82 -2
  21. data/lib/generators/automation/automation_generator.rb +0 -7
  22. data/lib/generators/automation/templates/partials/element.tt +1 -1
  23. data/lib/generators/automation/templates/partials/initialize_selector.tt +0 -7
  24. data/lib/generators/automation/templates/partials/url_methods.tt +0 -1
  25. data/lib/generators/common_generator.rb +12 -0
  26. data/lib/generators/cucumber/cucumber_generator.rb +36 -0
  27. data/lib/generators/cucumber/templates/accessibility_feature.tt +5 -0
  28. data/lib/generators/cucumber/templates/accessibility_steps.tt +21 -0
  29. data/lib/generators/cucumber/templates/cucumber.tt +8 -1
  30. data/lib/generators/cucumber/templates/feature.tt +0 -4
  31. data/lib/generators/cucumber/templates/partials/appium_env.tt +5 -0
  32. data/lib/generators/cucumber/templates/partials/capybara_env.tt +19 -1
  33. data/lib/generators/cucumber/templates/partials/driver_world.tt +1 -4
  34. data/lib/generators/cucumber/templates/partials/selenium_env.tt +22 -35
  35. data/lib/generators/cucumber/templates/partials/watir_env.tt +20 -1
  36. data/lib/generators/cucumber/templates/partials/web_steps.tt +6 -12
  37. data/lib/generators/cucumber/templates/performance_feature.tt +5 -0
  38. data/lib/generators/cucumber/templates/performance_steps.tt +17 -0
  39. data/lib/generators/cucumber/templates/visual_feature.tt +5 -0
  40. data/lib/generators/cucumber/templates/visual_steps.tt +19 -0
  41. data/lib/generators/generator.rb +38 -7
  42. data/lib/generators/helper_generator.rb +24 -7
  43. data/lib/generators/infrastructure/templates/github.tt +1 -1
  44. data/lib/generators/infrastructure/templates/github_appium.tt +2 -2
  45. data/lib/generators/infrastructure/templates/gitlab.tt +1 -1
  46. data/lib/generators/invoke_generators.rb +42 -9
  47. data/lib/generators/menu_generator.rb +120 -11
  48. data/lib/generators/minitest/minitest_generator.rb +16 -4
  49. data/lib/generators/minitest/templates/accessibility_test.tt +26 -0
  50. data/lib/generators/minitest/templates/performance_test.tt +18 -0
  51. data/lib/generators/minitest/templates/test.tt +5 -34
  52. data/lib/generators/minitest/templates/visual_test.tt +23 -0
  53. data/lib/generators/rspec/rspec_generator.rb +16 -4
  54. data/lib/generators/rspec/templates/accessibility_spec.tt +25 -0
  55. data/lib/generators/rspec/templates/performance_spec.tt +18 -0
  56. data/lib/generators/rspec/templates/spec.tt +5 -35
  57. data/lib/generators/rspec/templates/visual_spec.tt +20 -0
  58. data/lib/generators/template_renderer/partial_cache.rb +11 -1
  59. data/lib/generators/template_renderer/partial_resolver.rb +17 -10
  60. data/lib/generators/template_renderer.rb +17 -1
  61. data/lib/generators/templates/common/gemfile.tt +21 -6
  62. data/lib/generators/templates/common/git_ignore.tt +6 -1
  63. data/lib/generators/templates/common/partials/mobile_config.tt +5 -1
  64. data/lib/generators/templates/common/partials/web_config.tt +16 -7
  65. data/lib/generators/templates/common/rakefile.tt +36 -0
  66. data/lib/generators/templates/common/read_me.tt +41 -91
  67. data/lib/generators/templates/common/rspec.tt +3 -0
  68. data/lib/generators/templates/common/ruby_version.tt +1 -0
  69. data/lib/generators/templates/helpers/allure_helper.tt +11 -0
  70. data/lib/generators/templates/helpers/browser_helper.tt +12 -2
  71. data/lib/generators/templates/helpers/capybara_helper.tt +5 -1
  72. data/lib/generators/templates/helpers/debug_helper.tt +190 -0
  73. data/lib/generators/templates/helpers/driver_helper.tt +2 -10
  74. data/lib/generators/templates/helpers/partials/appium_driver.tt +0 -2
  75. data/lib/generators/templates/helpers/partials/debug_diagnostics.tt +7 -0
  76. data/lib/generators/templates/helpers/partials/debug_start.tt +7 -0
  77. data/lib/generators/templates/helpers/partials/driver_and_options.tt +1 -3
  78. data/lib/generators/templates/helpers/partials/selenium_driver.tt +8 -7
  79. data/lib/generators/templates/helpers/partials/video_start.tt +9 -0
  80. data/lib/generators/templates/helpers/partials/video_stop.tt +4 -0
  81. data/lib/generators/templates/helpers/performance_helper.tt +57 -0
  82. data/lib/generators/templates/helpers/spec_helper.tt +57 -8
  83. data/lib/generators/templates/helpers/test_helper.tt +69 -1
  84. data/lib/generators/templates/helpers/video_helper.tt +270 -0
  85. data/lib/generators/templates/helpers/visual_helper.tt +39 -46
  86. data/lib/llm/client.rb +79 -0
  87. data/lib/llm/config.rb +57 -0
  88. data/lib/llm/prompts.rb +84 -0
  89. data/lib/llm/provider.rb +27 -0
  90. data/lib/llm/providers/anthropic_provider.rb +43 -0
  91. data/lib/llm/providers/ollama_provider.rb +56 -0
  92. data/lib/llm/providers/openai_provider.rb +42 -0
  93. data/lib/llm/response_parser.rb +67 -0
  94. data/lib/plugin/plugin.rb +22 -20
  95. data/lib/plugin/plugin_exposer.rb +16 -38
  96. data/lib/ruby_raider.rb +47 -12
  97. data/lib/scaffolding/crud_generator.rb +94 -0
  98. data/lib/scaffolding/dry_run_presenter.rb +16 -0
  99. data/lib/scaffolding/name_normalizer.rb +63 -0
  100. data/lib/scaffolding/page_introspector.rb +45 -0
  101. data/lib/scaffolding/project_detector.rb +72 -0
  102. data/lib/scaffolding/scaffold_menu.rb +103 -0
  103. data/lib/scaffolding/scaffolding.rb +158 -11
  104. data/lib/scaffolding/templates/component.tt +30 -0
  105. data/lib/scaffolding/templates/feature.tt +4 -4
  106. data/lib/scaffolding/templates/helper.tt +15 -1
  107. data/lib/scaffolding/templates/page_from_url.tt +75 -0
  108. data/lib/scaffolding/templates/page_object.tt +50 -1
  109. data/lib/scaffolding/templates/spec.tt +33 -2
  110. data/lib/scaffolding/templates/spec_from_page.tt +31 -0
  111. data/lib/scaffolding/templates/spec_from_url.tt +46 -0
  112. data/lib/scaffolding/templates/steps.tt +17 -5
  113. data/lib/scaffolding/url_analyzer.rb +179 -0
  114. data/lib/utilities/desktop_downloader.rb +177 -0
  115. data/lib/utilities/logo.rb +83 -0
  116. data/lib/utilities/utilities.rb +53 -20
  117. data/lib/version +1 -1
  118. data/ruby_raider.gemspec +1 -0
  119. data/sig/adopter/adopt_menu.rbs +25 -0
  120. data/sig/adopter/converters/base_converter.rbs +23 -0
  121. data/sig/adopter/converters/identity_converter.rbs +16 -0
  122. data/sig/adopter/migration_plan.rbs +34 -0
  123. data/sig/adopter/migrator.rbs +21 -0
  124. data/sig/adopter/plan_builder.rbs +38 -0
  125. data/sig/adopter/project_analyzer.rbs +39 -0
  126. data/sig/adopter/project_detector.rbs +26 -0
  127. data/sig/commands/adopt_commands.rbs +8 -0
  128. data/sig/commands/loaded_commands.rbs +5 -0
  129. data/sig/commands/plugin_commands.rbs +9 -0
  130. data/sig/commands/scaffolding_commands.rbs +28 -0
  131. data/sig/commands/utility_commands.rbs +21 -0
  132. data/sig/generators/automation/automation_generator.rbs +20 -0
  133. data/sig/generators/common_generator.rbs +12 -0
  134. data/sig/generators/cucumber/cucumber_generator.rbs +16 -0
  135. data/sig/generators/generator.rbs +40 -0
  136. data/sig/generators/helper_generator.rbs +18 -0
  137. data/sig/generators/infrastructure/github_generator.rbs +5 -0
  138. data/sig/generators/infrastructure/gitlab_generator.rbs +4 -0
  139. data/sig/generators/invoke_generators.rbs +10 -0
  140. data/sig/generators/menu_generator.rbs +29 -0
  141. data/sig/generators/minitest/minitest_generator.rbs +8 -0
  142. data/sig/generators/rspec/rspec_generator.rbs +8 -0
  143. data/sig/generators/template_renderer/partial_cache.rbs +20 -0
  144. data/sig/generators/template_renderer/partial_resolver.rbs +20 -0
  145. data/sig/generators/template_renderer/template_error.rbs +19 -0
  146. data/sig/generators/template_renderer.rbs +10 -0
  147. data/sig/llm/client.rbs +15 -0
  148. data/sig/llm/config.rbs +20 -0
  149. data/sig/llm/prompts.rbs +8 -0
  150. data/sig/llm/provider.rbs +12 -0
  151. data/sig/llm/providers/anthropic_provider.rbs +16 -0
  152. data/sig/llm/providers/ollama_provider.rbs +18 -0
  153. data/sig/llm/providers/openai_provider.rbs +16 -0
  154. data/sig/llm/response_parser.rbs +13 -0
  155. data/sig/plugin/plugin.rbs +24 -0
  156. data/sig/plugin/plugin_exposer.rbs +20 -0
  157. data/sig/ruby_raider.rbs +15 -0
  158. data/sig/scaffolding/crud_generator.rbs +16 -0
  159. data/sig/scaffolding/dry_run_presenter.rbs +4 -0
  160. data/sig/scaffolding/name_normalizer.rbs +17 -0
  161. data/sig/scaffolding/page_introspector.rbs +14 -0
  162. data/sig/scaffolding/project_detector.rbs +14 -0
  163. data/sig/scaffolding/scaffold_menu.rbs +18 -0
  164. data/sig/scaffolding/scaffolding.rbs +55 -0
  165. data/sig/scaffolding/url_analyzer.rbs +28 -0
  166. data/sig/utilities/desktop_downloader.rbs +23 -0
  167. data/sig/utilities/logger.rbs +13 -0
  168. data/sig/utilities/logo.rbs +16 -0
  169. data/sig/utilities/utilities.rbs +30 -0
  170. data/sig/vendor/thor.rbs +34 -0
  171. data/sig/vendor/tty_prompt.rbs +15 -0
  172. data/spec/adopter/adopt_menu_spec.rb +12 -12
  173. data/spec/adopter/migration_plan_spec.rb +1 -1
  174. data/spec/adopter/migrator_spec.rb +2 -2
  175. data/spec/adopter/project_detector_spec.rb +1 -1
  176. data/spec/commands/raider_commands_spec.rb +129 -0
  177. data/spec/generators/generator_spec.rb +23 -0
  178. data/spec/integration/commands/scaffolding_commands_spec.rb +1 -1
  179. data/spec/integration/commands/utility_commands_spec.rb +23 -3
  180. data/spec/integration/content/ci_content_spec.rb +119 -0
  181. data/spec/integration/content/common_content_spec.rb +288 -0
  182. data/spec/integration/content/config_content_spec.rb +175 -0
  183. data/spec/integration/content/content_helper.rb +32 -0
  184. data/spec/integration/content/gemfile_content_spec.rb +209 -0
  185. data/spec/integration/content/helper_content_spec.rb +485 -0
  186. data/spec/integration/content/page_content_spec.rb +259 -0
  187. data/spec/integration/content/reporter_content_spec.rb +236 -0
  188. data/spec/integration/content/skip_flags_content_spec.rb +206 -0
  189. data/spec/integration/content/syntax_validation_spec.rb +30 -0
  190. data/spec/integration/content/test_content_spec.rb +266 -0
  191. data/spec/integration/end_to_end_features_spec.rb +690 -0
  192. data/spec/integration/end_to_end_spec.rb +52 -16
  193. data/spec/integration/generators/automation_generator_spec.rb +0 -12
  194. data/spec/integration/generators/axe_addon_spec.rb +150 -0
  195. data/spec/integration/generators/common_generator_spec.rb +12 -13
  196. data/spec/integration/generators/config_features_spec.rb +155 -0
  197. data/spec/integration/generators/debug_helper_spec.rb +68 -0
  198. data/spec/integration/generators/helpers_generator_spec.rb +0 -12
  199. data/spec/integration/generators/lighthouse_addon_spec.rb +132 -0
  200. data/spec/integration/generators/minitest_generator_spec.rb +0 -6
  201. data/spec/integration/generators/reporter_spec.rb +159 -0
  202. data/spec/integration/generators/skip_flags_spec.rb +134 -0
  203. data/spec/integration/generators/visual_addon_spec.rb +148 -0
  204. data/spec/integration/settings_helper.rb +0 -3
  205. data/spec/integration/spec_helper.rb +30 -13
  206. data/spec/llm/client_spec.rb +79 -0
  207. data/spec/llm/config_spec.rb +92 -0
  208. data/spec/llm/prompts_spec.rb +49 -0
  209. data/spec/llm/response_parser_spec.rb +92 -0
  210. data/spec/menus/adopter_adopt_menu_spec.rb +97 -0
  211. data/spec/menus/menu_generator_spec.rb +263 -0
  212. data/spec/scaffolding/name_normalizer_spec.rb +113 -0
  213. data/spec/scaffolding/page_introspector_spec.rb +82 -0
  214. data/spec/scaffolding/scaffold_project_detector_spec.rb +104 -0
  215. data/spec/scaffolding/scaffolding_features_spec.rb +311 -0
  216. data/spec/scaffolding/url_analyzer_spec.rb +110 -0
  217. data/spec/system/adopt_matrix_spec.rb +537 -0
  218. data/spec/system/adopt_spec.rb +225 -0
  219. data/spec/system/support/system_test_helper.rb +0 -2
  220. data/spec/utilities/desktop_downloader_spec.rb +92 -0
  221. metadata +150 -5
  222. data/lib/generators/automation/templates/visual_options.tt +0 -16
  223. data/lib/generators/templates/helpers/partials/axe_driver.tt +0 -10
  224. 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
- it 'includes Applitools dependencies' do
278
- gemfile = File.read('rspec_applitools/Gemfile')
279
- expect(gemfile).to include('eyes_selenium')
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('rspec_applitools', 'ruby -c helpers/visual_helper.rb')
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}"