ruby_raider 0.1.0 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19b563b9d03ec039ab3ca024593006e1ae78767a1005f8c8f7fa3f3182dbf5dc
4
- data.tar.gz: 289e1c754007426dc2048e4eaa930ff96518057ec273f985b2a8c8273d044880
3
+ metadata.gz: 47cababb68c29a1a13ad36bb58a37f67aa9b0aad02a329a1fe3215af3cfa1174
4
+ data.tar.gz: 44f078d705101b3e233a06b1b5e6f30b7ff730a9923647c681faf7689c676d69
5
5
  SHA512:
6
- metadata.gz: 9a91ae26cb2ca9425fd43a7c5a4e3c501d846c15d0e37794428df32c1702f6e2f3f35c7fcd7a5d0f164d8c5c818813060998bef64012d9f638794159409fcacc
7
- data.tar.gz: 59fe1a44eef08555bf878615406a861378cc6d373a90eeeecfd0996b9bfecfff5b730543d9eab7eb503097e0614bf4d9930671011205d65087a60d9522ee8447
6
+ metadata.gz: a638b7050b95dfde750279a26722abb645f56f175f4729e02af8f6acad0f2b3448617aaddaf87dbc7fd14b417dca56048d52dfe2e936f26f52b94f2320818f02
7
+ data.tar.gz: 0e28acc526f8d775704e8642b3a7ac7a9da35d1d399acf7949b3c4bb6bd9a39694ce5f5e460ba5050d94923597c507f55561c64b94533da7ef58118385e18eb0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ ruby_raider-*.gem
2
+ .idea/
3
+ ruby_raider.iml
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
data/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # ruby_raider
2
+ This is a gem to make setup and start of UI automation projects easier
3
+
4
+ Just do:
5
+
6
+ **gem install ruby_raider**
7
+
8
+ then do:
9
+
10
+ **raider [name_of_project]**
11
+
12
+ and you will have a new project in the folder you are in
13
+
14
+ Currently we only support:
15
+
16
+ * Gerating a Selenium with Rspec framework
17
+ * Gerating a Watir with Rspec framework
18
+
19
+ We have only tested this in mac and linux, so it works in both platforms.
20
+
21
+ If you wanna follow the development progress
22
+
23
+ https://trello.com/b/Nj7UPy0w/ruby-raider
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require_relative 'lib/ruby_raider'
2
+
3
+ desc 'Create a new test projects'
4
+ task :new, [:name] do |_t, args|
5
+ RubyRaider.generate_project(args.name)
6
+ end
data/bin/raider ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/ruby_raider'
4
+
5
+ RubyRaider.generate_project ARGV[0]
@@ -0,0 +1,137 @@
1
+ require_relative 'file_generator'
2
+
3
+ module RubyRaider
4
+ 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)
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,162 @@
1
+ require_relative 'file_generator'
2
+
3
+ module RubyRaider
4
+ 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
134
+
135
+ def self.gemfile_template(framework)
136
+ if framework == 'cucumber'
137
+ allure_cucumber = "gem 'allure-cucumber'"
138
+ rspec = "gem 'rspec'"
139
+ end
140
+
141
+ gemfile = ERB.new <<~EOF
142
+ # frozen_string_literal: true
143
+
144
+ source 'https://rubygems.org'
145
+
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)
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,81 @@
1
+ require_relative 'file_generator'
2
+
3
+ module RubyRaider
4
+ 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'
59
+ end
60
+
61
+ gemfile = ERB.new <<~EOF
62
+ require 'active_support/all'
63
+ require_relative 'helpers/allure_helper'
64
+ require_relative '#{helper}'
65
+
66
+ Before do
67
+ Raider::AllureHelper.configure
68
+ #{browser}
69
+ end
70
+
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)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,9 @@
1
+ module RubyRaider
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)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,244 @@
1
+ require_relative 'file_generator'
2
+
3
+ module RubyRaider
4
+ class HelpersFileGenerator < FileGenerator
5
+ def self.generate_helper_files(name, automation, framework)
6
+ path = framework == 'rspec' ? "#{name}/helpers" : "#{name}/features/support/helpers"
7
+ generate_file('raider.rb', path, generate_raider_helper(automation, framework))
8
+ generate_file('allure_helper.rb', path, generate_allure_helper(framework))
9
+ generate_file('pom_helper.rb', path, generate_pom_helper)
10
+ generate_file('spec_helper.rb', path, generate_spec_helper((automation))) if framework == 'rspec'
11
+ if automation == 'watir'
12
+ generate_file('watir_helper.rb', path, generate_watir_helper)
13
+ generate_file('browser_helper.rb', path, generate_browser_helper)
14
+ else
15
+ generate_file('selenium_helper.rb', path, generate_selenium_helper)
16
+ generate_file('driver_helper.rb', path, generate_driver_helper)
17
+ end
18
+ end
19
+
20
+ def self.generate_raider_helper(automation, framework)
21
+ spec = ERB.new <<~EOF
22
+ module Raider
23
+ #{"require_relative 'spec_helper'" if framework == 'rspec'}
24
+ require_relative '#{automation}_helper'
25
+ require_relative 'pom_helper'
26
+ require_relative '#{automation == 'watir' ? 'browser_helper' : 'driver_helper'}'
27
+ require_relative 'allure_helper'
28
+ end
29
+ EOF
30
+
31
+ spec.result(binding)
32
+ end
33
+
34
+ def self.generate_allure_helper(framework)
35
+ if framework == 'cucumber'
36
+ gems = "require 'allure-cucumber'"
37
+ allure = 'AllureCucumber'
38
+ else
39
+ gems = "require 'allure-ruby-commons'
40
+ require 'allure-rspec'"
41
+ allure = 'AllureRspec'
42
+ end
43
+ spec = ERB.new <<~EOF
44
+ #{gems}
45
+
46
+ module Raider
47
+ module AllureHelper
48
+ class << self
49
+
50
+ def configure
51
+ #{allure}.configure do |config|
52
+ config.results_directory = 'allure-results'
53
+ config.clean_results_directory = true
54
+ end
55
+ end
56
+
57
+ def add_screenshot(screenshot_name)
58
+ Allure.add_attachment(
59
+ name: name,
60
+ source: "File.open(allure-results/screenshots/\#{screenshot_name}.png)",
61
+ type: Allure::ContentType::PNG,
62
+ test_case: true
63
+ )
64
+ end
65
+
66
+ #{
67
+ if framework == 'rspec'
68
+ 'def formatter
69
+ AllureRspecFormatter
70
+ end'
71
+ end }
72
+ end
73
+ end
74
+ end
75
+ EOF
76
+ spec.result(binding)
77
+ end
78
+
79
+ def self.generate_browser_helper
80
+ spec = ERB.new <<~EOF
81
+ require 'yaml'
82
+ require 'selenium-webdriver'
83
+ require 'watir'
84
+ require 'webdrivers'
85
+
86
+ module Raider
87
+ module BrowserHelper
88
+ class << self
89
+ attr_reader :browser
90
+
91
+ def new_browser
92
+ config = YAML.load_file('config/config.yml')
93
+ @browser = Watir::Browser.new config['browser']
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ EOF
100
+ spec.result(binding)
101
+ end
102
+
103
+ def self.generate_pom_helper
104
+ spec = ERB.new <<~EOF
105
+ module Raider
106
+ module PomHelper
107
+ def instance
108
+ @instance ||= new
109
+ end
110
+
111
+ def method_missing(message, *args, &block)
112
+ return super unless instance.respond_to?(message)
113
+
114
+ instance.public_send(message, *args, &block)
115
+ end
116
+
117
+ def respond_to_missing?(method, *_args, &block)
118
+ instance.respond_to?(method) || super
119
+ end
120
+ end
121
+ end
122
+ EOF
123
+ spec.result(binding)
124
+ end
125
+
126
+ def self.generate_spec_helper(automation)
127
+ spec = ERB.new <<~EOF
128
+ require 'active_support/all'
129
+ require 'rspec'
130
+ require_relative 'allure_helper'
131
+ require_relative '#{automation == 'watir' ? 'browser_helper' : 'driver_helper'}'
132
+
133
+ module Raider
134
+ module SpecHelper
135
+
136
+ AllureHelper.configure
137
+
138
+ RSpec.configure do |config|
139
+ config.formatter = AllureHelper.formatter
140
+ config.before(:each) do
141
+ #{automation == 'watir' ? 'BrowserHelper.new_browser' : 'DriverHelper.new_driver'}
142
+ end
143
+
144
+ config.after(:each) do
145
+ #{automation == 'watir' ? 'browser = BrowserHelper.browser' : 'driver = DriverHelper.driver'}
146
+ example_name = self.class.descendant_filtered_examples.first.description
147
+ status = self.class.descendant_filtered_examples.first.execution_result.status
148
+ #{automation == 'watir' ? 'browser' : 'driver'}.save_screenshot("allure-results/screenshots/#\{example_name}.png") if status == :failed
149
+ AllureHelper.add_screenshot example_name if status == :failed
150
+ #{automation == 'watir' ? 'browser.quit' : 'driver.quit'}
151
+ end
152
+ end
153
+ end
154
+ end
155
+ EOF
156
+ spec.result(binding)
157
+ end
158
+
159
+ def self.generate_watir_helper
160
+ spec = ERB.new <<~EOF
161
+ require 'watir'
162
+
163
+ module Raider
164
+ module WatirHelper
165
+ refine Watir::Element do
166
+ def click_when_present
167
+ wait_until_present
168
+ self.click
169
+ end
170
+
171
+ def wait_until_present
172
+ self.wait_until(&:present?)
173
+ end
174
+ end
175
+ end
176
+ end
177
+ EOF
178
+ spec.result(binding)
179
+ end
180
+
181
+ def self.generate_selenium_helper
182
+ spec = ERB.new <<~EOF
183
+ require 'selenium-webdriver'
184
+ require_relative 'driver_helper'
185
+
186
+ module Raider
187
+ module SeleniumHelper
188
+ def click_when_present
189
+ # This is an example of an implicit wait in selenium
190
+ wait = Selenium::WebDriver::Wait.new(timeout: 15)
191
+ wait.until { present? }
192
+ click
193
+ end
194
+
195
+ def select_by(key, value)
196
+ # Creates new Select object to use the select by method
197
+ dropdown = Selenium::WebDriver::Support::Select.new self
198
+ dropdown.select_by(key, value)
199
+ end
200
+
201
+ def hover
202
+ # Using actions to move the mouse over an element
203
+ DriverHelper.driver.action.move_to(self).perform
204
+ end
205
+
206
+ # How to perform right click through the context click method
207
+ def right_click
208
+ DriverHelper.driver.action.context_click(self).perform
209
+ end
210
+ end
211
+
212
+ # Here we are opening the selenium class and adding our custom method
213
+ class Selenium::WebDriver::Element
214
+ include SeleniumHelper
215
+ end
216
+ end
217
+
218
+ EOF
219
+ spec.result(binding)
220
+ end
221
+
222
+ def self.generate_driver_helper
223
+ spec = ERB.new <<~EOF
224
+ require 'selenium-webdriver'
225
+ require 'watir'
226
+ require 'webdrivers'
227
+ require 'yaml'
228
+
229
+ module Raider
230
+ module DriverHelper
231
+ class << self
232
+ attr_reader :driver
233
+
234
+ def new_driver
235
+ @driver = Selenium::WebDriver.for :chrome
236
+ end
237
+ end
238
+ end
239
+ end
240
+ EOF
241
+ spec.result(binding)
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,58 @@
1
+ require_relative 'common_file_generator'
2
+ require_relative 'file_generator'
3
+ require_relative 'helpers_file_generator'
4
+ require_relative 'automation_file_generator'
5
+
6
+ module RubyRaider
7
+ class RspecFileGenerator < FileGenerator
8
+ def self.generate_rspec_files(name, automation)
9
+ CommonFileGenerator.generate_common_files(name, 'rspec')
10
+ HelpersFileGenerator.generate_helper_files(name, automation, 'rspec')
11
+ generate_file('login_page_spec.rb', "#{name}/spec", generate_example_spec)
12
+ generate_file('base_spec.rb', "#{name}/spec", generate_base_spec)
13
+ AutomationFileGenerator.generate_automation_files(name, automation, 'rspec')
14
+ end
15
+
16
+ def self.generate_example_spec
17
+ spec = ERB.new <<~EOF
18
+ require_relative 'base_spec'
19
+ require_relative '../page_objects/pages/login_page'
20
+
21
+ class LoginSpec < BaseSpec
22
+ context 'On the Login Page' do
23
+
24
+ before(:each) do
25
+ LoginPage.visit
26
+ end
27
+
28
+ describe 'A user can' do
29
+ it 'login with the right credentials', :JIRA_123 do
30
+ LoginPage.login('aguspe', '12341234')
31
+ expect(LoginPage.header.customer_name).to eq 'Welcome back Agustin'
32
+ end
33
+ end
34
+
35
+ describe 'A user cannot' do
36
+ it 'login with the wrong credentials', :JIRA_123 do
37
+ LoginPage.login('aguspe', 'wrongPassword')
38
+ expect(LoginPage.header.customer_name).to be_empty
39
+ end
40
+ end
41
+ end
42
+ end
43
+ EOF
44
+ spec.result(binding)
45
+ end
46
+
47
+ def self.generate_base_spec
48
+ spec = ERB.new <<~EOF
49
+ require_relative '../helpers/raider'
50
+
51
+ class BaseSpec
52
+ include Raider::SpecHelper
53
+ end
54
+ EOF
55
+ spec.result(binding)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,45 @@
1
+ require 'highline'
2
+ require_relative '../generators/projects/cucumber_project_generator'
3
+ require_relative '../generators/projects/rspec_project_generator'
4
+
5
+ module RubyRaider
6
+ class MenuGenerator
7
+ def self.generate_choice_menu(project_name)
8
+ cli = HighLine.new
9
+ cli.choose do |menu|
10
+ menu.prompt = 'Please select your automation framework'
11
+ menu.choice(:Selenium) { choose_test_framework('selenium', project_name) }
12
+ menu.choice(:Watir) { choose_test_framework('watir', project_name) }
13
+ menu.choice(:Quit, 'Exit program.') { exit }
14
+ end
15
+ end
16
+
17
+ def self.choose_test_framework(automation, project_name)
18
+ system('clear') || system('cls')
19
+ sleep 0.3
20
+ cli = HighLine.new
21
+ framework = ''
22
+ cli.choose do |menu|
23
+ menu.prompt = 'Please select your test framework'
24
+ menu.choice(:Rspec) do
25
+ framework = 'rspec'
26
+ set_framework(automation, framework, project_name)
27
+ end
28
+ menu.choice(:Cucumber) do
29
+ framework = 'cucumber'
30
+ set_framework(automation, framework, project_name)
31
+ end
32
+ menu.choice(:Quit, 'Exit program.') { exit }
33
+ end
34
+ cli.say("You have chosen to use #{framework} with #{automation}")
35
+ end
36
+
37
+ def self.set_framework(automation, framework, project_name)
38
+ if framework == 'rspec'
39
+ RspecProjectGenerator.generate_rspec_project(project_name, automation: automation)
40
+ else
41
+ CucumberProjectGenerator.generate_cucumber_project(project_name, automation: automation)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../files/cucumber_file_generator'
2
+ require_relative 'project_generator'
3
+
4
+ module RubyRaider
5
+ class CucumberProjectGenerator < ProjectGenerator
6
+ def self.generate_cucumber_project(name, automation: 'watir')
7
+ cucumber_folder_structure(name)
8
+ CucumberFileGenerator.generate_cucumber_files(name, automation)
9
+ ProjectGenerator.install_gems(name)
10
+ end
11
+
12
+ def self.cucumber_folder_structure(name)
13
+ Dir.mkdir name.to_s
14
+ folders = %w[features config page_objects allure-results]
15
+ create_children_folders("#{name}", folders)
16
+ folders = %w[step_definitions support]
17
+ create_children_folders("#{name}/features", folders)
18
+ Dir.mkdir "#{name}/features/support/helpers"
19
+ folders = %w[abstract pages components]
20
+ create_children_folders("#{name}/page_objects", folders)
21
+ Dir.mkdir "#{name}/allure-results/screenshots"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ module RubyRaider
2
+ class ProjectGenerator
3
+ def self.create_children_folders(parent, folders)
4
+ folders.each { |folder| Dir.mkdir "#{parent}/#{folder}" }
5
+ end
6
+
7
+ def self.install_gems(name)
8
+ system "cd #{name} && gem install bundler && bundle install"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'project_generator'
2
+ require_relative '../files/rspec_file_generator'
3
+
4
+ module RubyRaider
5
+ class RspecProjectGenerator < ProjectGenerator
6
+ def self.generate_rspec_project(name, automation: 'watir')
7
+ rspec_folder_structure(name)
8
+ RspecFileGenerator.generate_rspec_files(name, automation)
9
+ ProjectGenerator.install_gems(name)
10
+ end
11
+
12
+ def self.rspec_folder_structure(name)
13
+ Dir.mkdir name.to_s
14
+ folders = %w[config data page_objects helpers spec]
15
+ create_children_folders(name, folders)
16
+ pages = %w[pages components abstract]
17
+ create_children_folders("#{name}/page_objects", pages)
18
+ end
19
+ end
20
+ end
data/lib/ruby_raider.rb CHANGED
@@ -1,4 +1,11 @@
1
- class RubyRaider
1
+ require_relative 'generators/menu_generator'
2
+ require_relative 'generators/projects/cucumber_project_generator'
3
+ require_relative 'generators/projects/project_generator'
4
+ require_relative 'generators/projects/rspec_project_generator'
2
5
 
6
+ module RubyRaider
7
+ extend self
8
+ def generate_project(project_name)
9
+ MenuGenerator.generate_choice_menu(project_name)
10
+ end
3
11
  end
4
-
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'ruby_raider'
3
+ s.version = '0.1.4'
4
+ s.summary = 'A gem to make setup and start of UI automation projects easier'
5
+ s.description = 'This gem contents everything you need to start doing web automation in one simple package'
6
+ s.authors = ['Agustin Pequeno']
7
+ s.email = 'agustin.pe94@gmail.com'
8
+ s.homepage = 'http://github.com/aguspe/ruby_raider'
9
+ s.files = %w[bin/* lib/* lib/**/*]
10
+ s.license = 'MIT'
11
+ s.required_ruby_version = '>= 3.0.0'
12
+ s.files = `git ls-files -z`.split("\x0")
13
+ s.bindir = 'bin'
14
+ s.executables << 'raider'
15
+ s.add_development_dependency 'rake', '~> 13.0.6'
16
+ s.add_development_dependency 'rspec', '~> 3.11.0'
17
+
18
+ s.add_runtime_dependency 'highline', '~> 2.0.3'
19
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../lib/generators/files/automation_file_generator'
2
+ require_relative 'spec_helper'
3
+
4
+ describe RubyRaider::AutomationFileGenerator do
5
+ it 'creates a login page file' do
6
+ expect(File.exist?("#{@project_name}/page_objects/pages/login_page.rb")).to be_truthy
7
+ end
8
+
9
+ it 'creates an abstract page file' do
10
+ expect(File.exist?("#{@project_name}/page_objects/abstract/abstract_page.rb")).to be_truthy
11
+ end
12
+
13
+ it 'creates an abstract component file' do
14
+ expect(File.exist?("#{@project_name}/page_objects/abstract/abstract_component.rb")).to be_truthy
15
+ end
16
+
17
+ it 'creates a component file' do
18
+ expect(File.exist?("#{@project_name}/page_objects/components/header_component.rb")).to be_truthy
19
+ end
20
+
21
+ it 'creates a gemfile file' do
22
+ expect(File.exist?("#{@project_name}/Gemfile")).to be_truthy
23
+ end
24
+ end
25
+
@@ -0,0 +1,18 @@
1
+ require_relative '../lib/generators/files/common_file_generator'
2
+ require_relative 'spec_helper'
3
+
4
+ describe RubyRaider::CommonFileGenerator do
5
+ it 'creates a config file' do
6
+ expect(File.exist?("#{@project_name}/config/config.yml")).to be_truthy
7
+ end
8
+
9
+ it 'creates a rake file' do
10
+ expect(File.exist?("#{@project_name}/Rakefile")).to be_truthy
11
+ end
12
+
13
+ it 'creates a readMe file' do
14
+ expect(File.exist?("#{@project_name}/Readme.md")).to be_truthy
15
+ end
16
+ end
17
+
18
+
@@ -0,0 +1,31 @@
1
+ require_relative '../lib/generators/files/helpers_file_generator'
2
+ require_relative 'spec_helper'
3
+
4
+ describe RubyRaider::HelpersFileGenerator do
5
+ it 'creates a raider file' do
6
+ expect(File.exist?("#{@project_name}/helpers/raider.rb")).to be_truthy
7
+ end
8
+
9
+ it 'creates an allure helper file' do
10
+ expect(File.exist?("#{@project_name}/helpers/allure_helper.rb")).to be_truthy
11
+ end
12
+
13
+ it 'creates a browser helper file' do
14
+ expect(File.exist?("#{@project_name}/helpers/browser_helper.rb")).to be_truthy
15
+ end
16
+
17
+ it 'creates a pom helper file' do
18
+ expect(File.exist?("#{@project_name}/helpers/pom_helper.rb")).to be_truthy
19
+ end
20
+
21
+ it 'creates a spec helper file' do
22
+ expect(File.exist?("#{@project_name}/helpers/spec_helper.rb")).to be_truthy
23
+ end
24
+
25
+ it 'creates a watir helper file' do
26
+ expect(File.exist?("#{@project_name}/helpers/allure_helper.rb")).to be_truthy
27
+ end
28
+ end
29
+
30
+
31
+
@@ -0,0 +1,8 @@
1
+ require_relative '../lib/generators/menu_generator'
2
+
3
+ describe 'A menu is generated' do
4
+ it 'generates a menu' do
5
+ menu = RubyRaider::MenuGenerator.new
6
+ menu.generate_choice_menu
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../lib/generators/files/rspec_file_generator'
2
+ require_relative 'spec_helper'
3
+
4
+ describe RubyRaider::RspecFileGenerator do
5
+ it 'creates a spec file' do
6
+ expect(File.exist?("#{@project_name}/spec/login_page_spec.rb")).to be_truthy
7
+ end
8
+
9
+ it 'creates the base spec file' do
10
+ expect(File.exist?("#{@project_name}/spec/base_spec.rb")).to be_truthy
11
+ end
12
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe RubyRaider::RspecProjectGenerator do
4
+ it 'creates a project folder' do
5
+ expect(Dir.exist?(@project_name)).to be_truthy
6
+ end
7
+
8
+ it 'creates a spec folder' do
9
+ expect(Dir.exist?("#{@project_name}/spec")).to be_truthy
10
+ end
11
+
12
+ it 'creates a page objects folder' do
13
+ expect(Dir.exist?("#{@project_name}/page_objects")).to be_truthy
14
+ end
15
+
16
+ it 'creates an abstract page object folder' do
17
+ expect(Dir.exist?("#{@project_name}/page_objects/abstract")).to be_truthy
18
+ end
19
+
20
+ it 'creates a pages folder' do
21
+ expect(Dir.exist?("#{@project_name}/page_objects/pages")).to be_truthy
22
+ end
23
+
24
+ it 'creates a components folder' do
25
+ expect(Dir.exist?("#{@project_name}/page_objects/components")).to be_truthy
26
+ end
27
+
28
+ it 'creates a helper folder' do
29
+ expect(Dir.exist?("#{@project_name}/helpers")).to be_truthy
30
+ end
31
+
32
+ it 'creates a data folder' do
33
+ expect(Dir.exist?("#{@project_name}/data")).to be_truthy
34
+ end
35
+
36
+ it 'creates a config folder' do
37
+ expect(Dir.exist?("#{@project_name}/config")).to be_truthy
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../lib/generators/projects/rspec_project_generator'
2
+ require 'fileutils'
3
+ require 'rspec'
4
+
5
+ RSpec.configure do |config|
6
+ config.before(:all) do
7
+ @project_name = 'test'
8
+ RubyRaider::RspecProjectGenerator.generate_rspec_project @project_name
9
+ end
10
+
11
+ config.after(:all) do
12
+ FileUtils.rm_rf(@project_name)
13
+ end
14
+ end
metadata CHANGED
@@ -1,38 +1,90 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_raider
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agustin Pequeno
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-20 00:00:00.000000000 Z
11
+ date: 2022-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 13.0.6
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 13.0.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.11.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.11.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: highline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.3
27
55
  description: This gem contents everything you need to start doing web automation in
28
56
  one simple package
29
57
  email: agustin.pe94@gmail.com
30
- executables: []
58
+ executables:
59
+ - raider
31
60
  extensions: []
32
61
  extra_rdoc_files: []
33
62
  files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - README.md
66
+ - Rakefile
67
+ - bin/raider
68
+ - lib/generators/files/automation_file_generator.rb
69
+ - lib/generators/files/common_file_generator.rb
70
+ - lib/generators/files/cucumber_file_generator.rb
71
+ - lib/generators/files/file_generator.rb
72
+ - lib/generators/files/helpers_file_generator.rb
73
+ - lib/generators/files/rspec_file_generator.rb
74
+ - lib/generators/menu_generator.rb
75
+ - lib/generators/projects/cucumber_project_generator.rb
76
+ - lib/generators/projects/project_generator.rb
77
+ - lib/generators/projects/rspec_project_generator.rb
34
78
  - lib/ruby_raider.rb
35
- homepage: https://rubygems.org/gems/ruby_raider
79
+ - ruby_raider.gemspec
80
+ - spec/automation_file_generator_spec.rb
81
+ - spec/common_file_generator_spec.rb
82
+ - spec/helpers_file_generator_spec.rb
83
+ - spec/menu_generator_spec.rb
84
+ - spec/rspec_file_generator_spec.rb
85
+ - spec/rspec_project_generator_spec.rb
86
+ - spec/spec_helper.rb
87
+ homepage: http://github.com/aguspe/ruby_raider
36
88
  licenses:
37
89
  - MIT
38
90
  metadata: {}
@@ -44,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
96
  requirements:
45
97
  - - ">="
46
98
  - !ruby/object:Gem::Version
47
- version: '0'
99
+ version: 3.0.0
48
100
  required_rubygems_version: !ruby/object:Gem::Requirement
49
101
  requirements:
50
102
  - - ">="