terminus_spec 0.5.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 (64) hide show
  1. data/.gitignore +26 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +2 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +7 -0
  6. data/HISTORY.md +54 -0
  7. data/LICENSE +20 -0
  8. data/README.md +13 -0
  9. data/Rakefile +43 -0
  10. data/cucumber.yml +6 -0
  11. data/lib/terminus_spec.rb +200 -0
  12. data/lib/terminus_spec/factory.rb +27 -0
  13. data/lib/terminus_spec/generators.rb +80 -0
  14. data/lib/terminus_spec/locators.rb +23 -0
  15. data/lib/terminus_spec/logger.rb +7 -0
  16. data/lib/terminus_spec/matchers.rb +41 -0
  17. data/lib/terminus_spec/platform_selenium.rb +18 -0
  18. data/lib/terminus_spec/platform_selenium/platform_object.rb +214 -0
  19. data/lib/terminus_spec/platform_selenium/web_objects/all.rb +98 -0
  20. data/lib/terminus_spec/platform_selenium/web_objects/button.rb +13 -0
  21. data/lib/terminus_spec/platform_selenium/web_objects/link.rb +13 -0
  22. data/lib/terminus_spec/platform_selenium/web_objects/text_field.rb +14 -0
  23. data/lib/terminus_spec/platform_watir.rb +18 -0
  24. data/lib/terminus_spec/platform_watir/platform_object.rb +190 -0
  25. data/lib/terminus_spec/platform_watir/web_objects/all.rb +88 -0
  26. data/lib/terminus_spec/platform_watir/web_objects/text_field.rb +13 -0
  27. data/lib/terminus_spec/platforms.rb +25 -0
  28. data/lib/terminus_spec/version.rb +3 -0
  29. data/lib/terminus_spec/web_objects/all.rb +172 -0
  30. data/lib/terminus_spec/web_objects/button.rb +32 -0
  31. data/lib/terminus_spec/web_objects/link.rb +40 -0
  32. data/lib/terminus_spec/web_objects/text_field.rb +45 -0
  33. data/spec/spec_helper.rb +37 -0
  34. data/spec/terminus_spec/factory_spec.rb +40 -0
  35. data/spec/terminus_spec/generators_spec.rb +179 -0
  36. data/spec/terminus_spec/locators_spec.rb +30 -0
  37. data/spec/terminus_spec/platform_selenium_spec.rb +28 -0
  38. data/spec/terminus_spec/platform_watir_spec.rb +32 -0
  39. data/spec/terminus_spec/platforms_spec.rb +43 -0
  40. data/spec/terminus_spec/terminus_spec.rb +271 -0
  41. data/spec/terminus_spec/web_objects/all_spec.rb +87 -0
  42. data/spec/terminus_spec/web_objects/button_spec.rb +35 -0
  43. data/spec/terminus_spec/web_objects/link_spec.rb +46 -0
  44. data/spec/terminus_spec/web_objects/text_field_spec.rb +48 -0
  45. data/spec/terminus_spec/webobject_selenium_spec.rb +154 -0
  46. data/spec/terminus_spec/webobject_watir_spec.rb +120 -0
  47. data/specs/app/favicon.ico +0 -0
  48. data/specs/app/images/mass_extinction.jpg +0 -0
  49. data/specs/app/index.html +20 -0
  50. data/specs/app/modal_1.html +41 -0
  51. data/specs/app/modal_2.html +29 -0
  52. data/specs/app/server.rb +25 -0
  53. data/specs/app/style.css +18 -0
  54. data/specs/app/success_1.html +12 -0
  55. data/specs/app/success_2.html +12 -0
  56. data/specs/app/test_event.html +39 -0
  57. data/specs/app/test_form.html +114 -0
  58. data/specs/app/test_frame.html +15 -0
  59. data/specs/app/test_iframe.html +15 -0
  60. data/specs/app/test_static.html +92 -0
  61. data/specs/engine/borg.rb +27 -0
  62. data/specs/engine/hooks.rb +23 -0
  63. data/terminus_spec.gemspec +31 -0
  64. metadata +198 -0
@@ -0,0 +1,32 @@
1
+ module TerminusSpec
2
+ module WebObjects
3
+
4
+ class Button < WebObject
5
+
6
+ def initialize(web_object, platform)
7
+ @web_object = web_object
8
+ mixin_web_objects_for platform
9
+ end
10
+
11
+ protected
12
+
13
+ def self.locators_for_watir
14
+ super + [:text, :value]
15
+ end
16
+
17
+ def self.locators_for_selenium
18
+ super + [:value]
19
+ end
20
+
21
+ def mixin_web_objects_for(platform)
22
+ super
23
+ if platform[:platform] == :selenium_webdriver
24
+ require "terminus_spec/platform_selenium/web_objects/button"
25
+ self.class.send :include, TerminusSpec::Platforms::SeleniumWebDriver::Button
26
+ end
27
+ end
28
+
29
+ end # class Button
30
+
31
+ end # module WebObjects
32
+ end # module TerminusSpec
@@ -0,0 +1,40 @@
1
+ module TerminusSpec
2
+ module WebObjects
3
+
4
+ class Link < WebObject
5
+
6
+ def initialize(web_object, platform)
7
+ @web_object = web_object
8
+ mixin_web_objects_for platform
9
+ end
10
+
11
+ protected
12
+
13
+ def self.locators_for_watir
14
+ super + [:href, :text]
15
+ end
16
+
17
+ def self.mappings_for_watir
18
+ super.merge({:link => :text, :link_text => :text})
19
+ end
20
+
21
+ def self.locators_for_selenium
22
+ super + [:link, :link_text]
23
+ end
24
+
25
+ def self.mappings_for_selenium
26
+ super.merge(:text => :link_text)
27
+ end
28
+
29
+ def mixin_web_objects_for(platform)
30
+ super
31
+ if platform[:platform] == :selenium_webdriver
32
+ require "terminus_spec/platform_selenium/web_objects/link"
33
+ self.class.send :include, TerminusSpec::Platforms::SeleniumWebDriver::Link
34
+ end
35
+ end
36
+
37
+ end # class Link
38
+
39
+ end # module WebObjects
40
+ end # module TerminusSpec
@@ -0,0 +1,45 @@
1
+ module TerminusSpec
2
+ module WebObjects
3
+
4
+ class TextField < WebObject
5
+
6
+ def initialize(web_object, platform)
7
+ @web_object = web_object
8
+ mixin_web_objects_for platform
9
+ end
10
+
11
+ protected
12
+
13
+ def self.locators_for_watir
14
+ super + [:tag_name]
15
+ end
16
+
17
+ def self.mappings_for_watir
18
+ super.merge({:css => :tag_name})
19
+ end
20
+
21
+ def self.locators_for_selenium
22
+ super + [:css]
23
+ end
24
+
25
+ def self.mappings_for_selenium
26
+ super.merge({:tag_name => :css})
27
+ end
28
+
29
+ def mixin_web_objects_for(platform)
30
+ super
31
+ if platform[:platform] == :watir_webdriver
32
+ require "terminus_spec/platform_watir/web_objects/text_field"
33
+ self.class.send :include, TerminusSpec::Platforms::WatirWebDriver::TextField
34
+ elsif platform[:platform] == :selenium_webdriver
35
+ require "terminus_spec/platform_selenium/web_objects/text_field"
36
+ self.class.send :include, TerminusSpec::Platforms::SeleniumWebDriver::TextField
37
+ else
38
+ raise ArgumentError, "Unable to mixin web objects for the specified platform."
39
+ end
40
+ end
41
+
42
+ end # class TextField
43
+
44
+ end # module WebObjects
45
+ end # module TerminusSpec
@@ -0,0 +1,37 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'watir-webdriver'
5
+ require 'selenium-webdriver'
6
+ require 'terminus_spec'
7
+
8
+ require 'simplecov'
9
+ SimpleCov.start { add_filter "/spec/" }
10
+
11
+ def mock_browser_with_watir
12
+ watir_browser = double('watir')
13
+ watir_browser.stub(:is_a?).with(anything()).and_return(false)
14
+ watir_browser.stub(:is_a?).with(Selenium::WebDriver::Driver).and_return(false)
15
+ watir_browser.stub(:is_a?).with(Watir::Browser).and_return(true)
16
+ watir_browser
17
+ end
18
+
19
+ def mock_browser_with_selenium
20
+ selenium_browser = double('selenium')
21
+ selenium_browser.stub(:is_a?).with(anything()).and_return(false)
22
+ selenium_browser.stub(:is_a?).with(Watir::Browser).and_return(false)
23
+ selenium_browser.stub(:is_a?).with(Selenium::WebDriver::Driver).and_return(true)
24
+ selenium_browser
25
+ end
26
+
27
+ def mock_driver(browser, platform_object)
28
+ driver = double('driver')
29
+ driver.stub(:works_for?).with(anything()).and_return(false)
30
+ driver.stub(:works_for?).with(browser).and_return(true)
31
+ driver.stub(:create_platform_object_for).and_return platform_object
32
+ driver
33
+ end
34
+
35
+ def mock_drivers_list(drivers)
36
+ TerminusSpec::Platforms.stub(:list).and_return drivers
37
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'terminus_spec/factory'
3
+
4
+ class FactoryTestPage
5
+ include TerminusSpec
6
+
7
+ url_is "http://testerstories.com"
8
+ end
9
+
10
+ class TestFactory
11
+ include TerminusSpec::Factory
12
+ attr_accessor :browser
13
+ end
14
+
15
+ describe TerminusSpec::Factory do
16
+ before(:each) do
17
+ @factory = TestFactory.new
18
+ @factory.browser = mock_browser_with_watir
19
+ end
20
+
21
+ it "should be able to visit a new page after it has been created" do
22
+ @factory.browser.should_receive(:goto)
23
+ @factory.visit FactoryTestPage do |page|
24
+ page.should be_instance_of FactoryTestPage
25
+ end
26
+ end
27
+
28
+ it "should set an instance variable that can be used outside of the page block" do
29
+ page = @factory.on FactoryTestPage
30
+ current_page = @factory.instance_variable_get "@page"
31
+ current_page.should === page
32
+ end
33
+
34
+ it "should create a new page object and execute a block if one is provided" do
35
+ @factory.browser.should_not_receive(:goto)
36
+ @factory.on FactoryTestPage do |page|
37
+ page.should be_instance_of FactoryTestPage
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ class TestPage
4
+ include TerminusSpec
5
+
6
+ url_is "http://testerstories.com"
7
+
8
+ link :static_text_examples, :text => "Static Text Examples"
9
+ link :static_text_examples_b do |this| "testing" end
10
+ text_field :server, :id => "server"
11
+ text_field :server_b do |this| "testing" end
12
+ button :submit, :id => "submit"
13
+ button :submit_b do |content| "testing" end
14
+ end
15
+
16
+ describe TerminusSpec::Generators do
17
+ let(:watir_browser) { mock_browser_with_watir }
18
+ let(:watir_page) { TestPage.new(watir_browser) }
19
+
20
+ let(:selenium_browser) { mock_browser_with_selenium }
21
+ let(:selenium_page) { TestPage.new(selenium_browser) }
22
+
23
+ describe "there are page objects that contain location information" do
24
+ context "which means" do
25
+ it "it should be possible to navigate to a page when requested" do
26
+ watir_browser.should_receive(:goto)
27
+ page = TestPage.new(watir_browser, true)
28
+ end
29
+
30
+ it "it should not navigate to a page when not requested" do
31
+ watir_browser.should_not_receive(:goto)
32
+ page = TestPage.new(watir_browser)
33
+ end
34
+
35
+ it "it should not navigate to a page when a url is not specified" do
36
+ watir_browser.should_not_receive(:goto)
37
+ page = TestPage.new(watir_browser)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "there are link generators" do
43
+ context "and when a link is declared on a page" do
44
+ it "methods for querying and manipulating the link should be generated" do
45
+ watir_page.should respond_to(:static_text_examples)
46
+ watir_page.should respond_to(:static_text_examples_object)
47
+ watir_page.should respond_to(:static_text_examples_link)
48
+ end
49
+
50
+ it "blocks declared with the object will be executed" do
51
+ watir_page.static_text_examples_b_link.should == "testing"
52
+ end
53
+ end
54
+
55
+ context "and when used on the watir platform implementation" do
56
+ it "it should be possible to find a link object" do
57
+ watir_browser.should_receive(:link).and_return(watir_browser)
58
+ web_object = watir_page.static_text_examples_object
59
+ web_object.should be_instance_of TerminusSpec::WebObjects::Link
60
+ end
61
+
62
+ it "it should be possible to select (and thus click) a link" do
63
+ watir_browser.stub_chain(:link, :click)
64
+ watir_page.static_text_examples
65
+ end
66
+ end
67
+
68
+ context "and when used on the selenium platform implementation" do
69
+ it "it should be possible to find a link object" do
70
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
71
+ web_object = selenium_page.static_text_examples_object
72
+ web_object.should be_instance_of TerminusSpec::WebObjects::Link
73
+ end
74
+
75
+ it "it should be possible to select (and thus click) a link" do
76
+ selenium_browser.stub_chain(:find_element, :click)
77
+ selenium_page.static_text_examples
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "there are text field generators" do
83
+ context "and when a text field is declared on a page" do
84
+ it "methods for querying and manipulating the text field should be generated" do
85
+ watir_page.should respond_to(:server)
86
+ watir_page.should respond_to(:server=)
87
+ watir_page.should respond_to(:server_object)
88
+ watir_page.should respond_to(:server_text_field)
89
+ end
90
+
91
+ it "blocks declared with the object will be executed" do
92
+ watir_page.server_b_object.should == "testing"
93
+ end
94
+ end
95
+
96
+ context "and when used on the watir platform implementation" do
97
+ it "it should be possible to find a text field object" do
98
+ watir_browser.should_receive(:text_field).and_return(watir_browser)
99
+ web_object = watir_page.server_object
100
+ web_object.should be_instance_of TerminusSpec::WebObjects::TextField
101
+ end
102
+
103
+ it "it should be possible to get the text from a text field" do
104
+ watir_browser.should_receive(:text_field).and_return(watir_browser)
105
+ watir_browser.should_receive(:value).and_return("Testing")
106
+ watir_page.server.should == "Testing"
107
+ end
108
+
109
+ it "it should be possible to type text into a text field" do
110
+ watir_browser.should_receive(:text_field).and_return(watir_browser)
111
+ watir_browser.should_receive(:set).with("Testing")
112
+ watir_page.server = "Testing"
113
+ end
114
+ end
115
+
116
+ context "and when used on the selenium platform implementation" do
117
+ it "it should be possible to find a text field object" do
118
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
119
+ web_object = selenium_page.server_object
120
+ web_object.should be_instance_of TerminusSpec::WebObjects::TextField
121
+ end
122
+
123
+ it "it should be possible to get the text from a text field" do
124
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
125
+ selenium_browser.should_receive(:attribute).with('value').and_return("Testing")
126
+ selenium_page.server.should == "Testing"
127
+ end
128
+
129
+ it "it should be possible to type text into a text field" do
130
+ selenium_browser.should_receive(:find_element).twice.and_return(selenium_browser)
131
+ selenium_browser.should_receive(:clear)
132
+ selenium_browser.should_receive(:send_keys).with("Testing")
133
+ selenium_page.server = "Testing"
134
+ end
135
+ end
136
+ end
137
+
138
+ describe "there are button generators" do
139
+ context "and when a button is declared on a page" do
140
+ it "methods for querying and manipulating the button should be generated" do
141
+ watir_page.should respond_to(:submit)
142
+ watir_page.should respond_to(:submit_object)
143
+ watir_page.should respond_to(:submit_button)
144
+ end
145
+
146
+ it "blocks declared with the object will be executed" do
147
+ watir_page.submit_b_object.should == "testing"
148
+ end
149
+ end
150
+
151
+ context "and when used on the watir platform implementation" do
152
+ it "it should be possible to find a button object" do
153
+ watir_browser.should_receive(:button).and_return(watir_browser)
154
+ web_object = watir_page.submit_object
155
+ web_object.should be_instance_of TerminusSpec::WebObjects::Button
156
+ end
157
+
158
+ it "it should be possible to click a button object" do
159
+ watir_browser.should_receive(:button).and_return(watir_browser)
160
+ watir_browser.should_receive(:click)
161
+ watir_page.submit
162
+ end
163
+ end
164
+
165
+ context "and when used on the selenium platform implementation" do
166
+ it "it should be possible to find a button object" do
167
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
168
+ web_object = selenium_page.submit_object
169
+ web_object.should be_instance_of TerminusSpec::WebObjects::Button
170
+ end
171
+
172
+ it "it should be possible to click a button object" do
173
+ selenium_browser.should_receive(:find_element).and_return(selenium_browser)
174
+ selenium_browser.should_receive(:click)
175
+ selenium_page.submit
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ class LocatorTestPage
4
+ include TerminusSpec
5
+ end
6
+
7
+ describe TerminusSpec::Locators do
8
+ let(:watir_browser) { mock_browser_with_watir }
9
+ let(:watir_page) { LocatorTestPage.new(watir_browser) }
10
+
11
+ context "a web object may not have been declared but is being referenced" do
12
+ it "and so it should be able to find a link object" do
13
+ watir_browser.should_receive(:link).with(:id => 'test').and_return(watir_browser)
14
+ web_object = watir_page.link_web_object(:id => 'test')
15
+ web_object.should be_instance_of TerminusSpec::WebObjects::Link
16
+ end
17
+
18
+ it "and so it should be able to find a text field object" do
19
+ watir_browser.should_receive(:text_field).with(:id => 'test').and_return(watir_browser)
20
+ web_object = watir_page.text_field_web_object(:id => 'test')
21
+ web_object.should be_instance_of TerminusSpec::WebObjects::TextField
22
+ end
23
+
24
+ it "and so it should be able to find a button object" do
25
+ watir_browser.should_receive(:button).with(:id => 'test').and_return(watir_browser)
26
+ web_object = watir_page.button_web_object(:id => 'test')
27
+ web_object.should be_instance_of TerminusSpec::WebObjects::Button
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe TerminusSpec::Platforms::SeleniumWebDriver do
4
+ it "should be in the platform objects driver list" do
5
+ TerminusSpec::Platforms.list[:selenium_webdriver].should be TerminusSpec::Platforms::SeleniumWebDriver
6
+ end
7
+
8
+ describe "and when used to create a platform object" do
9
+ let(:browser) { double('browser') }
10
+ let(:platform) { TerminusSpec::Platforms::SeleniumWebDriver.create_platform_object_for(browser) }
11
+
12
+ it "a SeleniumPlatformObject should be created" do
13
+ platform.should be_kind_of TerminusSpec::Platforms::SeleniumWebDriver::PlatformObject
14
+ end
15
+ end
16
+
17
+ describe "and when checking if the platform can be associated with a browser" do
18
+ it "if the browser is of type Selenium::WebDriver, the platform will be associated " do
19
+ browser = mock_browser_with_selenium()
20
+ TerminusSpec::Platforms::SeleniumWebDriver.works_for?(browser).should be true
21
+ end
22
+
23
+ it "if the browser is not of type Selenium::WebDriver, the platform will not be associated" do
24
+ browser = "fake browser"
25
+ TerminusSpec::Platforms::SeleniumWebDriver.works_for?(browser).should be false
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe TerminusSpec::Platforms::WatirWebDriver do
4
+ it "should be in the platform objects driver list" do
5
+ TerminusSpec::Platforms.list[:watir_webdriver].should be TerminusSpec::Platforms::WatirWebDriver
6
+ end
7
+
8
+ describe "and when used to create a platform object" do
9
+ let(:browser) { double('browser') }
10
+ let(:platform) { TerminusSpec::Platforms::WatirWebDriver.create_platform_object_for(browser) }
11
+
12
+ it "a WatirPlatformObject should be created" do
13
+ platform.should be_kind_of TerminusSpec::Platforms::WatirWebDriver::PlatformObject
14
+ end
15
+
16
+ it "the browser should be associated with the platform object" do
17
+ platform.browser.should be browser
18
+ end
19
+ end
20
+
21
+ describe "and when checking if the platform can be associated with a browser" do
22
+ it "if the browser is of type Watir::Browser, the platform will be associated " do
23
+ browser = mock_browser_with_watir()
24
+ TerminusSpec::Platforms::WatirWebDriver.works_for?(browser).should be true
25
+ end
26
+
27
+ it "if the browser is not of type Watir::Browser, the platform will not be associated" do
28
+ browser = "fake browser"
29
+ TerminusSpec::Platforms::WatirWebDriver.works_for?(browser).should be false
30
+ end
31
+ end
32
+ end