ruby_raider 0.1.5 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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