sauce_bindings 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'webmock/rspec'
5
+
6
+ module SauceBindings
7
+ describe Session do
8
+ let(:valid_response) do
9
+ {status: 200,
10
+ body: {value: {sessionId: '0', capabilities: Selenium::WebDriver::Remote::Capabilities.chrome}}.to_json,
11
+ headers: {"content_type": 'application/json'}}
12
+ end
13
+ let(:default_capabilities) do
14
+ {browserName: 'chrome',
15
+ browserVersion: 'latest',
16
+ platformName: 'Windows 10',
17
+ 'sauce:options': {build: 'TEMP BUILD: 11'}}
18
+ end
19
+
20
+ def expect_request(body: nil, endpoint: nil)
21
+ body = (body || {desiredCapabilities: default_capabilities,
22
+ capabilities: {firstMatch: [default_capabilities]}}).to_json
23
+ endpoint ||= 'https://ondemand.us-west-1.saucelabs.com/wd/hub/session'
24
+ stub_request(:post, endpoint).with(body: body).to_return(valid_response)
25
+ end
26
+
27
+ before do
28
+ ENV['BUILD_TAG'] = ''
29
+ ENV['BUILD_NAME'] = 'TEMP BUILD'
30
+ ENV['BUILD_NUMBER'] = '11'
31
+ ENV['SAUCE_USERNAME'] = 'foo'
32
+ ENV['SAUCE_ACCESS_KEY'] = '123'
33
+ end
34
+
35
+ after do
36
+ ENV.delete 'BUILD_TAG'
37
+ ENV.delete 'BUILD_NAME'
38
+ ENV.delete 'BUILD_NUMBER'
39
+ ENV.delete 'SAUCE_USERNAME'
40
+ ENV.delete 'SAUCE_ACCESS_KEY'
41
+ end
42
+
43
+ describe '#new' do
44
+ it 'creates default Options instance if none is provided' do
45
+ session = Session.new
46
+
47
+ expected_results = {url: 'https://foo:123@ondemand.us-west-1.saucelabs.com:443/wd/hub',
48
+ desired_capabilities: {'browserName' => 'chrome',
49
+ 'browserVersion' => 'latest',
50
+ 'platformName' => 'Windows 10',
51
+ 'sauce:options' => {'build' => 'TEMP BUILD: 11'}}}
52
+ expect(session.to_selenium).to eq expected_results
53
+ end
54
+
55
+ it 'uses provided Options class' do
56
+ sauce_opts = Options.new(browser_version: '123',
57
+ platform_name: 'Mac',
58
+ idle_timeout: 4)
59
+ session = Session.new(sauce_opts)
60
+
61
+ expected_results = {url: 'https://foo:123@ondemand.us-west-1.saucelabs.com:443/wd/hub',
62
+ desired_capabilities: {'browserName' => 'chrome',
63
+ 'browserVersion' => '123',
64
+ 'platformName' => 'Mac',
65
+ 'sauce:options' => {'idleTimeout' => 4,
66
+ 'build' => 'TEMP BUILD: 11'}}}
67
+ expect(session.to_selenium).to eq expected_results
68
+ end
69
+
70
+ it 'defaults to US West data Center' do
71
+ session = Session.new
72
+ expect(session.data_center).to eq :US_WEST
73
+ end
74
+
75
+ it 'uses provided Data Center' do
76
+ session = Session.new(data_center: :EU_VDC)
77
+
78
+ expected_results = {url: 'https://foo:123@ondemand.eu-central-1.saucelabs.com:443/wd/hub',
79
+ desired_capabilities: {'browserName' => 'chrome',
80
+ 'browserVersion' => 'latest',
81
+ 'platformName' => 'Windows 10',
82
+ 'sauce:options' => {'build' => 'TEMP BUILD: 11'}}}
83
+ expect(session.to_selenium).to eq expected_results
84
+ end
85
+
86
+ it 'uses provided Event Listener' do
87
+ listener = instance_double(Selenium::WebDriver::Support::AbstractEventListener)
88
+ session = Session.new(listener: listener)
89
+
90
+ expect(session.to_selenium[:listener]).to eq listener
91
+ end
92
+
93
+ it 'uses provided HTTP Client' do
94
+ http_client = instance_double(Selenium::WebDriver::Remote::Http::Default)
95
+ session = Session.new(http_client: http_client)
96
+
97
+ expect(session.to_selenium[:http_client]).to eq http_client
98
+ end
99
+
100
+ it 'raises exception if data center is invalid' do
101
+ expect { Session.new(data_center: :FOO) }.to raise_exception(ArgumentError)
102
+ end
103
+ end
104
+
105
+ describe '#start' do
106
+ it 'starts the session and returns Selenium Driver instance' do
107
+ expect_request
108
+
109
+ driver = Session.new.start
110
+ expect(driver).to be_a Selenium::WebDriver::Driver
111
+ end
112
+
113
+ it 'uses username and access key from ENV' do
114
+ session = Session.new
115
+
116
+ expect(session.url).to include('foo:123')
117
+ end
118
+
119
+ it 'raises exception if no username set' do
120
+ ENV.delete('SAUCE_USERNAME')
121
+
122
+ expect { Session.new.start }.to raise_exception(ArgumentError)
123
+ end
124
+
125
+ it 'raises exception if no access key set' do
126
+ ENV.delete('SAUCE_ACCESS_KEY')
127
+
128
+ expect { Session.new.start }.to raise_exception(ArgumentError)
129
+ end
130
+ end
131
+
132
+ describe '#stop' do
133
+ it 'quits the driver' do
134
+ driver = instance_double(Selenium::WebDriver::Remote::Driver, session_id: '1234')
135
+ allow(Selenium::WebDriver::Driver).to receive(:for).and_return(driver)
136
+ allow(driver).to receive :quit
137
+ allow(SauceWhisk::Jobs).to receive(:change_status).with('1234', true)
138
+
139
+ session = Session.new
140
+ session.start
141
+ session.stop(true)
142
+
143
+ expect(driver).to have_received(:quit)
144
+ expect(SauceWhisk::Jobs).to have_received(:change_status).with('1234', true)
145
+ end
146
+ end
147
+
148
+ describe '#data_center=' do
149
+ it 'overrides default value for data center' do
150
+ session = Session.new
151
+ session.data_center = :US_EAST
152
+
153
+ expect(session.url).to eq('https://foo:123@ondemand.us-east-1.saucelabs.com:443/wd/hub')
154
+ end
155
+
156
+ it 'raises exception if data center is invalid' do
157
+ session = Session.new
158
+
159
+ expect { session.data_center = :FOO }.to raise_exception(ArgumentError)
160
+ end
161
+ end
162
+
163
+ describe '#http_client=' do
164
+ it 'uses provided HTTP Client' do
165
+ http_client = instance_double(Selenium::WebDriver::Remote::Http::Default)
166
+ session = Session.new
167
+ session.http_client = http_client
168
+
169
+ expect(session.to_selenium[:http_client]).to eq http_client
170
+ end
171
+ end
172
+
173
+ describe '#listner=' do
174
+ it 'uses provided Event Listener' do
175
+ listener = instance_double(Selenium::WebDriver::Support::AbstractEventListener)
176
+ session = Session.new
177
+ session.listener = listener
178
+
179
+ expect(session.to_selenium[:listener]).to eq listener
180
+ end
181
+ end
182
+
183
+ describe '#url=' do
184
+ it 'allows user to override default URL' do
185
+ session = Session.new
186
+ session.url = 'https://bar:321@mycustomurl/foo/wd/hub:8080'
187
+
188
+ expected_results = {url: 'https://bar:321@mycustomurl/foo/wd/hub:8080',
189
+ desired_capabilities: {'browserName' => 'chrome',
190
+ 'browserVersion' => 'latest',
191
+ 'platformName' => 'Windows 10',
192
+ 'sauce:options' => {'build' => 'TEMP BUILD: 11'}}}
193
+ expect(session.to_selenium).to eq expected_results
194
+ end
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sauce_bindings'
4
+ require 'rspec'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |c|
8
+ c.syntax = :expect
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sauce_bindings
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.beta1
5
+ platform: ruby
6
+ authors:
7
+ - Titus Fortner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-03-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: capybara
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 12.3.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 12.3.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.66'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.66'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.32'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.32'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.5'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.5'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sauce_whisk
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: selenium-webdriver
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 3.142.0
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 3.142.7
149
+ type: :runtime
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: 3.142.0
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 3.142.7
159
+ description: Reduces complexity in user code for running Selenium tests on Sauce Labs
160
+ email:
161
+ - titusfortner@gmail.com
162
+ executables: []
163
+ extensions: []
164
+ extra_rdoc_files: []
165
+ files:
166
+ - ".gitignore"
167
+ - ".rspec"
168
+ - ".rubocop.yml"
169
+ - ".travis.yml"
170
+ - Gemfile
171
+ - LICENSE.txt
172
+ - README.md
173
+ - Rakefile
174
+ - lib/sauce_bindings.rb
175
+ - lib/sauce_bindings/capybara_session.rb
176
+ - lib/sauce_bindings/options.rb
177
+ - lib/sauce_bindings/session.rb
178
+ - lib/sauce_bindings/version.rb
179
+ - sauce_bindings.gemspec
180
+ - spec/capybara_session_spec.rb
181
+ - spec/options.yml
182
+ - spec/options_spec.rb
183
+ - spec/session_spec.rb
184
+ - spec/spec_helper.rb
185
+ homepage: https://github.com/saucelabs/sauce_bindings
186
+ licenses:
187
+ - MIT
188
+ metadata: {}
189
+ post_install_message:
190
+ rdoc_options: []
191
+ require_paths:
192
+ - lib
193
+ required_ruby_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">"
201
+ - !ruby/object:Gem::Version
202
+ version: 1.3.1
203
+ requirements: []
204
+ rubygems_version: 3.0.3
205
+ signing_key:
206
+ specification_version: 4
207
+ summary: Simple interface for interacting with Sauce Labs.
208
+ test_files:
209
+ - spec/capybara_session_spec.rb
210
+ - spec/options.yml
211
+ - spec/options_spec.rb
212
+ - spec/session_spec.rb
213
+ - spec/spec_helper.rb