ruby_raider 0.1.2 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/Gemfile +5 -0
  4. data/README.md +8 -3
  5. data/bin/raider +0 -0
  6. data/lib/generators/files/automation_file_generator.rb +38 -0
  7. data/lib/generators/files/common_file_generator.rb +27 -127
  8. data/lib/generators/files/cucumber_file_generator.rb +33 -0
  9. data/lib/generators/files/file_generator.rb +7 -5
  10. data/lib/generators/files/helpers_file_generator.rb +47 -218
  11. data/lib/generators/files/rspec_file_generator.rb +16 -51
  12. data/lib/generators/menu_generator.rb +15 -5
  13. data/lib/generators/projects/cucumber_project_generator.rb +20 -8
  14. data/lib/generators/projects/project_generator.rb +7 -5
  15. data/lib/generators/projects/rspec_project_generator.rb +13 -14
  16. data/lib/generators/templates/automation/abstract_component_template.rb +22 -0
  17. data/lib/generators/templates/automation/abstract_page_template.rb +48 -0
  18. data/lib/generators/templates/automation/component_template.rb +16 -0
  19. data/lib/generators/templates/automation/page_template.rb +51 -0
  20. data/lib/generators/templates/common/config_template.rb +9 -0
  21. data/lib/generators/templates/common/gemfile_template.rb +29 -0
  22. data/lib/generators/templates/common/rake_file_template.rb +16 -0
  23. data/lib/generators/templates/common/read_me_template.rb +104 -0
  24. data/lib/generators/templates/cucumber/env_template.rb +38 -0
  25. data/lib/generators/templates/cucumber/example_feature_template.rb +15 -0
  26. data/lib/generators/templates/cucumber/example_steps_template.rb +21 -0
  27. data/lib/generators/templates/helpers/allure_helper_template.rb +47 -0
  28. data/lib/generators/templates/helpers/browser_helper_template.rb +26 -0
  29. data/lib/generators/templates/helpers/driver_helper_template.rb +24 -0
  30. data/lib/generators/templates/helpers/pom_helper_template.rb +25 -0
  31. data/lib/generators/templates/helpers/raider_helper_template.rb +15 -0
  32. data/lib/generators/templates/helpers/selenium_helper_template.rb +42 -0
  33. data/lib/generators/templates/helpers/spec_helper_template.rb +35 -0
  34. data/lib/generators/templates/helpers/watir_helper_template.rb +24 -0
  35. data/lib/generators/templates/rspec/base_spec_template.rb +13 -0
  36. data/lib/generators/templates/rspec/example_spec_template.rb +33 -0
  37. data/lib/generators/templates/template.rb +14 -0
  38. data/lib/ruby_raider.rb +3 -3
  39. data/ruby_raider.gemspec +4 -3
  40. data/spec/automation_file_generator_spec.rb +34 -0
  41. data/spec/common_file_generator_spec.rb +12 -3
  42. data/spec/cucumber_file_generator_spec.rb +26 -0
  43. data/spec/cucumber_project_generator_spec.rb +60 -0
  44. data/spec/helpers_file_generator_spec.rb +58 -16
  45. data/spec/rspec_file_generator_spec.rb +11 -2
  46. data/spec/rspec_project_generator_spec.rb +18 -9
  47. data/spec/spec_helper.rb +2 -12
  48. metadata +52 -15
  49. data/lib/generators/files/selenium_file_generator.rb +0 -159
  50. data/lib/generators/files/watir_file_generator.rb +0 -142
  51. data/spec/menu_generator_spec.rb +0 -8
  52. data/spec/selenium_file_generator_spec.rb +0 -29
  53. data/spec/watir_file_generator_spec.rb +0 -25
@@ -1,4 +1,5 @@
1
1
  require 'highline'
2
+ require_relative '../generators/projects/cucumber_project_generator'
2
3
  require_relative '../generators/projects/rspec_project_generator'
3
4
 
4
5
  module RubyRaider
@@ -20,16 +21,25 @@ module RubyRaider
20
21
  framework = ''
21
22
  cli.choose do |menu|
22
23
  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' }
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
25
32
  menu.choice(:Quit, 'Exit program.') { exit }
26
33
  end
27
34
  cli.say("You have chosen to use #{framework} with #{automation}")
28
35
  end
29
36
 
30
- def self.set_rspec_framework(automation, project_name)
31
- RspecProjectGenerator.generate_rspec_project(project_name, automation: automation)
32
- ProjectGenerator.install_gems(project_name)
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
33
43
  end
34
44
  end
35
45
  end
@@ -1,14 +1,26 @@
1
+ require_relative '../files/cucumber_file_generator'
1
2
  require_relative 'project_generator'
2
3
 
3
4
  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"
5
+ class CucumberProjectGenerator < ProjectGenerator
6
+ class << self
7
+ def generate_cucumber_project(name, automation: 'watir')
8
+ cucumber_folder_structure(name)
9
+ CucumberFileGenerator.generate_cucumber_files(name, automation)
10
+ ProjectGenerator.install_gems(name)
11
+ end
12
+
13
+ def cucumber_folder_structure(name)
14
+ Dir.mkdir name.to_s
15
+ folders = %w[features config page_objects allure-results]
16
+ create_children_folders("#{name}", folders)
17
+ folders = %w[step_definitions support]
18
+ create_children_folders("#{name}/features", folders)
19
+ Dir.mkdir "#{name}/features/support/helpers"
20
+ folders = %w[abstract pages components]
21
+ create_children_folders("#{name}/page_objects", folders)
22
+ Dir.mkdir "#{name}/allure-results/screenshots"
23
+ end
12
24
  end
13
25
  end
14
26
  end
@@ -1,11 +1,13 @@
1
1
  module RubyRaider
2
2
  class ProjectGenerator
3
- def self.create_children_folders(parent, folders)
4
- folders.each { |folder| Dir.mkdir "#{parent}/#{folder}" }
5
- end
3
+ class << self
4
+ def create_children_folders(parent, folders)
5
+ folders.each { |folder| Dir.mkdir "#{parent}/#{folder}" }
6
+ end
6
7
 
7
- def self.install_gems(name)
8
- system "cd #{name} && gem install bundler && bundle install"
8
+ def install_gems(name)
9
+ system "cd #{name} && gem install bundler && bundle install"
10
+ end
9
11
  end
10
12
  end
11
13
  end
@@ -3,21 +3,20 @@ require_relative '../files/rspec_file_generator'
3
3
 
4
4
  module RubyRaider
5
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
6
+ class << self
7
+ def generate_rspec_project(name, automation: 'watir')
8
+ rspec_folder_structure(name)
9
+ RspecFileGenerator.generate_rspec_files(name, automation)
10
+ ProjectGenerator.install_gems(name)
11
+ end
18
12
 
19
- def self.rspec_files(name, automation)
20
- RspecFileGenerator.generate_rspec_files(name, automation)
13
+ def rspec_folder_structure(name)
14
+ Dir.mkdir name.to_s
15
+ folders = %w[config data page_objects helpers spec]
16
+ create_children_folders(name, folders)
17
+ pages = %w[pages components abstract]
18
+ create_children_folders("#{name}/page_objects", pages)
19
+ end
21
20
  end
22
21
  end
23
22
  end
@@ -0,0 +1,22 @@
1
+ require_relative '../template'
2
+
3
+ class AbstractComponentTemplate < Template
4
+ def body
5
+ raider = if @framework == 'rspec'
6
+ "require_relative '../../helpers/raider'"
7
+ else
8
+ "require_relative '../../features/support/helpers/raider'"
9
+ end
10
+
11
+ <<~EOF
12
+ #{raider}
13
+
14
+ class AbstractComponent
15
+
16
+ def initialize(component)
17
+ @component = component
18
+ end
19
+ end
20
+ EOF
21
+ end
22
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../template'
2
+
3
+ class AbstractPageTemplate < Template
4
+ def body
5
+ browser = "def browser
6
+ Raider::BrowserHelper.browser
7
+ end"
8
+ driver = "def driver
9
+ Raider::DriverHelper.driver
10
+ end"
11
+
12
+ visit = @automation == 'watir' ? 'browser.goto full_url(page.first)' : 'driver.navigate.to full_url(page.first)'
13
+ raider = if @framework == 'rspec'
14
+ "require_relative '../../helpers/raider'"
15
+ else
16
+ "require_relative '../../features/support/helpers/raider'"
17
+ end
18
+
19
+ <<~EOF
20
+ require 'rspec'
21
+ #{raider}
22
+
23
+ class AbstractPage
24
+
25
+ include RSpec::Matchers
26
+ extend Raider::PomHelper
27
+
28
+ #{@automation == 'watir' ? browser : driver}
29
+
30
+ def visit(*page)
31
+ #{visit}
32
+ end
33
+
34
+ def full_url(*page)
35
+ "#\{base_url}#\{url(*page)}"
36
+ end
37
+
38
+ def base_url
39
+ 'https://automationteststore.com/'
40
+ end
41
+
42
+ def url(_page)
43
+ raise 'Url must be defined on child pages'
44
+ end
45
+ end
46
+ EOF
47
+ end
48
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../template'
2
+
3
+ class ComponentTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require_relative '../abstract/abstract_component'
7
+
8
+ class HeaderComponent < AbstractComponent
9
+
10
+ def customer_name
11
+ @component.text
12
+ end
13
+ end
14
+ EOF
15
+ end
16
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../template'
2
+
3
+ class PageTemplate < Template
4
+ def body
5
+ element = @automation == 'watir' ? 'browser.element' : 'driver.find_element'
6
+ helper = @automation == 'watir' ? 'Raider::WatirHelper' : 'Raider::SeleniumHelper'
7
+
8
+ <<~EOF
9
+ require_relative '../abstract/abstract_page'
10
+ require_relative '../components/header_component'
11
+
12
+ class LoginPage < AbstractPage
13
+ using #{helper}
14
+
15
+ def url(_page)
16
+ 'index.php?rt=account/login'
17
+ end
18
+
19
+ # Actions
20
+
21
+ def login(username, password)
22
+ username_field.send_keys username
23
+ password_field.send_keys password
24
+ login_button.click_when_present
25
+ end
26
+
27
+ # Components
28
+
29
+ def header
30
+ HeaderComponent.new(#{element}(class: 'menu_text'))
31
+ end
32
+
33
+ private
34
+
35
+ # Elements
36
+
37
+ def username_field
38
+ #{element}(id: 'loginFrm_loginname')
39
+ end
40
+
41
+ def password_field
42
+ #{element}(id: 'loginFrm_password')
43
+ end
44
+
45
+ def login_button
46
+ #{element}(xpath: "//button[@title='Login']")
47
+ end
48
+ end
49
+ EOF
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../template'
2
+
3
+ class ConfigTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ browser: :chrome
7
+ EOF
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../template'
2
+
3
+ class GemfileTemplate < Template
4
+ def body
5
+ if @framework == 'cucumber'
6
+ allure_cucumber = "gem 'allure-cucumber'"
7
+ rspec = "gem 'rspec'"
8
+ end
9
+
10
+ <<~EOF
11
+ # frozen_string_literal: true
12
+
13
+ source 'https://rubygems.org'
14
+
15
+ gem 'activesupport'
16
+ gem 'allure-rspec'
17
+ gem 'allure-ruby-commons'
18
+ #{allure_cucumber}
19
+ gem 'parallel_split_test'
20
+ gem 'parallel_tests'
21
+ gem 'rake'
22
+ gem '#{@framework}'
23
+ #{rspec}
24
+ gem 'selenium-webdriver'
25
+ gem 'watir'
26
+ gem 'webdrivers'
27
+ EOF
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../template'
2
+
3
+ class RakeFileTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require 'yaml'
7
+
8
+ desc 'Selects browser for automation run'
9
+ task :select_browser, [:browser] do |_t, args|
10
+ config = YAML.load_file('config/config.yml')
11
+ config['browser'] = args.browser
12
+ File.write('config/config.yml', config.to_yaml)
13
+ end
14
+ EOF
15
+ end
16
+ end
@@ -0,0 +1,104 @@
1
+ require_relative '../template'
2
+
3
+ class ReadMeTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ What is Raider?
7
+ ===========
8
+
9
+ Raider is a tool to make the setup and start of automation projects in ruby easier, with one command you are
10
+ ready to go
11
+
12
+ # Pre-requisites:
13
+
14
+ Install RVM:
15
+ https://rvm.io/rvm/install
16
+
17
+ # How to use the framework:
18
+
19
+ If you want to run all the tests from your terminal do:
20
+ *rspec spec/*
21
+
22
+ If you want to run all the tests in parallel do:
23
+ *parallel_rspec spec/*
24
+
25
+ # How are specs organized:
26
+
27
+ We use 'context' as the highest grouping level to indicate in which part of the application we are as an example:
28
+
29
+ *context 'On the login page'/*
30
+
31
+ We use 'describe' from the user perspective to describe an action that the user can or cannot take:
32
+
33
+ *describe 'A user can'/*
34
+
35
+ or
36
+
37
+ *describe 'A user cannot'/*
38
+
39
+ This saves us repetition and forces us into an structure
40
+
41
+ At last we use 'it' for the specific action the user can or cannot perform:
42
+
43
+ it 'login with right credentials'
44
+
45
+ If we group all of this together it will look like
46
+
47
+ ```ruby
48
+ context 'On the login page' do
49
+ describe 'A user can' do
50
+ it 'login with the right credentials' do
51
+ end
52
+ #{' '}
53
+ end
54
+ #{' '}
55
+ describe 'A user cannot' do
56
+ it 'login with the wrong credentials' do
57
+ end
58
+ end
59
+ end
60
+ ```
61
+ #{' '}
62
+ 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'
63
+
64
+ # How pages are organized:
65
+
66
+ ```ruby#{' '}
67
+ require_relative '../abstract/base_page'
68
+
69
+ class MainPage < BasePage
70
+
71
+ using Raider::WatirHelper
72
+
73
+ def url(_page)
74
+ '/'
75
+ end
76
+
77
+ # Actions
78
+
79
+ def change_currency(currency)
80
+ currency_dropdown.select currency
81
+ end
82
+
83
+ # Validations
84
+
85
+ def validate_currency(currency)
86
+ expect(currency_dropdown.include?(currency)).to be true
87
+ end
88
+
89
+ private
90
+
91
+ # Elements
92
+
93
+ def currency_dropdown
94
+ browser.select(class: %w[dropdown-menu currency])
95
+ end
96
+ end
97
+ ```
98
+
99
+ Pages are organized in Actions (things a user can perform on the page), Validations (assertions), and Elements.
100
+ 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
101
+
102
+ EOF
103
+ end
104
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../template'
2
+
3
+ class EnvTemplate < Template
4
+ def body
5
+
6
+ if @automation == 'watir'
7
+ helper = 'helpers/browser_helper'
8
+ browser = 'Raider::BrowserHelper.new_browser'
9
+ get_browser = 'browser = Raider::BrowserHelper.new_browser'
10
+ screenshot = 'browser.screenshot.save("allure-results/screenshots/#{scenario.name}.png")'
11
+ quit = 'browser.quit'
12
+ else
13
+ helper = 'helpers/driver_helper'
14
+ browser = 'Raider::DriverHelper.new_driver'
15
+ get_browser = 'driver = Raider::DriverHelper.driver'
16
+ screenshot = 'driver.save_screenshot("allure-results/screenshots/#{scenario.name}.png")'
17
+ quit = 'driver.quit'
18
+ end
19
+
20
+ <<~EOF
21
+ require 'active_support/all'
22
+ require_relative 'helpers/allure_helper'
23
+ require_relative '#{helper}'
24
+
25
+ Before do
26
+ Raider::AllureHelper.configure
27
+ #{browser}
28
+ end
29
+
30
+ After do |scenario|
31
+ #{get_browser}
32
+ #{screenshot}
33
+ Raider::AllureHelper.add_screenshot(scenario.name)
34
+ #{quit}
35
+ end
36
+ EOF
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../template'
2
+
3
+ class ExampleFeatureTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ Feature: Login Page
7
+
8
+ Scenario: A user can login
9
+ Given I'm a registered user on the login page
10
+ When I login with my credentials
11
+ Then I can see the main page
12
+
13
+ EOF
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../template'
2
+
3
+ class ExampleStepsTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require_relative '../../page_objects/pages/login_page'
7
+
8
+ Given("I'm a registered user on the login page") do
9
+ LoginPage.visit
10
+ end
11
+
12
+ When('I login with my credentials') do
13
+ LoginPage.login('aguspe', '12341234')
14
+ end
15
+
16
+ When('I can see the main page') do
17
+ expect(LoginPage.header.customer_name).to eq 'Welcome back Agustin'
18
+ end
19
+ EOF
20
+ end
21
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../template'
2
+
3
+ class AllureHelperTemplate < Template
4
+ def body
5
+ if @framework == 'cucumber'
6
+ gems = "require 'allure-cucumber'"
7
+ allure = 'AllureCucumber'
8
+ else
9
+ gems = "require 'allure-ruby-commons'
10
+ require 'allure-rspec'"
11
+ allure = 'AllureRspec'
12
+ end
13
+ <<~EOF
14
+ #{gems}
15
+
16
+ module Raider
17
+ module AllureHelper
18
+ class << self
19
+
20
+ def configure
21
+ #{allure}.configure do |config|
22
+ config.results_directory = 'allure-results'
23
+ config.clean_results_directory = true
24
+ end
25
+ end
26
+
27
+ def add_screenshot(screenshot_name)
28
+ Allure.add_attachment(
29
+ name: name,
30
+ source: "File.open(allure-results/screenshots/\#{screenshot_name}.png)",
31
+ type: Allure::ContentType::PNG,
32
+ test_case: true
33
+ )
34
+ end
35
+
36
+ #{
37
+ if @framework == 'rspec'
38
+ 'def formatter
39
+ AllureRspecFormatter
40
+ end'
41
+ end }
42
+ end
43
+ end
44
+ end
45
+ EOF
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../template'
2
+
3
+ class BrowserHelperTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require 'yaml'
7
+ require 'selenium-webdriver'
8
+ require 'watir'
9
+ require 'webdrivers'
10
+
11
+ module Raider
12
+ module BrowserHelper
13
+ class << self
14
+ attr_reader :browser
15
+
16
+ def new_browser
17
+ config = YAML.load_file('config/config.yml')
18
+ @browser = Watir::Browser.new config['browser']
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ EOF
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../template'
2
+
3
+ class DriverHelperTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require 'selenium-webdriver'
7
+ require 'watir'
8
+ require 'webdrivers'
9
+ require 'yaml'
10
+
11
+ module Raider
12
+ module DriverHelper
13
+ class << self
14
+ attr_reader :driver
15
+
16
+ def new_driver
17
+ @driver = Selenium::WebDriver.for :chrome
18
+ end
19
+ end
20
+ end
21
+ end
22
+ EOF
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../template'
2
+
3
+ class PomHelperTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ module Raider
7
+ module PomHelper
8
+ def instance
9
+ @instance ||= new
10
+ end
11
+
12
+ def method_missing(message, *args, &block)
13
+ return super unless instance.respond_to?(message)
14
+
15
+ instance.public_send(message, *args, &block)
16
+ end
17
+
18
+ def respond_to_missing?(method, *_args, &block)
19
+ instance.respond_to?(method) || super
20
+ end
21
+ end
22
+ end
23
+ EOF
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../template'
2
+
3
+ class RaiderHelperTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ module Raider
7
+ #{"require_relative 'spec_helper'" if @framework == 'rspec'}
8
+ require_relative '#{@automation}_helper'
9
+ require_relative 'pom_helper'
10
+ require_relative '#{@automation == 'watir' ? 'browser_helper' : 'driver_helper'}'
11
+ require_relative 'allure_helper'
12
+ end
13
+ EOF
14
+ end
15
+ end