quke 0.6.0 → 0.7.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.
- checksums.yaml +5 -5
- data/README.md +4 -4
- data/Rakefile +9 -7
- data/exe/quke +6 -2
- data/lib/features/support/after_hook.rb +11 -6
- data/lib/features/support/after_step_hook.rb +3 -1
- data/lib/features/support/before_hook.rb +6 -4
- data/lib/features/support/env.rb +17 -20
- data/lib/quke.rb +12 -7
- data/lib/quke/browserstack_configuration.rb +19 -18
- data/lib/quke/browserstack_status_reporter.rb +6 -4
- data/lib/quke/configuration.rb +30 -26
- data/lib/quke/cuke_runner.rb +6 -4
- data/lib/quke/driver_configuration.rb +12 -14
- data/lib/quke/driver_registration.rb +8 -6
- data/lib/quke/version.rb +3 -1
- data/spec/quke/browserstack_configuration_spec.rb +262 -0
- data/spec/quke/browserstack_status_reporter_spec.rb +129 -0
- data/spec/quke/configuration_spec.rb +270 -0
- data/spec/quke/cuke_runner_spec.rb +36 -0
- data/spec/quke/driver_configuration_spec.rb +279 -0
- data/spec/quke/driver_registration_spec.rb +33 -0
- data/spec/quke/quke_spec.rb +18 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/helpers.rb +48 -0
- data/spec/support/simplecov.rb +29 -0
- data/spec/support/webmock.rb +3 -0
- metadata +97 -58
- data/.browserstack.yml +0 -11
- data/.codeclimate.yml +0 -19
- data/.config.example.yml +0 -198
- data/.gitignore +0 -60
- data/.rspec +0 -2
- data/.rubocop.yml +0 -61
- data/.travis.yml +0 -55
- data/CHANGELOG.md +0 -170
- data/Gemfile +0 -4
- data/quke.gemspec +0 -105
- data/quke.png +0 -0
data/lib/quke/cuke_runner.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cucumber"
|
2
4
|
|
3
5
|
module Quke #:nodoc:
|
4
6
|
|
@@ -39,8 +41,8 @@ module Quke #:nodoc:
|
|
39
41
|
# replace the last part of that result (which we know will be lib/quke)
|
40
42
|
# with lib/features. We then pass this full path to Cucumber so it can
|
41
43
|
# correctly find the folder holding our predefined env.rb file.
|
42
|
-
|
43
|
-
|
44
|
+
"-r", __dir__.sub!("lib/quke", "lib/features"),
|
45
|
+
"-r", features_folder
|
44
46
|
] + args
|
45
47
|
end
|
46
48
|
|
@@ -50,7 +52,7 @@ module Quke #:nodoc:
|
|
50
52
|
Cucumber::Cli::Main.new(@args).execute!
|
51
53
|
rescue SystemExit => e
|
52
54
|
# Cucumber calls @kernel.exit() killing your script unless you rescue
|
53
|
-
raise StandardError,
|
55
|
+
raise StandardError, "Cucumber exited in a failed state" unless e.success?
|
54
56
|
end
|
55
57
|
|
56
58
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "quke/configuration"
|
2
4
|
|
3
5
|
module Quke #:nodoc:
|
4
6
|
|
@@ -105,9 +107,9 @@ module Quke #:nodoc:
|
|
105
107
|
# mirror those you can actually supply on the command line.
|
106
108
|
# http://phantomjs.org/api/command-line.html
|
107
109
|
options = [
|
108
|
-
|
109
|
-
|
110
|
-
|
110
|
+
"--load-images=no",
|
111
|
+
"--disk-cache=false",
|
112
|
+
"--ignore-ssl-errors=yes"
|
111
113
|
]
|
112
114
|
|
113
115
|
options.push("--proxy=#{config.proxy['host']}:#{config.proxy['port']}") if config.use_proxy?
|
@@ -140,22 +142,20 @@ module Quke #:nodoc:
|
|
140
142
|
# switches: my_driver_config.chrome
|
141
143
|
# )
|
142
144
|
#
|
143
|
-
# rubocop:disable Metrics/AbcSize
|
144
145
|
def chrome
|
145
146
|
result = []
|
146
147
|
|
147
|
-
host = config.proxy[
|
148
|
-
port = config.proxy[
|
149
|
-
no_proxy = config.proxy[
|
148
|
+
host = config.proxy["host"]
|
149
|
+
port = config.proxy["port"]
|
150
|
+
no_proxy = config.proxy["no_proxy"].tr(",", ";")
|
150
151
|
|
151
152
|
result.push("--proxy-server=#{host}:#{port}") if config.use_proxy?
|
152
|
-
result.push("--proxy-bypass-list=#{no_proxy}") unless config.proxy[
|
153
|
+
result.push("--proxy-bypass-list=#{no_proxy}") unless config.proxy["no_proxy"].empty?
|
153
154
|
|
154
155
|
result.push("--user-agent=#{config.user_agent}") unless config.user_agent.empty?
|
155
156
|
|
156
157
|
result
|
157
158
|
end
|
158
|
-
# rubocop:enable Metrics/AbcSize
|
159
159
|
|
160
160
|
# Returns an instance of Selenium::WebDriver::Remote::Capabilities to be
|
161
161
|
# used when registering an instance of Capybara::Selenium::Driver,
|
@@ -184,7 +184,6 @@ module Quke #:nodoc:
|
|
184
184
|
# profile: my_driver_config.firefox
|
185
185
|
# )
|
186
186
|
#
|
187
|
-
# rubocop:disable Metrics/AbcSize
|
188
187
|
def firefox
|
189
188
|
profile = Selenium::WebDriver::Firefox::Profile.new
|
190
189
|
|
@@ -192,15 +191,14 @@ module Quke #:nodoc:
|
|
192
191
|
|
193
192
|
settings[:http] = "#{config.proxy['host']}:#{config.proxy['port']}" if config.use_proxy?
|
194
193
|
settings[:ssl] = settings[:http] if config.use_proxy?
|
195
|
-
settings[:no_proxy] = config.proxy[
|
194
|
+
settings[:no_proxy] = config.proxy["no_proxy"] unless config.proxy["no_proxy"].empty?
|
196
195
|
|
197
196
|
profile.proxy = Selenium::WebDriver::Proxy.new(settings) if config.use_proxy?
|
198
197
|
|
199
|
-
profile[
|
198
|
+
profile["general.useragent.override"] = config.user_agent unless config.user_agent.empty?
|
200
199
|
|
201
200
|
profile
|
202
201
|
end
|
203
|
-
# rubocop:enable Metrics/AbcSize
|
204
202
|
|
205
203
|
# Returns an instance of Selenium::WebDriver::Remote::Capabilities to be
|
206
204
|
# used when registering an instance of Capybara::Selenium::Driver,
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "quke/configuration"
|
4
|
+
require "capybara/poltergeist"
|
5
|
+
require "selenium/webdriver"
|
4
6
|
|
5
7
|
module Quke #:nodoc:
|
6
8
|
|
@@ -29,11 +31,11 @@ module Quke #:nodoc:
|
|
29
31
|
# When called registers with Capybara the driver specified.
|
30
32
|
def register(driver)
|
31
33
|
case driver
|
32
|
-
when
|
34
|
+
when "firefox"
|
33
35
|
firefox
|
34
|
-
when
|
36
|
+
when "chrome"
|
35
37
|
chrome
|
36
|
-
when
|
38
|
+
when "browserstack"
|
37
39
|
browserstack
|
38
40
|
else
|
39
41
|
phantomjs
|
data/lib/quke/version.rb
CHANGED
@@ -0,0 +1,262 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
RSpec.describe Quke::BrowserstackConfiguration do
|
6
|
+
describe "instantiating" do
|
7
|
+
context "when `.config.yml` is blank or contains no browserstack section" do
|
8
|
+
let(:config) do
|
9
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
10
|
+
Quke::Configuration.new
|
11
|
+
end
|
12
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
13
|
+
|
14
|
+
it "returns an instance defaulted to blank values" do
|
15
|
+
expect(subject.username).to eq("")
|
16
|
+
expect(subject.auth_key).to eq("")
|
17
|
+
expect(subject.local_key).to eq("")
|
18
|
+
expect(subject.capabilities).to eq({})
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when `.config.yml` contains a browserstack section" do
|
24
|
+
let(:config) do
|
25
|
+
Quke::Configuration.file_location = data_path(".simple.yml")
|
26
|
+
Quke::Configuration.new
|
27
|
+
end
|
28
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
29
|
+
|
30
|
+
it "returns an instance with properties that match the input" do
|
31
|
+
expect(subject.username).to eq("jdoe")
|
32
|
+
expect(subject.auth_key).to eq("123456789ABCDE")
|
33
|
+
expect(subject.local_key).to eq("123456789ABCDE")
|
34
|
+
expect(subject.capabilities).to eq(
|
35
|
+
"build" => "Version 1",
|
36
|
+
"project" => "Adding browserstack support",
|
37
|
+
"browserstack.local" => true
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when `.config.yml` contains a browserstack section but credentials are in env vars" do
|
44
|
+
let(:config) do
|
45
|
+
Quke::Configuration.file_location = data_path(".browserstack_no_credentials.yml")
|
46
|
+
Quke::Configuration.new
|
47
|
+
end
|
48
|
+
subject do
|
49
|
+
stub_const(
|
50
|
+
"ENV",
|
51
|
+
"BROWSERSTACK_USERNAME" => "tstark",
|
52
|
+
"BROWSERSTACK_AUTH_KEY" => "123456789VWXYZ",
|
53
|
+
"BROWSERSTACK_LOCAL_KEY" => "123456789REDRU"
|
54
|
+
)
|
55
|
+
Quke::BrowserstackConfiguration.new(config)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns an instance with properties that match the input" do
|
59
|
+
expect(subject.username).to eq("tstark")
|
60
|
+
expect(subject.auth_key).to eq("123456789VWXYZ")
|
61
|
+
expect(subject.local_key).to eq("123456789REDRU")
|
62
|
+
expect(subject.capabilities).to eq(
|
63
|
+
"build" => "Version 1",
|
64
|
+
"project" => "Adding browserstack support",
|
65
|
+
"browserstack.local" => true
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#test_locally?" do
|
73
|
+
context "when `.config.yml` is blank or contains no browserstack section" do
|
74
|
+
let(:config) do
|
75
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
76
|
+
Quke::Configuration.new
|
77
|
+
end
|
78
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
79
|
+
|
80
|
+
it "returns false" do
|
81
|
+
expect(subject.test_locally?).to eq(false)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when the driver is not set to 'browserstack' in `.config.yml`" do
|
87
|
+
let(:config) do
|
88
|
+
Quke::Configuration.file_location = data_path(".simple.yml")
|
89
|
+
Quke::Configuration.new
|
90
|
+
end
|
91
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
92
|
+
|
93
|
+
it "returns false" do
|
94
|
+
expect(subject.test_locally?).to eq(false)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
# Unlike some aspects of Quke's configuration where we handle users mixing
|
100
|
+
# strings and booleans ('true' and true) for setting values, because the
|
101
|
+
# browserstack capabilities are passed straight through we return false
|
102
|
+
# in this scenario to reflect what browserstack's behaviour would be
|
103
|
+
# i.e. it would fail to recognise that running locally is needed.
|
104
|
+
context "when the driver is 'browserstack' and use local testing is set to 'true' (a string) in `.config.yml`" do
|
105
|
+
let(:config) do
|
106
|
+
Quke::Configuration.file_location = data_path(".as_string.yml")
|
107
|
+
Quke::Configuration.new
|
108
|
+
end
|
109
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
110
|
+
|
111
|
+
it "returns false" do
|
112
|
+
expect(subject.test_locally?).to eq(false)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
context "when the driver is 'browserstack' and use local testing is set to true in `.config.yml`" do
|
118
|
+
let(:config) do
|
119
|
+
Quke::Configuration.file_location = data_path(".browserstack.yml")
|
120
|
+
Quke::Configuration.new
|
121
|
+
end
|
122
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
123
|
+
|
124
|
+
it "returns true" do
|
125
|
+
expect(subject.test_locally?).to eq(true)
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "local_testing_args" do
|
132
|
+
context "when `.config.yml` is blank or contains no browserstack section" do
|
133
|
+
let(:config) do
|
134
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
135
|
+
Quke::Configuration.new
|
136
|
+
end
|
137
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
138
|
+
|
139
|
+
it "defaults to a blank key, and our standard args for the local binary" do
|
140
|
+
expect(subject.local_testing_args).to eq(
|
141
|
+
"key" => "",
|
142
|
+
"force" => "true",
|
143
|
+
"onlyAutomate" => "true",
|
144
|
+
"v" => "true",
|
145
|
+
"logfile" => File.join(Dir.pwd, "/tmp/bowerstack_local_log.txt")
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
context "when `.config.yml` contains just proxy details" do
|
152
|
+
let(:config) do
|
153
|
+
Quke::Configuration.file_location = data_path(".proxy_basic.yml")
|
154
|
+
Quke::Configuration.new
|
155
|
+
end
|
156
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
157
|
+
|
158
|
+
it "defaults to a blank key, our standard args for the local binary, plus the proxy values" do
|
159
|
+
expect(subject.local_testing_args).to eq(
|
160
|
+
"key" => "",
|
161
|
+
"force" => "true",
|
162
|
+
"onlyAutomate" => "true",
|
163
|
+
"v" => "true",
|
164
|
+
"logfile" => File.join(Dir.pwd, "/tmp/bowerstack_local_log.txt"),
|
165
|
+
"proxyHost" => "10.10.2.70",
|
166
|
+
"proxyPort" => "8080"
|
167
|
+
)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context "when `.config.yml` contains both browserstack and proxy details" do
|
172
|
+
let(:config) do
|
173
|
+
Quke::Configuration.file_location = data_path(".browserstack.yml")
|
174
|
+
Quke::Configuration.new
|
175
|
+
end
|
176
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
177
|
+
|
178
|
+
it "defaults to a blank key, our standard args for the local binary, plus the proxy values" do
|
179
|
+
expect(subject.local_testing_args).to eq(
|
180
|
+
"key" => "123456789ABCDE",
|
181
|
+
"force" => "true",
|
182
|
+
"onlyAutomate" => "true",
|
183
|
+
"v" => "true",
|
184
|
+
"logfile" => File.join(Dir.pwd, "/tmp/bowerstack_local_log.txt"),
|
185
|
+
"proxyHost" => "10.10.2.70",
|
186
|
+
"proxyPort" => "8080"
|
187
|
+
)
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe "#using_browserstack?" do
|
194
|
+
context "when `.config.yml` is blank" do
|
195
|
+
let(:config) do
|
196
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
197
|
+
Quke::Configuration.new
|
198
|
+
end
|
199
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
200
|
+
|
201
|
+
it "returns false" do
|
202
|
+
expect(subject.using_browserstack?).to eq(false)
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
context "when `.config.yml` DOES NOT specify 'browserstack' as the driver" do
|
208
|
+
let(:config) do
|
209
|
+
Quke::Configuration.file_location = data_path(".simple.yml")
|
210
|
+
Quke::Configuration.new
|
211
|
+
end
|
212
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
213
|
+
|
214
|
+
it "returns false" do
|
215
|
+
expect(subject.using_browserstack?).to eq(false)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context "when `.config.yml` specifies 'browserstack' as the driver" do
|
220
|
+
let(:config) do
|
221
|
+
Quke::Configuration.file_location = data_path(".browserstack.yml")
|
222
|
+
Quke::Configuration.new
|
223
|
+
end
|
224
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
225
|
+
|
226
|
+
it "returns true" do
|
227
|
+
expect(subject.using_browserstack?).to eq(true)
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "#url" do
|
234
|
+
|
235
|
+
context "when `.config.yml` is blank or contains no browserstack section" do
|
236
|
+
let(:config) do
|
237
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
238
|
+
Quke::Configuration.new
|
239
|
+
end
|
240
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
241
|
+
|
242
|
+
it "returns nil" do
|
243
|
+
expect(subject.url).to eq(nil)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
context "when `.config.yml` contains a browserstack section" do
|
248
|
+
let(:config) do
|
249
|
+
Quke::Configuration.file_location = data_path(".browserstack.yml")
|
250
|
+
Quke::Configuration.new
|
251
|
+
end
|
252
|
+
subject { Quke::BrowserstackConfiguration.new(config) }
|
253
|
+
|
254
|
+
it "returns a string for the url to browserstack including the username and password" do
|
255
|
+
expect(subject.url).to eq(
|
256
|
+
"http://jdoe:123456789ABCDE@hub.browserstack.com/wd/hub"
|
257
|
+
)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
RSpec.describe Quke::BrowserstackStatusReporter do
|
6
|
+
subject do
|
7
|
+
Quke::Configuration.file_location = data_path(".no_file.yml")
|
8
|
+
config = Quke::BrowserstackConfiguration.new(Quke::Configuration.new)
|
9
|
+
Quke::BrowserstackStatusReporter.new(config)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#passed" do
|
13
|
+
context "when the session_id is null" do
|
14
|
+
it "raises an ArgumentError" do
|
15
|
+
expect { subject.passed }.to raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when the session_id is valid" do
|
20
|
+
before(:each) do
|
21
|
+
stub_request(:put, /browserstack/)
|
22
|
+
.with(
|
23
|
+
body: /passed/,
|
24
|
+
headers: {
|
25
|
+
"Accept" => "*/*",
|
26
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
27
|
+
"Authorization" => /Basic/,
|
28
|
+
"Content-Type" => "application/json",
|
29
|
+
"Host" => "www.browserstack.com",
|
30
|
+
"User-Agent" => "Ruby"
|
31
|
+
}
|
32
|
+
)
|
33
|
+
.to_return(status: 200, body: "", headers: {})
|
34
|
+
end
|
35
|
+
|
36
|
+
it "succesfully updates the status to 'passed'" do
|
37
|
+
expect { subject.passed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f") }.not_to raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns a message stating a given session's status was set to 'passed'" do
|
41
|
+
result = subject.passed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f")
|
42
|
+
expect(result).to eq("Browserstack session 6a22fe36d84d90ef18858f90f2c9cd2882eb082f status set to \e[32mpassed\e[0m 😀")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when the request fails" do
|
47
|
+
before(:each) do
|
48
|
+
stub_request(:put, /browserstack/)
|
49
|
+
.with(
|
50
|
+
body: /passed/,
|
51
|
+
headers: {
|
52
|
+
"Accept" => "*/*",
|
53
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
54
|
+
"Authorization" => /Basic/,
|
55
|
+
"Content-Type" => "application/json",
|
56
|
+
"Host" => "www.browserstack.com",
|
57
|
+
"User-Agent" => "Ruby"
|
58
|
+
}
|
59
|
+
)
|
60
|
+
.to_return(status: 500, body: "", headers: {})
|
61
|
+
end
|
62
|
+
|
63
|
+
it "raises an error" do
|
64
|
+
expect { subject.passed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f") }.to raise_error(StandardError)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#failed" do
|
71
|
+
context "when the session_id is null" do
|
72
|
+
it "raises an ArgumentError" do
|
73
|
+
expect { subject.failed }.to raise_error(ArgumentError)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when the session_id is valid" do
|
78
|
+
before(:each) do
|
79
|
+
stub_request(:put, /browserstack/)
|
80
|
+
.with(
|
81
|
+
body: /failed/,
|
82
|
+
headers: {
|
83
|
+
"Accept" => "*/*",
|
84
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
85
|
+
"Authorization" => /Basic/,
|
86
|
+
"Content-Type" => "application/json",
|
87
|
+
"Host" => "www.browserstack.com",
|
88
|
+
"User-Agent" => "Ruby"
|
89
|
+
}
|
90
|
+
)
|
91
|
+
.to_return(status: 200, body: "", headers: {})
|
92
|
+
end
|
93
|
+
|
94
|
+
it "succesfully updates the status to 'failed'" do
|
95
|
+
expect { subject.failed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f") }.not_to raise_error
|
96
|
+
end
|
97
|
+
|
98
|
+
it "returns a message stating a given session's status was set to 'failed'" do
|
99
|
+
result = subject.failed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f")
|
100
|
+
expect(result).to eq("Browserstack session 6a22fe36d84d90ef18858f90f2c9cd2882eb082f status set to \e[31mfailed\e[0m 😢")
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
context "when the request fails" do
|
106
|
+
before(:each) do
|
107
|
+
stub_request(:put, /browserstack/)
|
108
|
+
.with(
|
109
|
+
body: /passed/,
|
110
|
+
headers: {
|
111
|
+
"Accept" => "*/*",
|
112
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
113
|
+
"Authorization" => /Basic/,
|
114
|
+
"Content-Type" => "application/json",
|
115
|
+
"Host" => "www.browserstack.com",
|
116
|
+
"User-Agent" => "Ruby"
|
117
|
+
}
|
118
|
+
)
|
119
|
+
.to_return(status: 500, body: "", headers: {})
|
120
|
+
end
|
121
|
+
|
122
|
+
it "raises an error" do
|
123
|
+
expect { subject.passed("6a22fe36d84d90ef18858f90f2c9cd2882eb082f") }.to raise_error(StandardError)
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|