ruby_raider 0.1.5 → 0.1.7

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/lib/generators/files/automation_file_generator.rb +31 -130
  4. data/lib/generators/files/common_file_generator.rb +22 -150
  5. data/lib/generators/files/cucumber_file_generator.rb +22 -70
  6. data/lib/generators/files/file_generator.rb +7 -5
  7. data/lib/generators/files/helpers_file_generator.rb +46 -227
  8. data/lib/generators/files/rspec_file_generator.rb +19 -49
  9. data/lib/generators/projects/cucumber_project_generator.rb +17 -15
  10. data/lib/generators/projects/project_generator.rb +7 -5
  11. data/lib/generators/projects/rspec_project_generator.rb +13 -11
  12. data/lib/generators/templates/automation/abstract_component_template.rb +22 -0
  13. data/lib/generators/templates/automation/abstract_page_template.rb +48 -0
  14. data/lib/generators/templates/automation/component_template.rb +16 -0
  15. data/lib/generators/templates/automation/page_template.rb +51 -0
  16. data/lib/generators/templates/common/config_template.rb +9 -0
  17. data/lib/generators/templates/common/gemfile_template.rb +29 -0
  18. data/lib/generators/templates/common/rake_file_template.rb +16 -0
  19. data/lib/generators/templates/common/read_me_template.rb +104 -0
  20. data/lib/generators/templates/cucumber/env_template.rb +38 -0
  21. data/lib/generators/templates/cucumber/example_feature_template.rb +15 -0
  22. data/lib/generators/templates/cucumber/example_steps_template.rb +21 -0
  23. data/lib/generators/templates/helpers/allure_helper_template.rb +47 -0
  24. data/lib/generators/templates/helpers/browser_helper_template.rb +26 -0
  25. data/lib/generators/templates/helpers/driver_helper_template.rb +24 -0
  26. data/lib/generators/templates/helpers/pom_helper_template.rb +25 -0
  27. data/lib/generators/templates/helpers/raider_helper_template.rb +15 -0
  28. data/lib/generators/templates/helpers/selenium_helper_template.rb +42 -0
  29. data/lib/generators/templates/helpers/spec_helper_template.rb +35 -0
  30. data/lib/generators/templates/helpers/watir_helper_template.rb +24 -0
  31. data/lib/generators/templates/rspec/base_spec_template.rb +13 -0
  32. data/lib/generators/templates/rspec/example_spec_template.rb +33 -0
  33. data/lib/generators/templates/template.rb +14 -0
  34. data/ruby_raider.gemspec +1 -1
  35. data/spec/automation_file_generator_spec.rb +14 -5
  36. data/spec/common_file_generator_spec.rb +12 -3
  37. data/spec/cucumber_file_generator_spec.rb +26 -0
  38. data/spec/cucumber_project_generator_spec.rb +60 -0
  39. data/spec/helpers_file_generator_spec.rb +58 -16
  40. data/spec/rspec_file_generator_spec.rb +11 -2
  41. data/spec/rspec_project_generator_spec.rb +18 -9
  42. data/spec/spec_helper.rb +2 -12
  43. metadata +26 -3
  44. data/spec/menu_generator_spec.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1862a69fc2192fafab5d76cacff2bfa956bfdec819c04897f80d689672962655
4
- data.tar.gz: 190c50a7c66fbde69c04f2c35d6756a8737cbb529e15e5227163c99f8893c06f
3
+ metadata.gz: a9bd00a5bda20ac8d1d05adbe7fe90223dcdfe98f670b7a919a143d76cecbbea
4
+ data.tar.gz: bacd7bb799e99f97b00b06176299859661da195a62c534dc388f7edc7159f948
5
5
  SHA512:
6
- metadata.gz: 5acde20915a1ecfa077e30b7aebe197e207c8216e85339be9f01e7985d989450698965eae5d0019aa49f6098bdca42a5e7ecd7e3652a274410e142bcd1f942fc
7
- data.tar.gz: '08a74887fa8efb62838305aedcf99240b7c234789af3f3ec1dbb098b0a59404feb2a998146234736b41a4847ad163ceea44d88b34d0f611f73b92e64395ca2ad'
6
+ metadata.gz: 27ffb1a238e188672c991e8cc23b67e89efbe0c6254edffdd05de8e5523e4e928fab1b403de3c258dd24e4385a7452ecd32892815604a4494ab219ddad6c1fac
7
+ data.tar.gz: bc11ab83b8a776d9ccc49227dece33474039e1ef00636356d6d0224697a0bca7753f6b71e0a00d555c865d5d01c5b9504a81a1f0acfeaaf31f9092bef643dbd4
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  ruby_raider-*.gem
2
2
  .idea/
3
- ruby_raider.iml
3
+ ruby_raider.iml
4
+ Gemfile.lock
@@ -1,137 +1,38 @@
1
1
  require_relative 'file_generator'
2
+ require_relative '../templates/automation/abstract_page_template'
3
+ require_relative '../templates/automation/abstract_component_template'
4
+ require_relative '../templates/automation/component_template'
5
+ require_relative '../templates/automation/page_template'
2
6
 
3
7
  module RubyRaider
4
8
  class AutomationFileGenerator < FileGenerator
5
- def self.generate_automation_files(name, automation, framework)
6
- generate_file('abstract_page.rb', "#{name}/page_objects/abstract", abstract_page(automation, framework))
7
- generate_file('abstract_component.rb', "#{name}/page_objects/abstract", abstract_component(framework))
8
- generate_file('login_page.rb', "#{name}/page_objects/pages", example_page(automation))
9
- generate_file('header_component.rb', "#{name}/page_objects/components", example_component)
10
- end
11
-
12
- def self.example_page(automation)
13
- element = automation == 'watir' ? 'browser.element' : 'driver.find_element'
14
- page_file = ERB.new <<~EOF
15
- require_relative '../abstract/abstract_page'
16
- require_relative '../components/header_component'
17
-
18
- class LoginPage < AbstractPage
19
-
20
- using #{automation == 'watir' ? 'Raider::WatirHelper' : 'Raider::SeleniumHelper'}
21
-
22
- def url(_page)
23
- 'index.php?rt=account/login'
24
- end
25
-
26
- # Actions
27
-
28
- def login(username, password)
29
- username_field.send_keys username
30
- password_field.send_keys password
31
- login_button.click_when_present
32
- end
33
-
34
- # Components
35
-
36
- def header
37
- HeaderComponent.new(#{element}(class: 'menu_text'))
38
- end
39
-
40
- private
41
-
42
- # Elements
43
-
44
- def username_field
45
- #{element}(id: 'loginFrm_loginname')
46
- end
47
-
48
- def password_field
49
- #{element}(id: 'loginFrm_password')
50
- end
51
-
52
- def login_button
53
- #{element}(xpath: "//button[@title='Login']")
54
- end
55
- end
56
- EOF
57
- page_file.result(binding)
58
- end
59
-
60
- def self.abstract_page(automation, framework)
61
- browser = "def browser
62
- Raider::BrowserHelper.browser
63
- end"
64
- driver = "def driver
65
- Raider::DriverHelper.driver
66
- end"
67
- visit = automation == 'watir' ? 'browser.goto full_url(page.first)' : 'driver.navigate.to full_url(page.first)'
68
- raider = if framework == 'rspec'
69
- "require_relative '../../helpers/raider'"
70
- else
71
- "require_relative '../../features/support/helpers/raider'"
72
- end
73
- abstract_file = ERB.new <<~EOF
74
- require 'rspec'
75
- #{raider}
76
-
77
- class AbstractPage
78
-
79
- include RSpec::Matchers
80
- extend Raider::PomHelper
81
-
82
- #{automation == 'watir' ? browser : driver}
83
-
84
- def visit(*page)
85
- #{visit}
86
- end
87
-
88
- def full_url(*page)
89
- "#\{base_url}#\{url(*page)}"
90
- end
91
-
92
- def base_url
93
- 'https://automationteststore.com/'
94
- end
95
-
96
- def url(_page)
97
- raise 'Url must be defined on child pages'
98
- end
99
- end
100
- EOF
101
- abstract_file.result(binding)
102
- end
103
-
104
- def self.example_component
105
- page_file = ERB.new <<~EOF
106
- require_relative '../abstract/abstract_component'
107
-
108
- class HeaderComponent < AbstractComponent
109
-
110
- def customer_name
111
- @component.text
112
- end
113
- end
114
- EOF
115
- page_file.result(binding)
116
- end
117
-
118
- def self.abstract_component(framework)
119
- raider = if framework == 'rspec'
120
- "require_relative '../../helpers/raider'"
121
- else
122
- "require_relative '../../features/support/helpers/raider'"
123
- end
124
- abstract_file = ERB.new <<~EOF
125
- #{raider}
126
-
127
- class AbstractComponent
128
-
129
- def initialize(component)
130
- @component = component
131
- end
132
- end
133
- EOF
134
- abstract_file.result(binding)
9
+ class << self
10
+ def generate_automation_files(name, automation, framework)
11
+ generate_example_page(automation, name)
12
+ generate_abstract_page(automation, framework, name)
13
+ generate_example_component(name)
14
+ generate_abstract_component(framework, name)
15
+ end
16
+
17
+ def generate_example_page(automation, name)
18
+ generate_file('login_page.rb', "#{name}/page_objects/pages",
19
+ PageTemplate.new(automation: automation, name: name).parsed_body)
20
+ end
21
+
22
+ def generate_abstract_page(automation, framework, name)
23
+ generate_file('abstract_page.rb', "#{name}/page_objects/abstract",
24
+ AbstractPageTemplate.new(automation: automation, framework: framework, name: name).parsed_body)
25
+ end
26
+
27
+ def generate_example_component(name)
28
+ generate_file('header_component.rb',"#{name}/page_objects/components",
29
+ ComponentTemplate.new.parsed_body)
30
+ end
31
+
32
+ def generate_abstract_component(framework, name)
33
+ generate_file('abstract_component.rb',"#{name}/page_objects/abstract",
34
+ AbstractComponentTemplate.new(framework: framework).parsed_body)
35
+ end
135
36
  end
136
37
  end
137
38
  end
@@ -1,162 +1,34 @@
1
+ require_relative '../templates/common/config_template'
2
+ require_relative '../templates/common/gemfile_template'
3
+ require_relative '../templates/common/rake_file_template'
4
+ require_relative '../templates/common/read_me_template'
1
5
  require_relative 'file_generator'
2
6
 
3
7
  module RubyRaider
4
8
  class CommonFileGenerator < FileGenerator
5
- def self.generate_common_files(name, framework)
6
- generate_file('config.yml', "#{name}/config", config_file)
7
- generate_file('Rakefile', name.to_s, rake_file)
8
- generate_file('Readme.md', name.to_s, readme_file)
9
- generate_file('Gemfile', name.to_s, gemfile_template((framework)))
10
- end
11
-
12
- def self.readme_file
13
- rake_file = ERB.new <<~EOF
14
- What is Raider?
15
- ===========
16
-
17
- Raider is a tool to make the setup and start of automation projects in ruby easier, with one command you are
18
- ready to go
19
-
20
- # Pre-requisites:
21
-
22
- Install RVM:
23
- https://rvm.io/rvm/install
24
-
25
- # How to use the framework:
26
-
27
- If you want to run all the tests from your terminal do:
28
- *rspec spec/*
29
-
30
- If you want to run all the tests in parallel do:
31
- *parallel_rspec spec/*
32
-
33
- # How are specs organized:
34
-
35
- We use 'context' as the highest grouping level to indicate in which part of the application we are as an example:
36
-
37
- *context 'On the login page'/*
38
-
39
- We use 'describe' from the user perspective to describe an action that the user can or cannot take:
40
-
41
- *describe 'A user can'/*
42
-
43
- or
44
-
45
- *describe 'A user cannot'/*
46
-
47
- This saves us repetition and forces us into an structure
48
-
49
- At last we use 'it' for the specific action the user can or cannot perform:
50
-
51
- it 'login with right credentials'
52
-
53
- If we group all of this together it will look like
54
-
55
- ```ruby
56
- context 'On the login page' do
57
- describe 'A user can' do
58
- it 'login with the right credentials' do
59
- end
60
- #{' '}
61
- end
62
- #{' '}
63
- describe 'A user cannot' do
64
- it 'login with the wrong credentials' do
65
- end
66
- end
67
- end
68
- ```
69
- #{' '}
70
- This is readed as 'On the login page a user can login with the right credentials' and 'On the login page a user cannot login with the wrong credentials'
71
-
72
- # How pages are organized:
73
-
74
- ```ruby#{' '}
75
- require_relative '../abstract/base_page'
76
-
77
- class MainPage < BasePage
78
-
79
- using Raider::WatirHelper
80
-
81
- def url(_page)
82
- '/'
83
- end
84
-
85
- # Actions
86
-
87
- def change_currency(currency)
88
- currency_dropdown.select currency
89
- end
90
-
91
- # Validations
92
-
93
- def validate_currency(currency)
94
- expect(currency_dropdown.include?(currency)).to be true
95
- end
96
-
97
- private
98
-
99
- # Elements
100
-
101
- def currency_dropdown
102
- browser.select(class: %w[dropdown-menu currency])
103
- end
104
- end
105
- ```
106
-
107
- Pages are organized in Actions (things a user can perform on the page), Validations (assertions), and Elements.
108
- Each page has to have a url define, and each page is using the module WatirHelper to add methods on runtime to the Watir elements
109
-
110
- EOF
111
- rake_file.result(binding)
112
- end
113
-
114
- def self.config_file
115
- config_file = ERB.new <<~EOF
116
- browser: :chrome
117
- EOF
118
- config_file.result(binding)
119
- end
120
-
121
- def self.rake_file
122
- rake_file = ERB.new <<~EOF
123
- require 'yaml'
124
-
125
- desc 'Selects browser for automation run'
126
- task :select_browser, [:browser] do |_t, args|
127
- config = YAML.load_file('config/config.yml')
128
- config['browser'] = args.browser
129
- File.write('config/config.yml', config.to_yaml)
130
- end
131
- EOF
132
- rake_file.result(binding)
133
- end
9
+ class << self
10
+ def generate_common_files(name, framework)
11
+ generate_config_file(name)
12
+ generate_rake_file(name)
13
+ generate_readme_file(name)
14
+ generate_gemfile(framework, name)
15
+ end
134
16
 
135
- def self.gemfile_template(framework)
136
- if framework == 'cucumber'
137
- allure_cucumber = "gem 'allure-cucumber'"
138
- rspec = "gem 'rspec'"
17
+ def generate_readme_file(name)
18
+ generate_file('Readme.md', name.to_s, ReadMeTemplate.new.parsed_body)
139
19
  end
140
20
 
141
- gemfile = ERB.new <<~EOF
142
- # frozen_string_literal: true
21
+ def generate_config_file(name)
22
+ generate_file('config.yml', "#{name}/config", ConfigTemplate.new.parsed_body)
23
+ end
143
24
 
144
- source 'https://rubygems.org'
25
+ def generate_rake_file(name)
26
+ generate_file('Rakefile', name.to_s, ConfigTemplate.new.parsed_body)
27
+ end
145
28
 
146
- gem 'activesupport'
147
- gem 'allure-rspec'
148
- gem 'allure-ruby-commons'
149
- #{allure_cucumber}
150
- gem 'parallel_split_test'
151
- gem 'parallel_tests'
152
- gem 'rake'
153
- gem '#{framework}'
154
- #{rspec}
155
- gem 'selenium-webdriver'
156
- gem 'watir'
157
- gem 'webdrivers'
158
- EOF
159
- gemfile.result(binding)
29
+ def generate_gemfile(framework, name)
30
+ generate_file('Gemfile',name.to_s, GemfileTemplate.new(framework: framework).parsed_body)
31
+ end
160
32
  end
161
33
  end
162
34
  end
@@ -1,81 +1,33 @@
1
+ require_relative '../templates/cucumber/env_template'
2
+ require_relative '../templates/cucumber/example_feature_template'
3
+ require_relative '../templates/cucumber/example_steps_template'
1
4
  require_relative 'file_generator'
2
5
 
3
6
  module RubyRaider
4
7
  class CucumberFileGenerator < FileGenerator
5
- def self.generate_cucumber_files(name, automation)
6
- CommonFileGenerator.generate_common_files(name, 'cucumber')
7
- HelpersFileGenerator.generate_helper_files(name, automation, 'cucumber')
8
- generate_file('login.feature', "#{name}/features", example_feature)
9
- generate_file('login_steps.rb', "#{name}/features/step_definitions", example_steps)
10
- generate_file('env.rb', "#{name}/features/support", env(automation))
11
- AutomationFileGenerator.generate_automation_files(name, automation, 'framework')
12
- end
13
-
14
- def self.example_feature
15
- gemfile = ERB.new <<~EOF
16
- Feature: Login Page
17
-
18
- Scenario: A user can login
19
- Given I'm a registered user on the login page
20
- When I login with my credentials
21
- Then I can see the main page
22
-
23
- EOF
24
- gemfile.result(binding)
25
- end
26
-
27
- def self.example_steps
28
- gemfile = ERB.new <<~EOF
29
- require_relative '../../page_objects/pages/login_page'
30
-
31
- Given("I'm a registered user on the login page") do
32
- LoginPage.visit
33
- end
34
-
35
- When('I login with my credentials') do
36
- LoginPage.login('aguspe', '12341234')
37
- end
38
-
39
- When('I can see the main page') do
40
- expect(LoginPage.header.customer_name).to eq 'Welcome back Agustin'
41
- end
42
- EOF
43
- gemfile.result(binding)
44
- end
45
-
46
- def self.env(automation)
47
- if automation == 'watir'
48
- helper = 'helpers/browser_helper'
49
- browser = 'Raider::BrowserHelper.new_browser'
50
- get_browser = 'browser = Raider::BrowserHelper.new_browser'
51
- screenshot = 'browser.screenshot.save("allure-results/screenshots/#{scenario.name}.png")'
52
- quit = 'browser.quit'
53
- else
54
- helper = 'helpers/driver_helper'
55
- browser = 'Raider::DriverHelper.new_driver'
56
- get_browser = 'driver = Raider::DriverHelper.driver'
57
- screenshot = 'driver.save_screenshot("allure-results/screenshots/#{scenario.name}.png")'
58
- quit = 'driver.quit'
8
+ class << self
9
+ def generate_cucumber_files(name, automation)
10
+ AutomationFileGenerator.generate_automation_files(name, automation, 'framework')
11
+ CommonFileGenerator.generate_common_files(name, 'cucumber')
12
+ HelpersFileGenerator.generate_helper_files(name, automation, 'cucumber')
13
+ generate_env_file(automation, name)
14
+ generate_example_feature(name)
15
+ generate_example_steps(name)
59
16
  end
60
17
 
61
- gemfile = ERB.new <<~EOF
62
- require 'active_support/all'
63
- require_relative 'helpers/allure_helper'
64
- require_relative '#{helper}'
18
+ def generate_example_feature(name)
19
+ generate_file('login.feature', "#{name}/features", ExampleFeatureTemplate.new.parsed_body)
20
+ end
65
21
 
66
- Before do
67
- Raider::AllureHelper.configure
68
- #{browser}
69
- end
22
+ def generate_example_steps(name)
23
+ generate_file('login_steps.rb', "#{name}/features/step_definitions",
24
+ ExampleStepsTemplate.new.parsed_body)
25
+ end
70
26
 
71
- After do |scenario|
72
- #{get_browser}
73
- #{screenshot}
74
- Raider::AllureHelper.add_screenshot(scenario.name)
75
- #{quit}
76
- end
77
- EOF
78
- gemfile.result(binding)
27
+ def generate_env_file(automation, name)
28
+ generate_file('env.rb', "#{name}/features/support",
29
+ EnvTemplate.new(automation: automation).parsed_body)
30
+ end
79
31
  end
80
32
  end
81
33
  end
@@ -1,9 +1,11 @@
1
1
  module RubyRaider
2
2
  class FileGenerator
3
- def self.generate_file(name, path, content)
4
- file_path = "#{path}/#{name}"
5
- File.new(file_path, 'w+')
6
- File.write(file_path, content)
3
+ class << self
4
+ def generate_file(name, path, content)
5
+ file_path = "#{path}/#{name}"
6
+ File.new(file_path, 'w+')
7
+ File.write(file_path, content)
8
+ end
7
9
  end
8
10
  end
9
- end
11
+ end