whirlwind 0.1.0

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 (77) hide show
  1. data/.autotest +23 -0
  2. data/.gemtest +0 -0
  3. data/History.txt +6 -0
  4. data/Manifest.txt +79 -0
  5. data/README.txt +76 -0
  6. data/Rakefile +15 -0
  7. data/bin/whirlwind +99 -0
  8. data/demo_test_site/demo_site.rb +37 -0
  9. data/demo_test_site/public/images/arrow_left_48.png +0 -0
  10. data/demo_test_site/public/images/arrow_right_48.png +0 -0
  11. data/demo_test_site/public/images/down.gif +0 -0
  12. data/demo_test_site/public/images/header.jpg +0 -0
  13. data/demo_test_site/public/images/menu.gif +0 -0
  14. data/demo_test_site/public/images/menuhover.gif +0 -0
  15. data/demo_test_site/public/javascripts/browser.menu.js +61 -0
  16. data/demo_test_site/public/javascripts/cyberconnect_helpers.js +369 -0
  17. data/demo_test_site/public/javascripts/jquery-1.5.1.min.js +16 -0
  18. data/demo_test_site/public/javascripts/jquery-1.6.2.min.js +18 -0
  19. data/demo_test_site/public/javascripts/jquery-ui-1.8.10.custom.min.js +1370 -0
  20. data/demo_test_site/public/javascripts/jquery.layout.min-1.2.0.js +80 -0
  21. data/demo_test_site/public/javascripts/jqueryslidemenu.css +93 -0
  22. data/demo_test_site/public/javascripts/jqueryslidemenu.js +48 -0
  23. data/demo_test_site/public/javascripts/ui.accordion.js +477 -0
  24. data/demo_test_site/public/jquery.ui.all.css +11 -0
  25. data/demo_test_site/public/jquery.ui.base.css +11 -0
  26. data/demo_test_site/public/jquery.ui.theme.css +252 -0
  27. data/demo_test_site/public/jquery_css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  28. data/demo_test_site/public/jquery_css/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  29. data/demo_test_site/public/jquery_css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  30. data/demo_test_site/public/jquery_css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  31. data/demo_test_site/public/jquery_css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  32. data/demo_test_site/public/jquery_css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  33. data/demo_test_site/public/jquery_css/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  34. data/demo_test_site/public/jquery_css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  35. data/demo_test_site/public/jquery_css/images/ui-icons_222222_256x240.png +0 -0
  36. data/demo_test_site/public/jquery_css/images/ui-icons_2e83ff_256x240.png +0 -0
  37. data/demo_test_site/public/jquery_css/images/ui-icons_454545_256x240.png +0 -0
  38. data/demo_test_site/public/jquery_css/images/ui-icons_888888_256x240.png +0 -0
  39. data/demo_test_site/public/jquery_css/images/ui-icons_cd0a0a_256x240.png +0 -0
  40. data/demo_test_site/public/jquery_css/jquery-ui-1.8.10.custom.css +573 -0
  41. data/demo_test_site/public/jquery_layout.css +14 -0
  42. data/demo_test_site/public/jqueryslidemenu.css +93 -0
  43. data/demo_test_site/public/menu.css +12 -0
  44. data/demo_test_site/public/style.css +196 -0
  45. data/demo_test_site/views/index.erb +294 -0
  46. data/images/.placeholder +0 -0
  47. data/lib/browser.rb +22 -0
  48. data/lib/cucumber/formatter/cucumber.css +282 -0
  49. data/lib/cucumber/formatter/html_image.rb +750 -0
  50. data/lib/cucumber/formatter/jquery-min.js +154 -0
  51. data/lib/cucumber.rb +68 -0
  52. data/lib/duration.rb +13 -0
  53. data/lib/io.rb +31 -0
  54. data/lib/ordered_xml_markup.rb +24 -0
  55. data/lib/rspec.rb +75 -0
  56. data/lib/watir.rb +105 -0
  57. data/lib/whirlwind.rb +39 -0
  58. data/sites/demo/conf/base_urls.yml +6 -0
  59. data/sites/demo/conf/browser.yaml +1 -0
  60. data/sites/demo/conf/html_elements.yaml +22 -0
  61. data/sites/demo/conf/remote_machine.yaml +12 -0
  62. data/sites/demo/conf/users.yaml +21 -0
  63. data/sites/demo/elements/demo_common_elements.rb +42 -0
  64. data/sites/demo/elements/demo_elements.rb +18 -0
  65. data/sites/demo/elements/demo_registration_elements.rb +27 -0
  66. data/sites/demo/features/click_links.feature +21 -0
  67. data/sites/demo/features/register_user.feature +27 -0
  68. data/sites/demo/features/step_defn/demo.rb +62 -0
  69. data/sites/demo/flows/home_flows.rb +25 -0
  70. data/sites/demo/flows/registration_flows.rb +21 -0
  71. data/sites/demo/results/.placeholder +0 -0
  72. data/test/features/browser_types.feature +22 -0
  73. data/test/features/open_browser.feature +20 -0
  74. data/test/features/resource_size.feature +13 -0
  75. data/test/features/step_defn/browser.rb +61 -0
  76. data/test/test_whirlwind.rb +8 -0
  77. metadata +198 -0
data/lib/whirlwind.rb ADDED
@@ -0,0 +1,39 @@
1
+ base = File.expand_path(File.dirname(__FILE__) + '/..')
2
+
3
+ require 'RMagick'
4
+ require 'platform_helpers'
5
+ require base + '/lib/cucumber'
6
+ require 'watir-webdriver'
7
+ require base + '/lib/watir'
8
+ require base + '/lib/rspec'
9
+ require 'wait_for'
10
+ require base + '/lib/cucumber/formatter/html_image'
11
+ require 'rspec'
12
+ require 'find'
13
+ require 'win32screenshot' if RUBY_PLATFORM =~ /win/i
14
+
15
+ Before do |i|
16
+ load_fixtures
17
+
18
+ if $browser_type
19
+ @browser = Watir::Browser.new $browser_type
20
+ else
21
+ if @test_data[$site_name].has_key?(:browser)
22
+ @browser = Watir::Browser.new @test_data[$site_name][:browser][:browser]
23
+ else
24
+ raise ArgumentError
25
+ end
26
+ end
27
+ site_requires
28
+ site_objects
29
+ end
30
+
31
+ After do
32
+ @browser.close if @browser.kind_of?(Watir::Browser)
33
+ end
34
+
35
+
36
+ class Whirlwind
37
+ include RSpec::Core::DSL
38
+ VERSION = '0.1.0'
39
+ end
@@ -0,0 +1,6 @@
1
+ :test:
2
+ :demo_home: http://127.0.0.1:9090
3
+ :development:
4
+ :demo_home: http://127.0.0.1:9090
5
+ :production:
6
+ :demo_home: http://127.0.0.1:9090
@@ -0,0 +1 @@
1
+ :browser: chrome
@@ -0,0 +1,22 @@
1
+ ---
2
+ :some_page:
3
+ :page_element1:
4
+ :type: text_field
5
+ :what: "watir's what parameter"
6
+ :what: "watir's how parameter"
7
+ :page_element2:
8
+ :type: text_field
9
+ :what: "watir's what parameter"
10
+ :what: "watir's how parameter"
11
+ :another_page:
12
+ :page_element1:
13
+ :type: text_field
14
+ :what: "watir's what parameter"
15
+ :what: "watir's how parameter"
16
+ :page_element2:
17
+ :type: text_field
18
+ :what: "watir's what parameter"
19
+ :what: "watir's how parameter"
20
+
21
+
22
+
@@ -0,0 +1,12 @@
1
+ :test:
2
+ :ssh_ip: 127.0.0.1
3
+ :ssh_user: cliff
4
+ :ssh_password:
5
+ :development:
6
+ :ssh_ip: 127.0.0.1
7
+ :ssh_user: cliff
8
+ :ssh_password:
9
+ :production:
10
+ :ssh_ip: 127.0.0.1
11
+ :ssh_user: cliff
12
+ :ssh_password:
@@ -0,0 +1,21 @@
1
+ :development:
2
+ :manager:
3
+ :user: 'user1'
4
+ :password: 'user1_password'
5
+ :employee:
6
+ :user: 'user2'
7
+ :password: 'user2_password'
8
+ :test:
9
+ :manager:
10
+ :user: 'user1'
11
+ :password: 'user1_password'
12
+ :employee:
13
+ :user: 'user2'
14
+ :password: 'user2_password'
15
+ :production:
16
+ :manager:
17
+ :user: 'user1'
18
+ :password: 'user1_password'
19
+ :employee:
20
+ :user: 'user2'
21
+ :password: 'user2_password'
@@ -0,0 +1,42 @@
1
+ module Demo
2
+ module Elements
3
+ class Tabs
4
+ include RSpec::Core::DSL
5
+ def initialize
6
+ define_me(:base) {@browser.link(:href, '#tab_base')}
7
+ define_me(:registration) {@browser.link(:href, '#tab_user_reg')}
8
+ end
9
+ end
10
+
11
+ class Dialogs
12
+ include RSpec::Core::DSL
13
+ def initialize
14
+ define_me(:modal_dialog) { @browser.div(:id => 'test_modal_dialog') }
15
+ define_me(:dialog) { @browser.div(:id => 'test_dialog') }
16
+ define_me(:close_modal_dialog) { @browser.link(:class => /ui-dialog-titlebar-close/) }
17
+ define_me(:close_dialog) { @browser.links(:class => /ui-dialog-titlebar-close/).last }
18
+ define_me(:close_modal_dialog) { @browser.links(:class => /ui-dialog-titlebar-close/).first }
19
+ end
20
+ end
21
+
22
+ class Menu
23
+ include RSpec::Core::DSL
24
+ def initialize
25
+ define_me(:full_menu_div) {@browser.div(:id, 'main_menu')}
26
+ define_me(:actions) { full_menu_div.link(:text, 'Actions') }
27
+ define_me(:test_alert) {
28
+ actions.mouseover
29
+ full_menu_div.link(:text, 'Test Alert')
30
+ }
31
+ define_me(:test_dialog) {
32
+ actions.mouseover
33
+ full_menu_div.link(:text, 'Test Dialog')
34
+ }
35
+ define_me(:test_modal_dialog) {
36
+ actions.mouseover
37
+ full_menu_div.link(:text, 'Test Modal Dialog')
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ module Demo
2
+ module Elements
3
+ class HomePage
4
+ include RSpec::Core::DSL
5
+ attr_accessor :tabs, :menu, :dialogs
6
+ def initialize
7
+ @tabs = Demo::Elements::Tabs.new
8
+ @menu = Demo::Elements::Menu.new
9
+ @dialogs = Demo::Elements::Dialogs.new
10
+ define_me(:file_status) {@browser.div(:id, 'create_file_status')}
11
+ define_me(:create_file_text_field) {@browser.text_field(:id, 'create_file_name')}
12
+ define_me(:submit_create_file) {@browser.button(:id, 'create_file')}
13
+ define_me(:link_with_id) {@browser.link(:id, 'link_with_id_and_no_name')}
14
+ define_me(:link_with_name) {@browser.link(:name, 'link_with_no_id_but_has_name')}
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ module Demo
2
+ module Elements
3
+ class RegistrationPage
4
+ include RSpec::Core::DSL
5
+ attr_accessor :tabs, :menu, :dialogs
6
+ def initialize
7
+ @tabs = Demo::Elements::Tabs.new
8
+ @menu = Demo::Elements::Menu.new
9
+ @dialogs = Demo::Elements::Dialogs.new
10
+ define_me(:email) { @browser.text_field(:id, 'email') }
11
+ define_me(:email_error) { @browser.div(:id, 'email_error') }
12
+ define_me(:password) { @browser.text_field(:id, 'password') }
13
+ define_me(:password_error) { @browser.div(:id, 'password_error') }
14
+ define_me(:password) { @browser.text_field(:id, 'password') }
15
+ define_me(:step_1_div) { @browser.div(:id => 'step_1') }
16
+ define_me(:step_2_div) { @browser.div(:id => 'step_2') }
17
+ define_me(:step_1_displayed?) { step_1_div.html.grep(/ui-accordion-content-active/).length > 0 }
18
+ define_me(:step_2_displayed?) { step_2_div.html.grep(/ui-accordion-content-active/).length > 0 }
19
+ define_me(:step_navigation_div) { @browser.div(:id, 'step_navigation_left') }
20
+ define_me(:step_1_next) { step_1_div.link(:title => 'Move on to Step 2') }
21
+ define_me(:step_2_next) { step_2_div.link(:title => 'Move on to Step 3') }
22
+ define_me(:step_2_prev) { step_2_div.link(:title => 'Go back to Step 1') }
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,21 @@
1
+ Feature: Menu links should take an appropriate action
2
+ from all pages requiring the main menu
3
+
4
+ Scenario: Click Home Page Menu Links
5
+ Given a user navigates to the home page
6
+ Then the user clicks on the Test Alert link
7
+ Then the user closes the Test Alert box
8
+ Then the user clicks on the Test Modal Dialog link
9
+ Then the user closes the Test Modal Dialog
10
+ Then the user clicks on the Test Dialog link
11
+ Then the user closes the Test Dialog
12
+
13
+ Scenario: Click Registration Page Menu Links
14
+ Given a user navigates to the registration page
15
+ Then the user clicks on the Test Alert link
16
+ Then the user closes the Test Alert box
17
+ Then the user clicks on the Test Modal Dialog link
18
+ Then the user closes the Test Modal Dialog
19
+ Then the user clicks on the Test Dialog link
20
+ Then the user closes the Test Dialog
21
+
@@ -0,0 +1,27 @@
1
+ Feature: In order to charge a customer for services
2
+ the user must be able
3
+ to complete registration
4
+
5
+ Scenario: Invalid Email
6
+ Given a user navigates to the registration page
7
+ Then the user enters an invalid entry in the email field
8
+ Then the user enters blah into the password field
9
+ And tries to move to step 2
10
+ # using a instead of an for a common step definition
11
+ Then a email error is displayed
12
+
13
+ Scenario: Invalid Password
14
+ Given a user navigates to the registration page
15
+ Then the user enters blah into the email field
16
+ Then the user enters an invalid entry in the password field
17
+ And tries to move to step 2
18
+ Then a password error is displayed
19
+
20
+ Scenario: Invalid Email and Password
21
+ Given a user navigates to the registration page
22
+ Then the user enters an invalid entry in the email field
23
+ Then the user enters an invalid entry in the password field
24
+ And tries to move to step 2
25
+ Then a email error is displayed
26
+ Then a password error is displayed
27
+
@@ -0,0 +1,62 @@
1
+ base = File.expand_path(File.dirname(__FILE__) + '/../../../..')
2
+ require base + '/lib/whirlwind'
3
+
4
+ Given /a user navigates to the (.+) page/ do |page|
5
+ @demo_homepage.send(page)
6
+ end
7
+
8
+ Then /menu items should exists/ do
9
+ @demo_homepage.elements.menu.actions.exists?.should == true
10
+ @demo_homepage.elements.menu.test_alert.exists?.should == true
11
+ @demo_homepage.elements.menu.test_modal_dialog.exists?.should == true
12
+ @demo_homepage.elements.menu.test_dialog.exists?.should == true
13
+ end
14
+
15
+ Then /the user clicks on the Test Alert link/ do
16
+ @demo_homepage.elements.menu.test_alert.click
17
+ wait_for(2) { @browser.alert_box.text == 'QA Robusta Test Alert' }
18
+ screen_shot('Test Alert menu item clicked')
19
+ @browser.alert_box.text.should == 'QA Robusta Test Alert'
20
+ end
21
+
22
+ Then /the user closes the Test Alert box/ do
23
+ @browser.alert_box.dismiss
24
+ end
25
+
26
+ Then /the user clicks on the Test Modal Dialog link/ do
27
+ @demo_homepage.elements.menu.test_modal_dialog.click
28
+ wait_for(2) { @demo_homepage.elements.dialogs.modal_dialog.text == 'Test some modal dialog actions' }
29
+ screen_shot('Test Modal Dialog menu item clicked')
30
+ @demo_homepage.elements.dialogs.modal_dialog.text.should == 'Test some modal dialog actions'
31
+ end
32
+
33
+ Then /the user clicks on the Test Dialog link/ do
34
+ @demo_homepage.elements.menu.test_dialog.click
35
+ wait_for(2) { @demo_homepage.elements.dialogs.dialog.text == 'Test some dialog actions' }
36
+ screen_shot('Test Dialog menu item clicked')
37
+ @demo_homepage.elements.dialogs.dialog.text.should == 'Test some dialog actions'
38
+ end
39
+
40
+ Then /the user closes the Test Dialog/ do
41
+ @demo_homepage.elements.dialogs.close_dialog.click
42
+ end
43
+
44
+ Then /the user closes the Test Modal Dialog/ do
45
+ @demo_homepage.elements.dialogs.close_modal_dialog.click
46
+ end
47
+
48
+ Then /the user enters (.+) into the (.+) field/ do |val, field|
49
+ @demo_registrationpage.elements.send(field).set(val)
50
+ end
51
+
52
+ Then /the user enters an invalid entry in the (.+) field/ do |field|
53
+ end
54
+
55
+ Then /tries to move to step (\d+)/ do |step_n|
56
+ @demo_registrationpage.elements.send("step_#{step_n.to_i-1}_next").click
57
+ end
58
+
59
+ Then /a (.+) error is displayed/ do |field|
60
+ @demo_registrationpage.elements.send("#{field}_error").text.should == 'Enter a value'
61
+ screen_shot("#{field} error")
62
+ end
@@ -0,0 +1,25 @@
1
+ module Demo
2
+ class HomePage
3
+ include RSpec::Core::DSL
4
+ attr_reader :elements
5
+ def initialize
6
+ @elements = Demo::Elements::HomePage.new
7
+ end
8
+
9
+ def home
10
+ @browser.goto(@test_data['demo'][:base_urls][$environment][:demo_home])
11
+ @elements.tabs.registration.wait_until_present
12
+ screen_shot('Landed on Home Page')
13
+ end
14
+
15
+ def registration
16
+ home
17
+ @elements.tabs.registration.wait_until_present
18
+ @elements.tabs.registration.click
19
+ @demo_registrationpage.elements.step_1_next.wait_until_present
20
+ screen_shot('Landed on Registration Page')
21
+ end
22
+
23
+ end
24
+ end
25
+
@@ -0,0 +1,21 @@
1
+ module Demo
2
+ class RegistrationPage
3
+ include RSpec::Core::DSL
4
+ attr_reader :elements
5
+ def initialize
6
+ @elements = Demo::Elements::RegistrationPage.new
7
+ end
8
+
9
+ def step_1(params={})
10
+ params[:submit] ||= 'true'
11
+ params[:submit] = params[:submit].to_bool
12
+ params[:email] ||= ''
13
+ params[:password] ||= ''
14
+ @elements.email.set(params[:email]) if params[:email] != ''
15
+ @elements.password.set(params[:password]) if params[:password] != ''
16
+ @elements.step_1_next.click if params[:submit]
17
+ end
18
+
19
+ end
20
+ end
21
+
File without changes
@@ -0,0 +1,22 @@
1
+ Feature: Supported Browsers
2
+ In order to release supported browsers are allowed
3
+ @skip
4
+ Scenario Outline: Is Supported
5
+ Given a supported browser <supported_browsers>
6
+ Then the browser is allowed
7
+
8
+ Examples:
9
+ | supported_browsers |
10
+ | firefox |
11
+ | ff |
12
+ | chrome |
13
+ | ie |
14
+
15
+ @run
16
+ Scenario Outline: Is Not Supported
17
+ Given an unsupported browser <unsupported_browsers>
18
+ Then the browser is not allowed
19
+
20
+ Examples:
21
+ | unsupported_browsers |
22
+ | opera |
@@ -0,0 +1,20 @@
1
+ Feature: Open Browser
2
+ In order to test a web application one needs to open a browser
3
+ # Scenario: No block provided
4
+ # Given I have not provided a block to the browser
5
+ # Then the result should be a browser is not opened
6
+
7
+ Scenario Outline: Block provided
8
+ Given I have provided a block to the site with <browser_type>
9
+ Then the result should be the browser instances it returned and available inside of the block
10
+ Scenario Outline: No Block provided
11
+ Given I have not provided a block to the site with <browser_type>
12
+ Then the result should be the browser instances it returned as a variable
13
+
14
+
15
+ Examples:
16
+ |browser_type|
17
+ |chrome|
18
+ |ff|
19
+ |firefox|
20
+
@@ -0,0 +1,13 @@
1
+ Feature: Download elements from source html
2
+ In order to release all images, external javascript and
3
+ css files must download and be the correct size
4
+
5
+ Scenario Outline: Download
6
+ Given a user has landed on a <page>
7
+ Then all resource elements should download with the correct size
8
+
9
+ Examples:
10
+ |page |
11
+ |http://slashdot.org |
12
+ |http://yahoo.com |
13
+ |http://github.com |
@@ -0,0 +1,61 @@
1
+ base = File.expand_path(File.dirname(__FILE__) + '/../../..')
2
+ require base + '/lib/whirlwind'
3
+ require base + '/elements/demo_elements'
4
+
5
+
6
+ Before do
7
+ @__cucumber_step_mother.delete_images
8
+ @b = nil
9
+ end
10
+
11
+ After do
12
+ puts "BLAH: #{@blah}"
13
+ @b.close if @b.kind_of?(Watir::Browser)
14
+ end
15
+
16
+
17
+ Given /a supported browser (.+)/ do |browser|
18
+ @b = browser
19
+ end
20
+ Then /the browser is allowed/ do
21
+ screen_shot
22
+ Constants::ALLOWED_BROWSERS.should include(@b.to_sym)
23
+ end
24
+
25
+ Given /an unsupported browser (.+)/ do |browser|
26
+ screen_shot
27
+ screen_shot
28
+ #require 'ruby-debug';debugger
29
+ @b = browser
30
+ end
31
+ Then /the browser is not allowed/ do
32
+ Constants::ALLOWED_BROWSERS.should_not include(@b)
33
+ end
34
+
35
+
36
+ Given /a user has landed on a (.+)/ do |url|
37
+ @element_info = HTTP::Validator.run(url)
38
+ end
39
+
40
+ Then /all resource elements should download with the correct size/ do
41
+ @element_info.each_pair { |resource, values|
42
+ values.each { |item|
43
+ puts "Verifying #{resource} downloaded size #{item[:actual_size]} matches Content-Length #{item[:expected_size]}\n"
44
+ item[:actual_size].should equal item[:expected_size]
45
+ }
46
+ }
47
+ end
48
+
49
+ Given /I have provided a block to the site with (.+)/ do |browser|
50
+ Site.browser(:browser => browser) { |b| @b = b }
51
+ end
52
+ Then /the result should be the browser instances it returned and available inside of the block/ do
53
+ @b.should be_a_kind_of(Watir::Browser)
54
+ end
55
+
56
+ Given /I have not provided a block to the site with (.+)/ do |browser|
57
+ @b = Site.browser(:browser => browser)
58
+ end
59
+ Then /the result should be the browser instances it returned as a variable/ do
60
+ @b.should be_a_kind_of(Watir::Browser)
61
+ end
@@ -0,0 +1,8 @@
1
+ require "test/unit"
2
+ require "whirlwind"
3
+
4
+ class TestWhirlwind < Test::Unit::TestCase
5
+ def test_sanity
6
+ flunk "write tests or I will kneecap you"
7
+ end
8
+ end