ruby_raider 0.1.0 → 0.1.1
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 +4 -4
- data/.gitignore +1 -0
- data/.idea/.gitignore +8 -0
- data/.idea/modules.xml +8 -0
- data/.idea/ruby_raider.iml +20 -0
- data/README.md +9 -0
- data/Rakefile +6 -0
- data/bin/raider +5 -0
- data/lib/generators/files/common_file_generator.rb +134 -0
- data/lib/generators/files/file_generator.rb +9 -0
- data/lib/generators/files/helpers_file_generator.rb +163 -0
- data/lib/generators/files/rspec_file_generator.rb +61 -0
- data/lib/generators/files/watir_file_generator.rb +144 -0
- data/lib/generators/menu_generator.rb +35 -0
- data/lib/generators/projects/cucumber_project_generator.rb +14 -0
- data/lib/generators/projects/project_generator.rb +11 -0
- data/lib/generators/projects/rspec_project_generator.rb +23 -0
- data/lib/ruby_raider.rb +9 -2
- data/ruby_raider.gemspec +18 -0
- data/spec/common_file_generator_spec.rb +18 -0
- data/spec/helpers_file_generator_spec.rb +31 -0
- data/spec/menu_generator_spec.rb +8 -0
- data/spec/rspec_file_generator_spec.rb +12 -0
- data/spec/rspec_project_generator_spec.rb +39 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/watir_file_generator_spec.rb +25 -0
- metadata +45 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8d336aefa187b06c4299321d8a8a4b66235dfd14974845e70006632a6450899
|
4
|
+
data.tar.gz: 10228a61500f16e12590d59f84363b7b85d186e79bf1cfb2967b63ae7788d00b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b87195baaa2521f54deddc1c6e62ebf04a52f13f6e8880c5071f5a6ea43e3282ee14b7d121a98eee8435eb2d584fa4a5190675771eab8061409d7aeffb3d1e54
|
7
|
+
data.tar.gz: '0425969814d7f081fcacb71b510d5b5aa79d195a53511ab1b3028be602212533ad74e0150b53091ebbc43e27161c535e68c819ce483ffa8d2e423a9c1f2e814a'
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby_raider-*.gem
|
data/.idea/.gitignore
ADDED
data/.idea/modules.xml
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project version="4">
|
3
|
+
<component name="ProjectModuleManager">
|
4
|
+
<modules>
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/ruby_raider.iml" filepath="$PROJECT_DIR$/.idea/ruby_raider.iml" />
|
6
|
+
</modules>
|
7
|
+
</component>
|
8
|
+
</project>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="ModuleRunConfigurationManager">
|
4
|
+
<shared />
|
5
|
+
</component>
|
6
|
+
<component name="NewModuleRootManager">
|
7
|
+
<content url="file://$MODULE_DIR$">
|
8
|
+
<sourceFolder url="file://$MODULE_DIR$/features" isTestSource="true" />
|
9
|
+
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
|
10
|
+
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
11
|
+
</content>
|
12
|
+
<orderEntry type="jdk" jdkName="RVM: ruby-3.0.0" jdkType="RUBY_SDK" />
|
13
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
14
|
+
</component>
|
15
|
+
<component name="RakeTasksCache">
|
16
|
+
<option name="myRootTask">
|
17
|
+
<RakeTaskImpl id="rake" />
|
18
|
+
</option>
|
19
|
+
</component>
|
20
|
+
</module>
|
data/README.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# ruby_raider
|
2
|
+
This is a gem to make setup and start of UI automation projects easier
|
3
|
+
|
4
|
+
In order to run ruby raider you need to run the executable,
|
5
|
+
after you can select the automation framework of your choice and the test framework of your choice.
|
6
|
+
|
7
|
+
Currently we only support Watir with Rspec.
|
8
|
+
|
9
|
+
We have only tested this in mac and linux, so it works in both platforms.
|
data/Rakefile
ADDED
data/bin/raider
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require_relative 'file_generator'
|
2
|
+
|
3
|
+
module RubyRaider
|
4
|
+
class CommonFileGenerator < FileGenerator
|
5
|
+
def self.generate_common_files(name)
|
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
|
+
end
|
10
|
+
|
11
|
+
def self.readme_file
|
12
|
+
rake_file = ERB.new <<~EOF
|
13
|
+
What is Raider?
|
14
|
+
===========
|
15
|
+
|
16
|
+
Raider is a tool to make the setup and start of automation projects in ruby easier, with one command you are
|
17
|
+
ready to go
|
18
|
+
|
19
|
+
# Pre-requisites:
|
20
|
+
|
21
|
+
Install RVM:
|
22
|
+
https://rvm.io/rvm/install
|
23
|
+
|
24
|
+
# How to use the framework:
|
25
|
+
|
26
|
+
If you want to run all the tests from your terminal do:
|
27
|
+
*rspec spec/*
|
28
|
+
|
29
|
+
If you want to run all the tests in parallel do:
|
30
|
+
*parallel_rspec spec/*
|
31
|
+
|
32
|
+
# How are specs organized:
|
33
|
+
|
34
|
+
We use 'context' as the highest grouping level to indicate in which part of the application we are as an example:
|
35
|
+
|
36
|
+
*context 'On the login page'/*
|
37
|
+
|
38
|
+
We use 'describe' from the user perspective to describe an action that the user can or cannot take:
|
39
|
+
|
40
|
+
*describe 'A user can'/*
|
41
|
+
|
42
|
+
or
|
43
|
+
|
44
|
+
*describe 'A user cannot'/*
|
45
|
+
|
46
|
+
This saves us repetition and forces us into an structure
|
47
|
+
|
48
|
+
At last we use 'it' for the specific action the user can or cannot perform:
|
49
|
+
|
50
|
+
it 'login with right credentials'
|
51
|
+
|
52
|
+
If we group all of this together it will look like
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
context 'On the login page' do
|
56
|
+
describe 'A user can' do
|
57
|
+
it 'login with the right credentials' do
|
58
|
+
end
|
59
|
+
#{' '}
|
60
|
+
end
|
61
|
+
#{' '}
|
62
|
+
describe 'A user cannot' do
|
63
|
+
it 'login with the wrong credentials' do
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
```
|
68
|
+
#{' '}
|
69
|
+
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'
|
70
|
+
|
71
|
+
# How pages are organized:
|
72
|
+
|
73
|
+
```ruby#{' '}
|
74
|
+
require_relative '../abstract/base_page'
|
75
|
+
|
76
|
+
class MainPage < BasePage
|
77
|
+
|
78
|
+
using Raider::WatirHelper
|
79
|
+
|
80
|
+
def url(_page)
|
81
|
+
'/'
|
82
|
+
end
|
83
|
+
|
84
|
+
# Actions
|
85
|
+
|
86
|
+
def change_currency(currency)
|
87
|
+
currency_dropdown.select currency
|
88
|
+
end
|
89
|
+
|
90
|
+
# Validations
|
91
|
+
|
92
|
+
def validate_currency(currency)
|
93
|
+
expect(currency_dropdown.include?(currency)).to be true
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
# Elements
|
99
|
+
|
100
|
+
def currency_dropdown
|
101
|
+
browser.select(class: %w[dropdown-menu currency])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
```
|
105
|
+
|
106
|
+
Pages are organized in Actions (things a user can perform on the page), Validations (assertions), and Elements.
|
107
|
+
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
|
108
|
+
|
109
|
+
EOF
|
110
|
+
rake_file.result(binding)
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.config_file
|
114
|
+
config_file = ERB.new <<~EOF
|
115
|
+
browser: :chrome
|
116
|
+
EOF
|
117
|
+
config_file.result(binding)
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.rake_file
|
121
|
+
rake_file = ERB.new <<~EOF
|
122
|
+
require 'yaml'
|
123
|
+
|
124
|
+
desc 'Selects browser for automation run'
|
125
|
+
task :select_browser, [:browser] do |_t, args|
|
126
|
+
config = YAML.load_file('config/config.yml')
|
127
|
+
config['browser'] = args.browser
|
128
|
+
File.write('config/config.yml', config.to_yaml)
|
129
|
+
end
|
130
|
+
EOF
|
131
|
+
rake_file.result(binding)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require_relative 'file_generator'
|
2
|
+
|
3
|
+
module RubyRaider
|
4
|
+
class HelpersFileGenerator < FileGenerator
|
5
|
+
def self.generate_helper_files(name)
|
6
|
+
generate_file('raider.rb', "#{name}/helpers", generate_raider_helper)
|
7
|
+
generate_file('allure_helper.rb', "#{name}/helpers", generate_allure_helper)
|
8
|
+
generate_file('browser_helper.rb', "#{name}/helpers", generate_browser_helper)
|
9
|
+
generate_file('pom_helper.rb', "#{name}/helpers", generate_pom_helper)
|
10
|
+
generate_file('watir_helper.rb', "#{name}/helpers", generate_watir_helper)
|
11
|
+
generate_file('spec_helper.rb', "#{name}/helpers", generate_spec_helper)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.generate_raider_helper
|
15
|
+
spec = ERB.new <<~EOF
|
16
|
+
module Raider
|
17
|
+
require_relative 'spec_helper'
|
18
|
+
require_relative 'watir_helper'
|
19
|
+
require_relative 'pom_helper'
|
20
|
+
require_relative 'browser_helper'
|
21
|
+
require_relative 'allure_helper'
|
22
|
+
end
|
23
|
+
EOF
|
24
|
+
spec.result(binding)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.generate_allure_helper
|
28
|
+
spec = ERB.new <<~EOF
|
29
|
+
require 'allure-ruby-commons'
|
30
|
+
require 'allure-rspec'
|
31
|
+
|
32
|
+
module Raider
|
33
|
+
module AllureHelper
|
34
|
+
class << self
|
35
|
+
|
36
|
+
def configure
|
37
|
+
AllureRspec.configure do |config|
|
38
|
+
config.results_directory = 'allure-results'
|
39
|
+
config.clean_results_directory = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_screenshot(name)
|
44
|
+
Allure.add_attachment(
|
45
|
+
name: name,
|
46
|
+
source: File.open("allure-results/screenshots/#{name}.png"),
|
47
|
+
type: Allure::ContentType::PNG,
|
48
|
+
test_case: true
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def formatter
|
53
|
+
AllureRspecFormatter
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
EOF
|
59
|
+
spec.result(binding)
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.generate_browser_helper
|
63
|
+
spec = ERB.new <<~EOF
|
64
|
+
require 'yaml'
|
65
|
+
require 'selenium-webdriver'
|
66
|
+
require 'watir'
|
67
|
+
require 'webdrivers'
|
68
|
+
|
69
|
+
module Raider
|
70
|
+
module BrowserHelper
|
71
|
+
class << self
|
72
|
+
attr_reader :browser
|
73
|
+
|
74
|
+
def new_browser
|
75
|
+
config = YAML.load_file('config/config.yml')
|
76
|
+
@browser = Watir::Browser.new config['browser']
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
EOF
|
82
|
+
spec.result(binding)
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.generate_pom_helper
|
86
|
+
spec = ERB.new <<~EOF
|
87
|
+
module Raider
|
88
|
+
module PomHelper
|
89
|
+
def instance
|
90
|
+
@instance ||= new
|
91
|
+
end
|
92
|
+
|
93
|
+
def method_missing(message, *args, &block)
|
94
|
+
return super unless instance.respond_to?(message)
|
95
|
+
|
96
|
+
instance.public_send(message, *args, &block)
|
97
|
+
end
|
98
|
+
|
99
|
+
def respond_to_missing?(method, *_args, &block)
|
100
|
+
instance.respond_to?(method) || super
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
EOF
|
105
|
+
spec.result(binding)
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.generate_spec_helper
|
109
|
+
spec = ERB.new <<~EOF
|
110
|
+
require 'active_support/all'
|
111
|
+
require 'rspec'
|
112
|
+
require_relative 'allure_helper'
|
113
|
+
require_relative 'browser_helper'
|
114
|
+
|
115
|
+
module Raider
|
116
|
+
module SpecHelper
|
117
|
+
|
118
|
+
AllureHelper.configure
|
119
|
+
|
120
|
+
RSpec.configure do |config|
|
121
|
+
config.formatter = AllureHelper.formatter
|
122
|
+
config.before(:each) do
|
123
|
+
BrowserHelper.new_browser
|
124
|
+
end
|
125
|
+
|
126
|
+
config.after(:each) do
|
127
|
+
browser = BrowserHelper.browser
|
128
|
+
example_name = self.class.descendant_filtered_examples.first.description
|
129
|
+
status = self.class.descendant_filtered_examples.first.execution_result.status
|
130
|
+
browser.save_screenshot("allure-results/screenshots/#\{example_name}.png") if status == :failed
|
131
|
+
AllureHelper.add_screenshot example_name if status == :failed
|
132
|
+
browser.quit
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
EOF
|
138
|
+
spec.result(binding)
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.generate_watir_helper
|
142
|
+
spec = ERB.new <<~EOF
|
143
|
+
require 'watir'
|
144
|
+
|
145
|
+
module Raider
|
146
|
+
module WatirHelper
|
147
|
+
refine Watir::Element do
|
148
|
+
def click_when_present
|
149
|
+
wait_until_present
|
150
|
+
self.click
|
151
|
+
end
|
152
|
+
|
153
|
+
def wait_until_present
|
154
|
+
self.wait_until(&:present?)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
EOF
|
160
|
+
spec.result(binding)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'common_file_generator'
|
2
|
+
require_relative 'file_generator'
|
3
|
+
require_relative 'helpers_file_generator'
|
4
|
+
require_relative 'watir_file_generator'
|
5
|
+
|
6
|
+
module RubyRaider
|
7
|
+
class RspecFileGenerator < FileGenerator
|
8
|
+
def self.generate_rspec_files(name, automation)
|
9
|
+
if automation == 'watir'
|
10
|
+
CommonFileGenerator.generate_common_files(name)
|
11
|
+
WatirFileGenerator.generate_watir_files(name)
|
12
|
+
HelpersFileGenerator.generate_helper_files(name)
|
13
|
+
generate_file('login_page_spec.rb', "#{name}/spec", generate_example_spec)
|
14
|
+
generate_file('base_spec.rb', "#{name}/spec", generate_base_spec)
|
15
|
+
else
|
16
|
+
pp 'here goes selenium'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.generate_example_spec
|
21
|
+
spec = ERB.new <<~EOF
|
22
|
+
require_relative 'base_spec'
|
23
|
+
require_relative '../page_objects/pages/login_page'
|
24
|
+
|
25
|
+
class LoginSpec < BaseSpec
|
26
|
+
context 'On the Login Page' do
|
27
|
+
|
28
|
+
before(:each) do
|
29
|
+
LoginPage.visit
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'A user can' do
|
33
|
+
it 'login with the right credentials', :JIRA_123 do
|
34
|
+
LoginPage.login('aguspe', '12341234')
|
35
|
+
expect(LoginPage.customer_name).to eq 'Welcome back Agustin'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'A user cannot' do
|
40
|
+
it 'login with the wrong credentials', :JIRA_123 do
|
41
|
+
expect(LoginPage.customer_name).to eq 'Login or register'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
EOF
|
47
|
+
spec.result(binding)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.generate_base_spec
|
51
|
+
spec = ERB.new <<~EOF
|
52
|
+
require_relative '../helpers/raider'
|
53
|
+
|
54
|
+
class BaseSpec
|
55
|
+
include Raider::SpecHelper
|
56
|
+
end
|
57
|
+
EOF
|
58
|
+
spec.result(binding)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require_relative 'file_generator'
|
2
|
+
|
3
|
+
module RubyRaider
|
4
|
+
class WatirFileGenerator < FileGenerator
|
5
|
+
def self.generate_watir_files(name)
|
6
|
+
generate_file('abstract_page.rb', "#{name}/page_objects/abstract", abstract_page)
|
7
|
+
generate_file('abstract_component.rb', "#{name}/page_objects/abstract", abstract_component)
|
8
|
+
generate_file('login_page.rb', "#{name}/page_objects/pages", example_page)
|
9
|
+
generate_file('header_component.rb', "#{name}/page_objects/components", example_component)
|
10
|
+
generate_file('Gemfile', name.to_s, gemfile_template)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.gemfile_template
|
14
|
+
gemfile = ERB.new <<~EOF
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
source 'https://rubygems.org'
|
18
|
+
|
19
|
+
gem 'activesupport'
|
20
|
+
gem 'allure-rspec'
|
21
|
+
gem 'allure-ruby-commons'
|
22
|
+
gem 'parallel_split_test'
|
23
|
+
gem 'parallel_tests'
|
24
|
+
gem 'rake'
|
25
|
+
gem 'rspec'
|
26
|
+
gem 'selenium-webdriver'
|
27
|
+
gem 'watir'
|
28
|
+
gem 'webdrivers'
|
29
|
+
EOF
|
30
|
+
gemfile.result(binding)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.example_page
|
34
|
+
page_file = ERB.new <<~EOF
|
35
|
+
require_relative '../abstract/abstract_page'
|
36
|
+
require_relative '../components/header_component'
|
37
|
+
|
38
|
+
class LoginPage < BasePage
|
39
|
+
|
40
|
+
using Raider::WatirHelper
|
41
|
+
|
42
|
+
def url(_page)
|
43
|
+
'index.php?rt=account/login'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Actions
|
47
|
+
|
48
|
+
def login(username, password)
|
49
|
+
username_field.set username
|
50
|
+
password_field.set password
|
51
|
+
login_button.click_when_present
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# Elements
|
57
|
+
|
58
|
+
def username_field
|
59
|
+
browser.text_field(id: 'loginFrm_loginname')
|
60
|
+
end
|
61
|
+
|
62
|
+
def password_field
|
63
|
+
browser.text_field(id: 'loginFrm_password')
|
64
|
+
end
|
65
|
+
|
66
|
+
def login_button
|
67
|
+
browser.button(visible_text: 'Login')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
EOF
|
71
|
+
page_file.result(binding)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.abstract_page
|
75
|
+
abstract_file = ERB.new <<~EOF
|
76
|
+
require 'rspec'
|
77
|
+
require_relative '../components/header_component'
|
78
|
+
require_relative '../../helpers/raider'
|
79
|
+
|
80
|
+
class BasePage
|
81
|
+
|
82
|
+
include HeaderComponent
|
83
|
+
include RSpec::Matchers
|
84
|
+
extend Raider::PomHelper
|
85
|
+
|
86
|
+
def browser
|
87
|
+
Raider::BrowserHelper.browser
|
88
|
+
end
|
89
|
+
|
90
|
+
def visit(*page)
|
91
|
+
browser.goto full_url(page.first)
|
92
|
+
end
|
93
|
+
|
94
|
+
def full_url(*page)
|
95
|
+
"#\{base_url}#\{url(*page)}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def base_url
|
99
|
+
'https://automationteststore.com/'
|
100
|
+
end
|
101
|
+
|
102
|
+
def url(_page)
|
103
|
+
raise 'Url must be defined on child pages'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
EOF
|
107
|
+
abstract_file.result(binding)
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.example_component
|
111
|
+
page_file = ERB.new <<~EOF
|
112
|
+
require_relative '../abstract/abstract_component'
|
113
|
+
|
114
|
+
module HeaderComponent
|
115
|
+
|
116
|
+
include BaseComponent
|
117
|
+
|
118
|
+
def customer_name
|
119
|
+
sleep 2
|
120
|
+
customer_menu.text
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
# Elements
|
126
|
+
|
127
|
+
def customer_menu
|
128
|
+
browser.element(id: 'customer_menu_top')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
EOF
|
132
|
+
page_file.result(binding)
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.abstract_component
|
136
|
+
abstract_file = ERB.new <<~EOF
|
137
|
+
require_relative '../../helpers/raider'
|
138
|
+
|
139
|
+
module BaseComponent; end
|
140
|
+
EOF
|
141
|
+
abstract_file.result(binding)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'highline'
|
2
|
+
require_relative '../generators/projects/rspec_project_generator'
|
3
|
+
|
4
|
+
module RubyRaider
|
5
|
+
class MenuGenerator
|
6
|
+
def self.generate_choice_menu(project_name)
|
7
|
+
cli = HighLine.new
|
8
|
+
cli.choose do |menu|
|
9
|
+
menu.prompt = 'Please select your automation framework'
|
10
|
+
menu.choice(:Selenium) { 'We are still working on supporting this' }
|
11
|
+
menu.choice(:Watir) {choose_test_framework('watir', project_name) }
|
12
|
+
menu.choice(:Quit, 'Exit program.') { exit }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.choose_test_framework(automation, project_name)
|
17
|
+
system('clear') || system('cls')
|
18
|
+
sleep 0.3
|
19
|
+
cli = HighLine.new
|
20
|
+
framework = ''
|
21
|
+
cli.choose do |menu|
|
22
|
+
menu.prompt = 'Please select your test framework'
|
23
|
+
menu.choice(:Rspec) { framework = 'Rspec'; set_rspec_framework(automation, project_name)}
|
24
|
+
menu.choice(:Cucumber) { framework = 'cucumber'; 'We are still working on supporting this' }
|
25
|
+
menu.choice(:Quit, 'Exit program.') { exit }
|
26
|
+
end
|
27
|
+
cli.say("You have chosen to use #{framework} with #{automation}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.set_rspec_framework(automation, project_name)
|
31
|
+
RspecProjectGenerator.generate_rspec_project(project_name, automation: automation)
|
32
|
+
ProjectGenerator.install_gems(project_name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'project_generator'
|
2
|
+
|
3
|
+
module RubyRaider
|
4
|
+
class CucumberProjectGenerator
|
5
|
+
def cucumber_folder_structure(name)
|
6
|
+
Dir.mkdir name.to_s
|
7
|
+
Dir.mkdir "#{name}/features"
|
8
|
+
folders = %w[steps_definitions support]
|
9
|
+
create_children_folders("#{name}/features", folders)
|
10
|
+
Dir.mkdir "#{name}/features/support/helpers"
|
11
|
+
Dir.mkdir "#{name}/page_objects"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
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,23 @@
|
|
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
|
+
rspec_files(name, automation)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.rspec_folder_structure(name)
|
12
|
+
Dir.mkdir name.to_s
|
13
|
+
folders = %w[config data page_objects helpers spec]
|
14
|
+
create_children_folders(name, folders)
|
15
|
+
pages = %w[pages components abstract]
|
16
|
+
create_children_folders("#{name}/page_objects", pages)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.rspec_files(name, automation)
|
20
|
+
RspecFileGenerator.generate_rspec_files(name, automation)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ruby_raider.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
|
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
|
-
|
data/ruby_raider.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'ruby_raider'
|
3
|
+
s.version = '0.1.1'
|
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 'rspec'
|
16
|
+
|
17
|
+
s.add_runtime_dependency 'highline'
|
18
|
+
end
|
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../lib/generators/files/watir_file_generator'
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
describe RubyRaider::WatirFileGenerator 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
|
+
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_raider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
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-
|
11
|
+
date: 2022-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rspec
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -24,15 +24,54 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: highline
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: This gem contents everything you need to start doing web automation in
|
28
42
|
one simple package
|
29
43
|
email: agustin.pe94@gmail.com
|
30
|
-
executables:
|
44
|
+
executables:
|
45
|
+
- raider
|
31
46
|
extensions: []
|
32
47
|
extra_rdoc_files: []
|
33
48
|
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- ".idea/.gitignore"
|
51
|
+
- ".idea/modules.xml"
|
52
|
+
- ".idea/ruby_raider.iml"
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- bin/raider
|
56
|
+
- lib/generators/files/common_file_generator.rb
|
57
|
+
- lib/generators/files/file_generator.rb
|
58
|
+
- lib/generators/files/helpers_file_generator.rb
|
59
|
+
- lib/generators/files/rspec_file_generator.rb
|
60
|
+
- lib/generators/files/watir_file_generator.rb
|
61
|
+
- lib/generators/menu_generator.rb
|
62
|
+
- lib/generators/projects/cucumber_project_generator.rb
|
63
|
+
- lib/generators/projects/project_generator.rb
|
64
|
+
- lib/generators/projects/rspec_project_generator.rb
|
34
65
|
- lib/ruby_raider.rb
|
35
|
-
|
66
|
+
- ruby_raider.gemspec
|
67
|
+
- spec/common_file_generator_spec.rb
|
68
|
+
- spec/helpers_file_generator_spec.rb
|
69
|
+
- spec/menu_generator_spec.rb
|
70
|
+
- spec/rspec_file_generator_spec.rb
|
71
|
+
- spec/rspec_project_generator_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
- spec/watir_file_generator_spec.rb
|
74
|
+
homepage: http://github.com/aguspe/ruby_raider
|
36
75
|
licenses:
|
37
76
|
- MIT
|
38
77
|
metadata: {}
|
@@ -44,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
44
83
|
requirements:
|
45
84
|
- - ">="
|
46
85
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
86
|
+
version: 3.0.0
|
48
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
88
|
requirements:
|
50
89
|
- - ">="
|