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
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../../../lib/generators/invoke_generators'
5
+ require_relative '../settings_helper'
6
+
7
+ describe 'Lighthouse addon generation' do
8
+ include InvokeGenerators
9
+ include SettingsHelper
10
+
11
+ # rubocop:disable RSpec/BeforeAfterAll, RSpec/InstanceVariable
12
+ before(:all) do
13
+ @lighthouse_projects = []
14
+ %w[rspec cucumber minitest].each do |framework|
15
+ %w[selenium watir capybara].each do |automation|
16
+ name = "lighthouse_#{framework}_#{automation}"
17
+ @lighthouse_projects << { name:, framework:, automation: }
18
+ InvokeGenerators.generate_framework(
19
+ automation:, framework:, name:, performance: true
20
+ )
21
+ end
22
+ end
23
+ end
24
+
25
+ after(:all) do
26
+ @lighthouse_projects.each { |p| FileUtils.rm_rf(p[:name]) }
27
+ end
28
+ # rubocop:enable RSpec/BeforeAfterAll, RSpec/InstanceVariable
29
+
30
+ context 'with rspec and selenium' do
31
+ let(:name) { 'lighthouse_rspec_selenium' }
32
+
33
+ it 'creates performance_helper.rb' do
34
+ expect(File).to exist("#{name}/helpers/performance_helper.rb")
35
+ end
36
+
37
+ it 'creates performance_spec.rb' do
38
+ expect(File).to exist("#{name}/spec/performance_spec.rb")
39
+ end
40
+
41
+ it 'performance helper has valid Ruby syntax' do
42
+ content = File.read("#{name}/helpers/performance_helper.rb")
43
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
44
+ end
45
+
46
+ it 'performance spec has valid Ruby syntax' do
47
+ content = File.read("#{name}/spec/performance_spec.rb")
48
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
49
+ end
50
+ end
51
+
52
+ context 'with cucumber and selenium' do
53
+ let(:name) { 'lighthouse_cucumber_selenium' }
54
+
55
+ it 'creates performance_helper.rb' do
56
+ expect(File).to exist("#{name}/helpers/performance_helper.rb")
57
+ end
58
+
59
+ it 'creates performance.feature' do
60
+ expect(File).to exist("#{name}/features/performance.feature")
61
+ end
62
+
63
+ it 'creates performance_steps.rb' do
64
+ expect(File).to exist("#{name}/features/step_definitions/performance_steps.rb")
65
+ end
66
+ end
67
+
68
+ context 'with minitest and selenium' do
69
+ let(:name) { 'lighthouse_minitest_selenium' }
70
+
71
+ it 'creates performance_helper.rb' do
72
+ expect(File).to exist("#{name}/helpers/performance_helper.rb")
73
+ end
74
+
75
+ it 'creates test_performance.rb' do
76
+ expect(File).to exist("#{name}/test/test_performance.rb")
77
+ end
78
+
79
+ it 'performance test has valid Ruby syntax' do
80
+ content = File.read("#{name}/test/test_performance.rb")
81
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
82
+ end
83
+ end
84
+
85
+ context 'with rspec and watir' do
86
+ let(:name) { 'lighthouse_rspec_watir' }
87
+
88
+ it 'creates performance_helper.rb' do
89
+ expect(File).to exist("#{name}/helpers/performance_helper.rb")
90
+ end
91
+
92
+ it 'creates performance_spec.rb' do
93
+ expect(File).to exist("#{name}/spec/performance_spec.rb")
94
+ end
95
+ end
96
+
97
+ context 'with rspec and capybara' do
98
+ let(:name) { 'lighthouse_rspec_capybara' }
99
+
100
+ it 'creates performance_helper.rb' do
101
+ expect(File).to exist("#{name}/helpers/performance_helper.rb")
102
+ end
103
+
104
+ it 'creates performance_spec.rb' do
105
+ expect(File).to exist("#{name}/spec/performance_spec.rb")
106
+ end
107
+ end
108
+
109
+ context 'without performance flag' do
110
+ let(:name) { 'no_lighthouse_rspec_selenium' }
111
+
112
+ # rubocop:disable RSpec/BeforeAfterAll
113
+ before(:all) do
114
+ InvokeGenerators.generate_framework(
115
+ automation: 'selenium', framework: 'rspec', name: 'no_lighthouse_rspec_selenium'
116
+ )
117
+ end
118
+
119
+ after(:all) do
120
+ FileUtils.rm_rf('no_lighthouse_rspec_selenium')
121
+ end
122
+ # rubocop:enable RSpec/BeforeAfterAll
123
+
124
+ it 'does not create performance_helper.rb' do
125
+ expect(File).not_to exist("#{name}/helpers/performance_helper.rb")
126
+ end
127
+
128
+ it 'does not create performance_spec.rb' do
129
+ expect(File).not_to exist("#{name}/spec/performance_spec.rb")
130
+ end
131
+ end
132
+ end
@@ -61,10 +61,4 @@ describe MinitestGenerator do
61
61
  include_examples 'creates minitest files examples',
62
62
  "#{FrameworkIndex::MINITEST}_#{AutomationIndex::CROSS_PLATFORM}", 'pdp'
63
63
  end
64
-
65
- context 'with minitest and axe' do
66
- include_examples 'creates minitest files examples',
67
- "#{FrameworkIndex::MINITEST}_#{AutomationIndex::AXE}", 'login'
68
- include_examples 'creates test helper', "#{FrameworkIndex::MINITEST}_#{AutomationIndex::AXE}"
69
- end
70
64
  end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../../../lib/generators/invoke_generators'
5
+
6
+ describe 'Reporter selection for project generation' do
7
+ include InvokeGenerators
8
+
9
+ after(:all) do # rubocop:disable RSpec/BeforeAfterAll
10
+ %w[reporter_allure_test reporter_junit_test reporter_both_test reporter_none_test].each do |name|
11
+ FileUtils.rm_rf(name)
12
+ end
13
+ end
14
+
15
+ describe 'reporter: allure' do
16
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
17
+ InvokeGenerators.generate_framework(
18
+ automation: 'selenium', framework: 'rspec', name: 'reporter_allure_test', reporter: 'allure'
19
+ )
20
+ end
21
+
22
+ it 'generates allure_helper.rb' do
23
+ expect(File).to exist('reporter_allure_test/helpers/allure_helper.rb')
24
+ end
25
+
26
+ it 'creates allure-results directory' do
27
+ expect(File).to exist('reporter_allure_test/allure-results')
28
+ end
29
+
30
+ it 'includes allure gems in Gemfile' do
31
+ gemfile = File.read('reporter_allure_test/Gemfile')
32
+ expect(gemfile).to include('allure-rspec')
33
+ end
34
+
35
+ it 'does not include junit gem in Gemfile' do
36
+ gemfile = File.read('reporter_allure_test/Gemfile')
37
+ expect(gemfile).not_to include('rspec_junit_formatter')
38
+ end
39
+
40
+ it 'references AllureHelper in spec_helper' do
41
+ helper = File.read('reporter_allure_test/helpers/spec_helper.rb')
42
+ expect(helper).to include('AllureHelper')
43
+ end
44
+ end
45
+
46
+ describe 'reporter: junit' do
47
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
48
+ InvokeGenerators.generate_framework(
49
+ automation: 'selenium', framework: 'rspec', name: 'reporter_junit_test', reporter: 'junit'
50
+ )
51
+ end
52
+
53
+ it 'does not generate allure_helper.rb' do
54
+ expect(File).not_to exist('reporter_junit_test/helpers/allure_helper.rb')
55
+ end
56
+
57
+ it 'does not create allure-results directory' do
58
+ expect(File).not_to exist('reporter_junit_test/allure-results')
59
+ end
60
+
61
+ it 'does not include allure gems in Gemfile' do
62
+ gemfile = File.read('reporter_junit_test/Gemfile')
63
+ expect(gemfile).not_to include('allure-rspec')
64
+ end
65
+
66
+ it 'includes junit gem in Gemfile' do
67
+ gemfile = File.read('reporter_junit_test/Gemfile')
68
+ expect(gemfile).to include('rspec_junit_formatter')
69
+ end
70
+
71
+ it 'includes junit formatter in spec_helper' do
72
+ helper = File.read('reporter_junit_test/helpers/spec_helper.rb')
73
+ expect(helper).to include('RspecJunitFormatter')
74
+ end
75
+
76
+ it 'does not reference AllureHelper in spec_helper' do
77
+ helper = File.read('reporter_junit_test/helpers/spec_helper.rb')
78
+ expect(helper).not_to include('AllureHelper')
79
+ end
80
+
81
+ it 'generates spec_helper.rb with valid syntax' do
82
+ helper = File.read('reporter_junit_test/helpers/spec_helper.rb')
83
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
84
+ end
85
+ end
86
+
87
+ describe 'reporter: both' do
88
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
89
+ InvokeGenerators.generate_framework(
90
+ automation: 'selenium', framework: 'rspec', name: 'reporter_both_test', reporter: 'both'
91
+ )
92
+ end
93
+
94
+ it 'generates allure_helper.rb' do
95
+ expect(File).to exist('reporter_both_test/helpers/allure_helper.rb')
96
+ end
97
+
98
+ it 'includes allure gems in Gemfile' do
99
+ gemfile = File.read('reporter_both_test/Gemfile')
100
+ expect(gemfile).to include('allure-rspec')
101
+ end
102
+
103
+ it 'includes junit gem in Gemfile' do
104
+ gemfile = File.read('reporter_both_test/Gemfile')
105
+ expect(gemfile).to include('rspec_junit_formatter')
106
+ end
107
+
108
+ it 'references AllureHelper in spec_helper' do
109
+ helper = File.read('reporter_both_test/helpers/spec_helper.rb')
110
+ expect(helper).to include('AllureHelper')
111
+ end
112
+
113
+ it 'includes junit formatter in spec_helper' do
114
+ helper = File.read('reporter_both_test/helpers/spec_helper.rb')
115
+ expect(helper).to include('RspecJunitFormatter')
116
+ end
117
+
118
+ it 'generates spec_helper.rb with valid syntax' do
119
+ helper = File.read('reporter_both_test/helpers/spec_helper.rb')
120
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
121
+ end
122
+ end
123
+
124
+ describe 'reporter: none' do
125
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
126
+ InvokeGenerators.generate_framework(
127
+ automation: 'selenium', framework: 'rspec', name: 'reporter_none_test', reporter: 'none'
128
+ )
129
+ end
130
+
131
+ it 'does not generate allure_helper.rb' do
132
+ expect(File).not_to exist('reporter_none_test/helpers/allure_helper.rb')
133
+ end
134
+
135
+ it 'does not create allure-results directory' do
136
+ expect(File).not_to exist('reporter_none_test/allure-results')
137
+ end
138
+
139
+ it 'does not include allure gems in Gemfile' do
140
+ gemfile = File.read('reporter_none_test/Gemfile')
141
+ expect(gemfile).not_to include('allure-rspec')
142
+ end
143
+
144
+ it 'does not include junit gem in Gemfile' do
145
+ gemfile = File.read('reporter_none_test/Gemfile')
146
+ expect(gemfile).not_to include('rspec_junit_formatter')
147
+ end
148
+
149
+ it 'does not reference AllureHelper in spec_helper' do
150
+ helper = File.read('reporter_none_test/helpers/spec_helper.rb')
151
+ expect(helper).not_to include('AllureHelper')
152
+ end
153
+
154
+ it 'generates spec_helper.rb with valid syntax' do
155
+ helper = File.read('reporter_none_test/helpers/spec_helper.rb')
156
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../../../lib/generators/invoke_generators'
5
+
6
+ describe 'Skip flags for project generation' do
7
+ include InvokeGenerators
8
+
9
+ after(:all) do # rubocop:disable RSpec/BeforeAfterAll
10
+ %w[skip_allure_test skip_video_test skip_ci_test skip_all_test].each do |name|
11
+ FileUtils.rm_rf(name)
12
+ end
13
+ end
14
+
15
+ describe '--skip-allure' do
16
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
17
+ InvokeGenerators.generate_framework(
18
+ automation: 'selenium', framework: 'rspec', name: 'skip_allure_test', skip_allure: true
19
+ )
20
+ end
21
+
22
+ it 'does not generate allure_helper.rb' do
23
+ expect(File).not_to exist('skip_allure_test/helpers/allure_helper.rb')
24
+ end
25
+
26
+ it 'does not create allure-results directory' do
27
+ expect(File).not_to exist('skip_allure_test/allure-results')
28
+ end
29
+
30
+ it 'does not include allure gems in Gemfile' do
31
+ gemfile = File.read('skip_allure_test/Gemfile')
32
+ expect(gemfile).not_to include('allure-rspec')
33
+ expect(gemfile).not_to include('allure-ruby-commons')
34
+ end
35
+
36
+ it 'does not reference AllureHelper in spec_helper' do
37
+ helper = File.read('skip_allure_test/helpers/spec_helper.rb')
38
+ expect(helper).not_to include('allure_helper')
39
+ expect(helper).not_to include('AllureHelper')
40
+ end
41
+
42
+ it 'does not include allure-results in .gitignore' do
43
+ gitignore = File.read('skip_allure_test/.gitignore')
44
+ expect(gitignore).not_to include('allure-results')
45
+ end
46
+
47
+ it 'still generates spec_helper.rb with valid syntax' do
48
+ helper = File.read('skip_allure_test/helpers/spec_helper.rb')
49
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
50
+ end
51
+
52
+ it 'still has rspec-retry config' do
53
+ helper = File.read('skip_allure_test/helpers/spec_helper.rb')
54
+ expect(helper).to include('rspec/retry')
55
+ end
56
+ end
57
+
58
+ describe '--skip-video' do
59
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
60
+ InvokeGenerators.generate_framework(
61
+ automation: 'selenium', framework: 'rspec', name: 'skip_video_test', skip_video: true
62
+ )
63
+ end
64
+
65
+ it 'does not generate video_helper.rb' do
66
+ expect(File).not_to exist('skip_video_test/helpers/video_helper.rb')
67
+ end
68
+
69
+ it 'does not reference video_helper in spec_helper' do
70
+ helper = File.read('skip_video_test/helpers/spec_helper.rb')
71
+ expect(helper).not_to include('video_helper')
72
+ end
73
+
74
+ it 'still generates allure_helper.rb' do
75
+ expect(File).to exist('skip_video_test/helpers/allure_helper.rb')
76
+ end
77
+
78
+ it 'still generates spec_helper.rb with valid syntax' do
79
+ helper = File.read('skip_video_test/helpers/spec_helper.rb')
80
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
81
+ end
82
+ end
83
+
84
+ describe '--skip-ci' do
85
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
86
+ InvokeGenerators.generate_framework(
87
+ automation: 'selenium', framework: 'rspec', name: 'skip_ci_test',
88
+ ci_platform: 'github', skip_ci: true
89
+ )
90
+ end
91
+
92
+ it 'does not generate CI pipeline files' do
93
+ expect(File).not_to exist('skip_ci_test/.github')
94
+ end
95
+
96
+ it 'still generates the project' do
97
+ expect(File).to exist('skip_ci_test/Gemfile')
98
+ expect(File).to exist('skip_ci_test/helpers/spec_helper.rb')
99
+ end
100
+ end
101
+
102
+ describe 'all skip flags combined' do
103
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
104
+ InvokeGenerators.generate_framework(
105
+ automation: 'selenium', framework: 'rspec', name: 'skip_all_test',
106
+ ci_platform: 'github', skip_ci: true, skip_allure: true, skip_video: true
107
+ )
108
+ end
109
+
110
+ it 'does not generate allure_helper.rb' do
111
+ expect(File).not_to exist('skip_all_test/helpers/allure_helper.rb')
112
+ end
113
+
114
+ it 'does not generate video_helper.rb' do
115
+ expect(File).not_to exist('skip_all_test/helpers/video_helper.rb')
116
+ end
117
+
118
+ it 'does not generate CI files' do
119
+ expect(File).not_to exist('skip_all_test/.github')
120
+ end
121
+
122
+ it 'still generates core project files' do
123
+ expect(File).to exist('skip_all_test/Gemfile')
124
+ expect(File).to exist('skip_all_test/Rakefile')
125
+ expect(File).to exist('skip_all_test/helpers/spec_helper.rb')
126
+ expect(File).to exist('skip_all_test/helpers/driver_helper.rb')
127
+ end
128
+
129
+ it 'generates spec_helper.rb with valid syntax' do
130
+ helper = File.read('skip_all_test/helpers/spec_helper.rb')
131
+ expect { RubyVM::InstructionSequence.compile(helper) }.not_to raise_error
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative '../../../lib/generators/invoke_generators'
5
+ require_relative '../settings_helper'
6
+
7
+ describe 'Visual addon generation' do
8
+ include InvokeGenerators
9
+ include SettingsHelper
10
+
11
+ # rubocop:disable RSpec/BeforeAfterAll, RSpec/InstanceVariable
12
+ before(:all) do
13
+ @visual_projects = []
14
+ %w[rspec cucumber minitest].each do |framework|
15
+ %w[selenium watir capybara].each do |automation|
16
+ name = "visual_#{framework}_#{automation}"
17
+ @visual_projects << { name:, framework:, automation: }
18
+ InvokeGenerators.generate_framework(
19
+ automation:, framework:, name:, visual: true
20
+ )
21
+ end
22
+ end
23
+ end
24
+
25
+ after(:all) do
26
+ @visual_projects.each { |p| FileUtils.rm_rf(p[:name]) }
27
+ end
28
+ # rubocop:enable RSpec/BeforeAfterAll, RSpec/InstanceVariable
29
+
30
+ context 'with rspec and selenium' do
31
+ let(:name) { 'visual_rspec_selenium' }
32
+
33
+ it 'creates visual_helper.rb' do
34
+ expect(File).to exist("#{name}/helpers/visual_helper.rb")
35
+ end
36
+
37
+ it 'creates visual_spec.rb' do
38
+ expect(File).to exist("#{name}/spec/visual_spec.rb")
39
+ end
40
+
41
+ it 'includes chunky_png in Gemfile' do
42
+ gemfile = File.read("#{name}/Gemfile")
43
+ expect(gemfile).to include("gem 'chunky_png'")
44
+ end
45
+
46
+ it 'visual helper has valid Ruby syntax' do
47
+ content = File.read("#{name}/helpers/visual_helper.rb")
48
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
49
+ end
50
+
51
+ it 'visual spec has valid Ruby syntax' do
52
+ content = File.read("#{name}/spec/visual_spec.rb")
53
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
54
+ end
55
+ end
56
+
57
+ context 'with cucumber and selenium' do
58
+ let(:name) { 'visual_cucumber_selenium' }
59
+
60
+ it 'creates visual_helper.rb' do
61
+ expect(File).to exist("#{name}/helpers/visual_helper.rb")
62
+ end
63
+
64
+ it 'creates visual.feature' do
65
+ expect(File).to exist("#{name}/features/visual.feature")
66
+ end
67
+
68
+ it 'creates visual_steps.rb' do
69
+ expect(File).to exist("#{name}/features/step_definitions/visual_steps.rb")
70
+ end
71
+
72
+ it 'includes chunky_png in Gemfile' do
73
+ gemfile = File.read("#{name}/Gemfile")
74
+ expect(gemfile).to include("gem 'chunky_png'")
75
+ end
76
+ end
77
+
78
+ context 'with minitest and selenium' do
79
+ let(:name) { 'visual_minitest_selenium' }
80
+
81
+ it 'creates visual_helper.rb' do
82
+ expect(File).to exist("#{name}/helpers/visual_helper.rb")
83
+ end
84
+
85
+ it 'creates test_visual.rb' do
86
+ expect(File).to exist("#{name}/test/test_visual.rb")
87
+ end
88
+
89
+ it 'includes chunky_png in Gemfile' do
90
+ gemfile = File.read("#{name}/Gemfile")
91
+ expect(gemfile).to include("gem 'chunky_png'")
92
+ end
93
+
94
+ it 'visual test has valid Ruby syntax' do
95
+ content = File.read("#{name}/test/test_visual.rb")
96
+ expect { RubyVM::InstructionSequence.compile(content) }.not_to raise_error
97
+ end
98
+ end
99
+
100
+ context 'with rspec and watir' do
101
+ let(:name) { 'visual_rspec_watir' }
102
+
103
+ it 'creates visual_helper.rb' do
104
+ expect(File).to exist("#{name}/helpers/visual_helper.rb")
105
+ end
106
+
107
+ it 'creates visual_spec.rb' do
108
+ expect(File).to exist("#{name}/spec/visual_spec.rb")
109
+ end
110
+ end
111
+
112
+ context 'with rspec and capybara' do
113
+ let(:name) { 'visual_rspec_capybara' }
114
+
115
+ it 'creates visual_helper.rb' do
116
+ expect(File).to exist("#{name}/helpers/visual_helper.rb")
117
+ end
118
+
119
+ it 'creates visual_spec.rb' do
120
+ expect(File).to exist("#{name}/spec/visual_spec.rb")
121
+ end
122
+ end
123
+
124
+ context 'without visual flag' do
125
+ let(:name) { 'no_visual_rspec_selenium' }
126
+
127
+ # rubocop:disable RSpec/BeforeAfterAll
128
+ before(:all) do
129
+ InvokeGenerators.generate_framework(
130
+ automation: 'selenium', framework: 'rspec', name: 'no_visual_rspec_selenium'
131
+ )
132
+ end
133
+
134
+ after(:all) do
135
+ FileUtils.rm_rf('no_visual_rspec_selenium')
136
+ end
137
+ # rubocop:enable RSpec/BeforeAfterAll
138
+
139
+ it 'does not create visual_helper.rb' do
140
+ expect(File).not_to exist("#{name}/helpers/visual_helper.rb")
141
+ end
142
+
143
+ it 'does not include chunky_png in Gemfile' do
144
+ gemfile = File.read("#{name}/Gemfile")
145
+ expect(gemfile).not_to include("gem 'chunky_png'")
146
+ end
147
+ end
148
+ end
@@ -1,6 +1,3 @@
1
- # :reek:FeatureEnvy { enabled: false }
2
- # :reek:UtilityFunction { enabled: false }
3
-
4
1
  module SettingsHelper
5
2
  def create_settings(options)
6
3
  automation = options[:automation]
@@ -5,7 +5,7 @@ require 'rspec'
5
5
  require_relative '../../lib/generators/invoke_generators'
6
6
  require_relative 'settings_helper'
7
7
 
8
- AUTOMATION_TYPES = %w[android ios selenium watir cross_platform axe applitools capybara].freeze
8
+ AUTOMATION_TYPES = %w[android ios selenium watir cross_platform capybara].freeze
9
9
  FRAMEWORKS = %w[cucumber rspec minitest].freeze
10
10
  CI_PLATFORMS = [nil, 'github', 'gitlab'].freeze
11
11
 
@@ -22,36 +22,53 @@ module AutomationIndex
22
22
  SELENIUM = AUTOMATION_TYPES[2]
23
23
  WATIR = AUTOMATION_TYPES[3]
24
24
  CROSS_PLATFORM = AUTOMATION_TYPES[4]
25
- AXE = AUTOMATION_TYPES[5]
26
- APPLITOOLS = AUTOMATION_TYPES[6]
27
- CAPYBARA = AUTOMATION_TYPES[7]
25
+ CAPYBARA = AUTOMATION_TYPES[5]
26
+ end
27
+
28
+ # Lazy project generation — only generates a project the first time it's needed.
29
+ # Replaces the old before(:all) that generated all 54 combinations upfront.
30
+ module LazyProjectGenerator
31
+ GENERATED = Set.new
32
+ MUTEX = Mutex.new
33
+
34
+ def ensure_project(framework:, automation:, ci_platform: nil)
35
+ settings = create_settings(framework:, automation:, ci_platform:)
36
+ project_name = settings[:name]
37
+
38
+ MUTEX.synchronize do
39
+ unless GENERATED.include?(project_name)
40
+ generate_framework(settings)
41
+ GENERATED.add(project_name)
42
+ end
43
+ end
44
+
45
+ project_name
46
+ end
28
47
  end
29
48
 
30
49
  RSpec.configure do |config|
31
50
  config.include(InvokeGenerators)
32
51
  config.include(SettingsHelper)
52
+ config.include(LazyProjectGenerator)
33
53
 
34
54
  # rubocop:disable RSpec/BeforeAfterAll
35
55
  config.before(:all) do
56
+ # Generate all projects upfront (preserves existing behavior).
57
+ # Individual specs can also call ensure_project() for on-demand generation.
36
58
  FRAMEWORKS.each do |framework|
37
59
  AUTOMATION_TYPES.each do |automation|
38
60
  CI_PLATFORMS.each do |ci_platform|
39
- settings = create_settings(framework:, automation:, ci_platform:)
40
- generate_framework(settings)
61
+ ensure_project(framework:, automation:, ci_platform:)
41
62
  end
42
63
  end
43
64
  end
44
65
  end
45
66
 
46
67
  config.after(:all) do
47
- FRAMEWORKS.each do |framework|
48
- AUTOMATION_TYPES.each do |automation|
49
- CI_PLATFORMS.each do |ci_platform|
50
- settings = create_settings(framework:, automation:, ci_platform:)
51
- FileUtils.rm_rf(settings[:name])
52
- end
53
- end
68
+ LazyProjectGenerator::GENERATED.each do |project_name|
69
+ FileUtils.rm_rf(project_name)
54
70
  end
71
+ LazyProjectGenerator::GENERATED.clear
55
72
  end
56
73
  # rubocop:enable RSpec/BeforeAfterAll
57
74
  end