ruby_raider 0.1.0 → 0.1.4

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.
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
  - - ">="