sauce 1.0.2 → 2.0.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 (56) hide show
  1. data/.document +5 -0
  2. data/.gitignore +30 -0
  3. data/Gemfile +16 -0
  4. data/README.markdown +39 -145
  5. data/Rakefile +46 -20
  6. data/bin/sauce +72 -61
  7. data/gemfiles/rails2.gemfile +10 -0
  8. data/gemfiles/rails2.gemfile.lock +77 -0
  9. data/gemfiles/rails3.gemfile +9 -0
  10. data/gemfiles/rails3.gemfile.lock +137 -0
  11. data/lib/generators/sauce/install/install_generator.rb +1 -2
  12. data/lib/sauce.rb +0 -22
  13. data/lib/sauce/capybara.rb +70 -32
  14. data/lib/sauce/capybara/cucumber.rb +121 -0
  15. data/lib/sauce/config.rb +57 -13
  16. data/lib/sauce/connect.rb +22 -11
  17. data/lib/sauce/integrations.rb +27 -69
  18. data/lib/sauce/jasmine.rb +35 -0
  19. data/lib/sauce/jasmine/rake.rb +47 -0
  20. data/lib/sauce/jasmine/runner.rb +4 -0
  21. data/lib/sauce/job.rb +10 -6
  22. data/lib/sauce/raketasks.rb +0 -21
  23. data/lib/sauce/selenium.rb +9 -18
  24. data/lib/sauce/utilities.rb +0 -17
  25. data/sauce.gemspec +8 -60
  26. data/spec/integration/connect_integration_spec.rb +84 -0
  27. data/spec/sauce/capybara/cucumber_spec.rb +156 -0
  28. data/spec/sauce/capybara/spec_helper.rb +42 -0
  29. data/spec/sauce/capybara_spec.rb +121 -0
  30. data/spec/sauce/config_spec.rb +239 -0
  31. data/spec/sauce/jasmine_spec.rb +49 -0
  32. data/spec/sauce/selenium_spec.rb +57 -0
  33. data/spec/spec_helper.rb +4 -0
  34. data/support/Sauce-Connect.jar +0 -0
  35. data/test/test_integrations.rb +202 -0
  36. data/test/test_testcase.rb +13 -0
  37. metadata +170 -171
  38. data/examples/helper.rb +0 -16
  39. data/examples/other_spec.rb +0 -7
  40. data/examples/saucelabs_spec.rb +0 -12
  41. data/examples/test_saucelabs.rb +0 -13
  42. data/examples/test_saucelabs2.rb +0 -9
  43. data/support/sauce_connect +0 -938
  44. data/support/selenium-server.jar +0 -0
  45. data/support/simplejson/LICENSE.txt +0 -19
  46. data/support/simplejson/__init__.py +0 -437
  47. data/support/simplejson/decoder.py +0 -421
  48. data/support/simplejson/encoder.py +0 -501
  49. data/support/simplejson/ordered_dict.py +0 -119
  50. data/support/simplejson/scanner.py +0 -77
  51. data/support/simplejson/tool.py +0 -39
  52. data/test/test_config.rb +0 -112
  53. data/test/test_connect.rb +0 -45
  54. data/test/test_job.rb +0 -13
  55. data/test/test_selenium.rb +0 -50
  56. data/test/test_selenium2.rb +0 -9
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'sauce/capybara'
3
+ require 'sauce/capybara/cucumber'
4
+
5
+ describe Sauce::Capybara do
6
+ describe '#connect_tunnel' do
7
+ before :each do
8
+ $sauce_tunnel = nil
9
+ end
10
+
11
+ let(:connector) do
12
+ connector = double()
13
+ connector.should_receive(:connect)
14
+ connector.should_receive(:wait_until_ready)
15
+ connector
16
+ end
17
+
18
+ it 'should not do anything if the sauce tunnel exists' do
19
+ $sauce_tunnel = 1337
20
+ Sauce::Capybara.connect_tunnel.should == 1337
21
+ end
22
+
23
+ it 'should connect if the tunnel is not connected' do
24
+ Sauce::Connect.should_receive(:new).and_return(connector)
25
+
26
+ Sauce::Capybara.connect_tunnel
27
+ end
28
+
29
+ it 'should pass the quiet option to Sauce::Connect' do
30
+ Sauce::Connect.should_receive(:new).with(
31
+ hash_including(:quiet => true)).and_return(connector)
32
+ Sauce::Capybara.connect_tunnel(:quiet => true)
33
+ end
34
+
35
+ after :each do
36
+ $sauce_tunnel = nil
37
+ end
38
+ end
39
+
40
+ describe Sauce::Capybara::Driver do
41
+ describe '#browser' do
42
+ before :each do
43
+ # Stub out the selenium driver startup
44
+ Sauce::Selenium2.stub(:new).and_return(nil)
45
+ end
46
+ context 'when tunneling is disabled' do
47
+ it 'should not call #connect_tunnel' do
48
+ Sauce::Capybara.should_receive(:connect_tunnel).never
49
+ Sauce.config do |c|
50
+ c[:start_tunnel] = false
51
+ end
52
+
53
+ driver = Sauce::Capybara::Driver.new(nil)
54
+ driver.browser
55
+ end
56
+ end
57
+ end
58
+ context 'with a mock app' do
59
+ let(:app) { double('Mock App for Driver') }
60
+
61
+ subject do
62
+ Sauce::Capybara::Driver.new(app)
63
+ end
64
+
65
+ describe '#find' do
66
+ let(:selector) { '#lol' }
67
+
68
+ context 'with an environment override' do
69
+ before :each do
70
+ ENV['SAUCE_DISABLE_RETRY'] = '1'
71
+ end
72
+
73
+ it 'should not retry and raise the error' do
74
+ subject.should_receive(:base_find).with(selector).and_raise(Selenium::WebDriver::Error::UnknownError)
75
+
76
+ expect {
77
+ subject.find(selector)
78
+ }.to raise_error(Selenium::WebDriver::Error::UnknownError)
79
+ end
80
+
81
+ after :each do
82
+ ENV['SAUCE_DISABLE_RETRY'] = nil
83
+ end
84
+ end
85
+
86
+ it 'should route through handle_retry' do
87
+ subject.should_receive(:base_find).with(selector) # BLECH
88
+ subject.find(selector)
89
+ end
90
+
91
+ it 'should retry 3 times and then raise' do
92
+ subject.should_receive(:base_find).with(selector).exactly(4).times.and_raise(Selenium::WebDriver::Error::UnknownError)
93
+
94
+ expect {
95
+ subject.find(selector)
96
+ }.to raise_error(Selenium::WebDriver::Error::UnknownError)
97
+ end
98
+ end
99
+
100
+ describe '#visit' do
101
+ it 'should route through #handle_retry' do
102
+ path = '/lol'
103
+ subject.should_receive(:base_visit).with(path)
104
+ subject.visit(path)
105
+ end
106
+ end
107
+
108
+ describe '#current_url' do
109
+ it 'should route through #handle_retry' do
110
+ url = 'http://lol'
111
+ subject.should_receive(:base_current_url).and_return(url)
112
+ subject.current_url.should == url
113
+ end
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ describe '#install_hooks' do
120
+ end
121
+ end
@@ -0,0 +1,239 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'sauce/config'
3
+
4
+ describe Sauce::Config do
5
+ let(:c) do
6
+ config = Sauce::Config.new
7
+ config.stub(:silence_warnings).and_return(true)
8
+ config
9
+ end
10
+ before :each do
11
+ Sauce.clear_config
12
+ end
13
+
14
+ describe '#[]' do
15
+ it "should return nil for options that don't exist" do
16
+ c = Sauce::Config.new
17
+ c[:undefined].should be_nil
18
+ end
19
+
20
+ it "should return defaults if they haven't been set" do
21
+ c = Sauce::Config.new
22
+ c[:browser].should == Sauce::Config::DEFAULT_OPTIONS[:browser]
23
+ end
24
+
25
+ it "should return the value set in the constructor" do
26
+ c = Sauce::Config.new(:myoption => 1337)
27
+ c[:myoption].should == 1337
28
+ end
29
+ end
30
+
31
+ describe "#[]=" do
32
+ it "should allow setting arbitrary options" do
33
+ c[:setting_option] = 1337
34
+ c[:setting_option].should == 1337
35
+ end
36
+
37
+ it "should allow using strings for keys" do
38
+ c["my-option"] = 1337
39
+ c["my-option"].should == 1337
40
+ end
41
+ end
42
+
43
+ describe 'deprecate method_missing' do
44
+ it 'should warn when accessing an old style method' do
45
+ c.stub(:silence_warnings).and_return(false)
46
+ c.should_receive(:warn).with(anything)
47
+ c.capture_traffic
48
+ end
49
+ end
50
+
51
+ describe '#host' do
52
+ it 'should return ondemand.saucelabs.com by default' do
53
+ c.host.should == 'ondemand.saucelabs.com'
54
+ end
55
+ end
56
+
57
+ describe '#os' do
58
+ it 'should return the value set in the config block' do
59
+ Sauce.config do |config|
60
+ config.os = 'TEST_OS'
61
+ end
62
+
63
+ c = Sauce::Config.new
64
+ c.os.should == 'TEST_OS'
65
+ end
66
+ end
67
+
68
+ describe '#to_browser_string' do
69
+ before :each do
70
+ @original_env = {}
71
+ Sauce::Config::ENVIRONMENT_VARIABLES.each do |key|
72
+ @original_env[key] = ENV[key] if ENV[key]
73
+ end
74
+ end
75
+
76
+ it 'should create a browser string from the environment' do
77
+ ENV['SAUCE_USERNAME'] = "test_user"
78
+ ENV['SAUCE_ACCESS_KEY'] = "test_access"
79
+ ENV['SAUCE_OS'] = "Linux"
80
+ ENV['SAUCE_BROWSER'] = "firefox"
81
+ ENV['SAUCE_BROWSER_VERSION'] = "3."
82
+
83
+ config = Sauce::Config.new
84
+ browser_data = JSON.parse(config.to_browser_string)
85
+ browser_data.should == {'name' => 'Unnamed Ruby job',
86
+ 'access-key' => 'test_access',
87
+ 'os' => 'Linux',
88
+ 'username' => 'test_user',
89
+ 'browser-version' => '3.',
90
+ 'browser' => 'firefox'}
91
+ end
92
+
93
+ it 'should create a browser string from parameters' do
94
+ config = Sauce::Config.new(:username => 'test_user',
95
+ :access_key => 'test_access',
96
+ :os => 'Linux',
97
+ :browser => 'firefox',
98
+ :browser_version => '3.')
99
+
100
+ browser_data = JSON.parse(config.to_browser_string)
101
+ browser_data.should == {'name' => 'Unnamed Ruby job',
102
+ 'access-key' => 'test_access',
103
+ 'os' => 'Linux',
104
+ 'username' => 'test_user',
105
+ 'browser-version' => '3.',
106
+ 'browser' => 'firefox'}
107
+ end
108
+
109
+ it 'should create a browser string with optional parameters' do
110
+ config = Sauce::Config.new(:username => "test_user", :access_key => "test_access",
111
+ :os => "Linux", :browser => "firefox", :browser_version => "3.",
112
+ :"user-extensions-url" => "testing")
113
+ browser_data = JSON.parse(config.to_browser_string)
114
+ browser_data.should == {'name' => 'Unnamed Ruby job',
115
+ 'access-key' => 'test_access',
116
+ 'os' => 'Linux',
117
+ 'username' => 'test_user',
118
+ 'browser-version' => '3.',
119
+ 'browser' => 'firefox',
120
+ 'user-extensions-url' => 'testing'}
121
+ end
122
+
123
+ it 'should create a browser string with optional parameters as underscored symbols' do
124
+ config = Sauce::Config.new(:username => "test_user", :access_key => "test_access",
125
+ :os => "Linux", :browser => "firefox", :browser_version => "3.",
126
+ :user_extensions_url => "testing")
127
+ browser_data = JSON.parse(config.to_browser_string)
128
+ browser_data.should == {'name' => 'Unnamed Ruby job',
129
+ 'access-key' => 'test_access',
130
+ 'os' => 'Linux',
131
+ 'username' => 'test_user',
132
+ 'browser-version' => '3.',
133
+ 'browser' => 'firefox',
134
+ 'user-extensions-url' => 'testing'}
135
+ end
136
+
137
+ after :each do
138
+ Sauce::Config::ENVIRONMENT_VARIABLES.each do |key|
139
+ ENV[key] = @original_env[key]
140
+ end
141
+ end
142
+ end
143
+
144
+ describe '#to_desired_capabilities' do
145
+ context 'platforms' do
146
+ it 'should refer to Windows 2003 as WINDOWS' do
147
+ config = Sauce::Config.new(:os => "Windows 2003")
148
+ config.to_desired_capabilities[:platform].should == 'WINDOWS'
149
+ end
150
+
151
+ it 'should refer to Windows 2008 as VISTA' do
152
+ config = Sauce::Config.new(:os => "Windows 2008")
153
+ config.to_desired_capabilities[:platform].should == 'VISTA'
154
+ end
155
+ end
156
+ end
157
+
158
+ context 'configuring Sauce' do
159
+ it 'should make foo? methods for set boolean values' do
160
+ c.some_option = true
161
+ c.some_option?.should be true
162
+ end
163
+
164
+ describe 'browsers=' do
165
+ it 'should default the config to the first item' do
166
+ Sauce.config do |config|
167
+ config.browsers = [['TEST_OS', 'TEST_BROWSER', 'TEST_BROWSER_VERSION']]
168
+ end
169
+
170
+ c = Sauce::Config.new
171
+ c.os.should == 'TEST_OS'
172
+ c.browser.should == 'TEST_BROWSER'
173
+ c.browser_version == 'TEST_BROWSER_VERSION'
174
+ end
175
+ end
176
+
177
+ describe 'browsers' do
178
+ it 'should return an Array of the (os, browser, version)' do
179
+ c.os = 'A'
180
+ c.browser = 'B'
181
+ c.browser_version = 'C'
182
+
183
+ c.browsers.should == [['A', 'B', 'C']]
184
+ end
185
+ end
186
+
187
+ it 'should allow overrides as constructor options' do
188
+ Sauce.config do |config|
189
+ config.browsers = [['OS1', 'BROWSER1', 'BROWSER_VERSION1']]
190
+ end
191
+
192
+ c = Sauce::Config.new(:os => 'OS2', :browser => 'BROWSER2',
193
+ :browser_version => 'BROWSER_VERSION2')
194
+ c.os.should == 'OS2'
195
+ c.browser.should == 'BROWSER2'
196
+ c.browser_version.should == 'BROWSER_VERSION2'
197
+ end
198
+ end
199
+ end
200
+
201
+ describe Sauce do
202
+ describe '#get_config' do
203
+ context 'when #config has never been called' do
204
+ # See: <https://github.com/saucelabs/sauce_ruby/issues/59>
205
+ before :each do
206
+ # This is kind of hack-ish, but the best way I can think to properly
207
+ # prevent this class variable from existing
208
+ Sauce.instance_variable_set(:@cfg, nil)
209
+ end
210
+
211
+ it 'should return a newly created Sauce::Config' do
212
+ dummy_config = double('Sauce::Config')
213
+ Sauce::Config.should_receive(:new).and_return(dummy_config)
214
+ Sauce.get_config.should_not be nil
215
+ end
216
+ end
217
+
218
+ context 'when config has been called' do
219
+ before :each do
220
+ Sauce.clear_config
221
+ Sauce.config do |c|
222
+ c[:some_setting] = true
223
+ end
224
+ end
225
+ it 'should return the same config with the same configuration' do
226
+ Sauce.get_config.should_not be nil
227
+ Sauce.get_config[:some_setting].should be true
228
+ end
229
+ end
230
+ end
231
+
232
+ describe '#clear_config' do
233
+ it 'should reset the config object' do
234
+ c = Sauce.get_config
235
+ Sauce.clear_config
236
+ c.should_not equal(Sauce.get_config)
237
+ end
238
+ end
239
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'sauce/jasmine'
3
+
4
+ describe Sauce::Jasmine::Driver do
5
+ describe '#initialize' do
6
+ let(:address) { 'http://saucelabs.com' }
7
+ let(:browser) { 'firefox' }
8
+
9
+ it 'should take set the @http_address' do
10
+ Sauce::Selenium2.stub(:new)
11
+ d = Sauce::Jasmine::Driver.new(browser, address)
12
+ d.http_address.should equal(address)
13
+ end
14
+
15
+ it 'should initialize a Sauce driver' do
16
+ Sauce::Selenium2.should_receive(:new).with(hash_including(:browser => browser)).and_return(true)
17
+ d = Sauce::Jasmine::Driver.new(browser, address)
18
+ d.should_not be_nil
19
+ end
20
+ end
21
+ end
22
+
23
+
24
+ describe Jasmine::Config do
25
+ describe '#start' do
26
+ before :each do
27
+ # Stub out the creation of the Selenium2 driver itself
28
+ Sauce::Selenium2.stub(:new)
29
+ Sauce::Jasmine::Driver.stub(:new).and_return(driver)
30
+ end
31
+
32
+ let(:driver) do
33
+ driver = mock('Sauce::Jasmine::Driver')
34
+ driver.stub(:connect)
35
+ driver
36
+ end
37
+
38
+ it 'should create a Sauce::Jasmine::Driver' do
39
+ Sauce::Jasmine::Driver.should_receive(:new).and_return(driver)
40
+ subject.start
41
+ subject.instance_variable_get(:@client).should be driver
42
+ end
43
+
44
+ it 'should call connect on the driver' do
45
+ driver.should_receive(:connect)
46
+ subject.start
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Sauce::Selenium2 do
4
+ let(:mock_driver) { Hash.new }
5
+
6
+ before :each do
7
+ ::Selenium::WebDriver.should_receive(:for).and_return(mock_driver)
8
+ end
9
+
10
+ describe '#initialize' do
11
+ it 'should work without arguments' do
12
+ client = Sauce::Selenium2.new
13
+ client.should_not be nil
14
+ end
15
+
16
+ it 'should pass the job_name argument into the config' do
17
+ expected = 'Dummy Job Name'
18
+ client = Sauce::Selenium2.new(:job_name => expected)
19
+ client.config[:job_name].should == expected
20
+ end
21
+ end
22
+
23
+
24
+ context 'with an initialized object' do
25
+ before :each do
26
+ @client = Sauce::Selenium2.new
27
+ end
28
+
29
+ describe '#stop' do
30
+ it 'should call quit on the driver' do
31
+ @client.driver.should_receive(:quit).and_return(true)
32
+ @client.stop
33
+ end
34
+ end
35
+
36
+ describe '#session_id' do
37
+ it 'should query the driver for the session_id' do
38
+ expected = 101
39
+ bridge = mock('bridge')
40
+ bridge.should_receive(:session_id).and_return(expected)
41
+ @client.driver.should_receive(:bridge).and_return(bridge)
42
+ @client.session_id.should == expected
43
+ end
44
+ end
45
+
46
+ describe '#method_missing' do
47
+ it 'should pass #navigate#to onto the driver' do
48
+ url = 'http://example.com'
49
+ navigator = mock('navigator')
50
+ navigator.should_receive(:to).with(url).and_return(true)
51
+ @client.driver.should_receive(:navigate).and_return(navigator)
52
+
53
+ @client.navigate.to url
54
+ end
55
+ end
56
+ end
57
+ end