sauce_whisk 0.0.13 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Gemfile +3 -2
- data/README.md +40 -5
- data/changelog.markdown +10 -0
- data/lib/sauce_whisk.rb +21 -2
- data/lib/sauce_whisk/assets.rb +25 -2
- data/lib/sauce_whisk/jobs.rb +35 -6
- data/lib/sauce_whisk/rest_request_builder.rb +19 -4
- data/lib/sauce_whisk/version.rb +1 -1
- data/sauce_whisk.gemspec +4 -4
- data/spec/fixtures/vcr_cassettes/assets.yml +205 -57
- data/spec/fixtures/vcr_cassettes/info.yml +131 -5
- data/spec/fixtures/vcr_cassettes/jobs.yml +130 -10
- data/spec/lib/sauce_whisk/account_spec.rb +8 -8
- data/spec/lib/sauce_whisk/accounts_spec.rb +8 -8
- data/spec/lib/sauce_whisk/asset_spec.rb +5 -5
- data/spec/lib/sauce_whisk/assets_spec.rb +18 -3
- data/spec/lib/sauce_whisk/info_spec.rb +5 -5
- data/spec/lib/sauce_whisk/job_spec.rb +32 -18
- data/spec/lib/sauce_whisk/jobs_spec.rb +46 -10
- data/spec/lib/sauce_whisk/rest_request_builder_spec.rb +41 -18
- data/spec/lib/sauce_whisk/sauce_whisk_spec.rb +25 -6
- data/spec/lib/sauce_whisk/subaccounts_spec.rb +2 -2
- data/spec/lib/sauce_whisk/tunnel_spec.rb +6 -6
- data/spec/lib/sauce_whisk/tunnels_spec.rb +9 -9
- metadata +10 -10
@@ -20,9 +20,9 @@ describe SauceWhisk::Assets do
|
|
20
20
|
|
21
21
|
it "initializes the asset properly" do
|
22
22
|
asset = SauceWhisk::Assets.fetch job_id, asset_name
|
23
|
-
asset.name.
|
24
|
-
asset.job.
|
25
|
-
asset.asset_type.
|
23
|
+
expect( asset.name ).to eq asset_name
|
24
|
+
expect( asset.job ).to eq job_id
|
25
|
+
expect( asset.asset_type ).to eq :screenshot
|
26
26
|
end
|
27
27
|
|
28
28
|
context "for an invalid asset" do
|
@@ -43,4 +43,19 @@ describe SauceWhisk::Assets do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
describe "#delete", :vcr => {:cassette_name => "assets"} do
|
48
|
+
let(:asset_job_id) {"f7bcec8f706f4910ba128f48e0b8c6c7"}
|
49
|
+
it "can delete a job" do
|
50
|
+
SauceWhisk::Assets.delete(asset_job_id).should be_an_instance_of SauceWhisk::Asset
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#already_deleted_asset", :vcr => {:cassette_name => "assets"} do
|
55
|
+
let(:asset_job_id) {"651c7d737b7547e994678d981dcc433c"}
|
56
|
+
it "returns nil for already deleted assets" do
|
57
|
+
SauceWhisk::Assets.delete(asset_job_id).should be_an_instance_of SauceWhisk::Asset
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
46
61
|
end
|
@@ -8,12 +8,12 @@ describe "SauceWhisk::Sauce", :vcr => {:cassette_name => "info"} do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it "returns a hash" do
|
11
|
-
SauceWhisk::Sauce.service_status.
|
11
|
+
expect( SauceWhisk::Sauce.service_status ).to be_a_kind_of Hash
|
12
12
|
end
|
13
13
|
|
14
14
|
it "symbolizes the keys" do
|
15
15
|
SauceWhisk::Sauce.service_status.each do |k,v|
|
16
|
-
k.
|
16
|
+
expect( k ).to be_an_instance_of Symbol
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -25,7 +25,7 @@ describe "SauceWhisk::Sauce", :vcr => {:cassette_name => "info"} do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "returns an integer" do
|
28
|
-
SauceWhisk::Sauce.total_job_count.
|
28
|
+
expect( SauceWhisk::Sauce.total_job_count ).to be_a_kind_of Integer
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -44,7 +44,7 @@ describe "SauceWhisk::Sauce", :vcr => {:cassette_name => "info"} do
|
|
44
44
|
|
45
45
|
it "returns an array" do
|
46
46
|
platforms = SauceWhisk::Sauce.platforms
|
47
|
-
platforms.
|
47
|
+
expect( platforms ).to be_a_kind_of Array
|
48
48
|
end
|
49
49
|
|
50
50
|
context "when called with true" do
|
@@ -60,7 +60,7 @@ describe "SauceWhisk::Sauce", :vcr => {:cassette_name => "info"} do
|
|
60
60
|
|
61
61
|
describe "operational?" do
|
62
62
|
it "returns true when the service is running" do
|
63
|
-
SauceWhisk::Sauce.operational
|
63
|
+
expect( SauceWhisk::Sauce.operational? ).to be true
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
@@ -37,19 +37,19 @@ describe SauceWhisk::Job do
|
|
37
37
|
|
38
38
|
it "tracks changes to methods" do
|
39
39
|
subject.name = "ANewName"
|
40
|
-
subject.updated_fields.
|
40
|
+
expect( subject.updated_fields ).to include :name
|
41
41
|
|
42
42
|
subject.visibility = true
|
43
|
-
subject.updated_fields.
|
43
|
+
expect( subject.updated_fields ).to include :visibility
|
44
44
|
end
|
45
45
|
|
46
46
|
it "does not track unchanged methods" do
|
47
|
-
subject.updated_fields.
|
47
|
+
expect( subject.updated_fields ).to_not include :build
|
48
48
|
end
|
49
49
|
|
50
50
|
it "has empty updated_fields for new instances" do
|
51
51
|
new_job = SauceWhisk::Job.new(params)
|
52
|
-
new_job.updated_fields.
|
52
|
+
expect( new_job.updated_fields ).to eq []
|
53
53
|
end
|
54
54
|
|
55
55
|
describe "#save" do
|
@@ -61,7 +61,7 @@ describe SauceWhisk::Job do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "calls the save method of the SauceWhisk::Jobs object" do
|
64
|
-
SauceWhisk::Jobs.
|
64
|
+
expect( SauceWhisk::Jobs ).to receive(:save).with(subject)
|
65
65
|
subject.save
|
66
66
|
end
|
67
67
|
end
|
@@ -93,30 +93,44 @@ describe SauceWhisk::Job do
|
|
93
93
|
subject.send("#{param}=", "TOTALLYDIFFERENT")
|
94
94
|
}.to raise_exception
|
95
95
|
|
96
|
-
subject.send(param).
|
96
|
+
expect( subject.send(param) ).not_to eq "TOTALLYDIFFERENT"
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
context "fetched from the API" do
|
103
|
-
|
102
|
+
context "fetched from the API", :vcr => {:cassette_name => "assets"} do
|
103
|
+
context "with all asset details" do
|
104
|
+
subject {SauceWhisk::Jobs.fetch "bd9c43dd6b5549f1b942d1d581d98cac"}
|
104
105
|
|
105
|
-
|
106
|
-
|
107
|
-
subject.screenshots.length.should be 4
|
106
|
+
it "will set has_all_asset_names true" do
|
107
|
+
expect( subject.has_all_asset_names? ).to be true
|
108
108
|
end
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
|
110
|
+
describe "#screenshots" do
|
111
|
+
it "contains all the screenshots for that job" do
|
112
|
+
expect( subject.screenshots.length ).to be 4
|
113
|
+
end
|
114
|
+
|
115
|
+
it "contains actual screenshots" do
|
116
|
+
expect( subject.screenshots.first ).to be_a_kind_of SauceWhisk::Asset
|
117
|
+
expect( subject.screenshots.first.asset_type ).to eq :screenshot
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#video", :vcr => {:cassette_name => "assets"} do
|
122
|
+
it "should be a video asset" do
|
123
|
+
expect( subject.video ).to be_a_kind_of SauceWhisk::Asset
|
124
|
+
expect( subject.video.asset_type ).to eq :video
|
125
|
+
end
|
113
126
|
end
|
114
127
|
end
|
115
128
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
129
|
+
context "without asset details" do
|
130
|
+
subject {SauceWhisk::Jobs.fetch "1ca64b180cfa40e0a4aee5a4a482f271" }
|
131
|
+
|
132
|
+
it "will set has_all_asset_names false" do
|
133
|
+
expect( subject.has_all_asset_names? ).to be false
|
120
134
|
end
|
121
135
|
end
|
122
136
|
end
|
@@ -6,12 +6,12 @@ describe SauceWhisk::Jobs do
|
|
6
6
|
describe "#all", :vcr => {:cassette_name => 'jobs'} do
|
7
7
|
|
8
8
|
it "should return an enumerable" do
|
9
|
-
SauceWhisk::Jobs.all.
|
9
|
+
expect( SauceWhisk::Jobs.all ).to be_an Enumerable
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should return a set of jobs" do
|
13
13
|
jobs_found = SauceWhisk::Jobs.all
|
14
|
-
jobs_found.each {|job| job.
|
14
|
+
jobs_found.each {|job| expect( job ).to be_a SauceWhisk::Job}
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -31,7 +31,7 @@ describe SauceWhisk::Jobs do
|
|
31
31
|
describe "##pass_job" do
|
32
32
|
it "Calls the API and passes the given job" do
|
33
33
|
job_id = "rerfreferf"
|
34
|
-
SauceWhisk::Jobs.
|
34
|
+
expect( SauceWhisk::Jobs ).to receive(:change_status).with(job_id, true) {}
|
35
35
|
|
36
36
|
SauceWhisk::Jobs.pass_job job_id
|
37
37
|
end
|
@@ -40,7 +40,7 @@ describe SauceWhisk::Jobs do
|
|
40
40
|
describe "##fail_job" do
|
41
41
|
it "Calls change_status to fail the job" do
|
42
42
|
job_id = "rcercer"
|
43
|
-
SauceWhisk::Jobs.
|
43
|
+
expect( SauceWhisk::Jobs ).to receive(:change_status).with(job_id, false) {}
|
44
44
|
|
45
45
|
SauceWhisk::Jobs.fail_job job_id
|
46
46
|
end
|
@@ -65,15 +65,51 @@ describe SauceWhisk::Jobs do
|
|
65
65
|
end
|
66
66
|
|
67
67
|
describe "##fetch", :vcr => {:cassette_name => "jobs"} do
|
68
|
-
|
68
|
+
context "for a completed job" do
|
69
|
+
let(:job) {SauceWhisk::Jobs.fetch("bd9c43dd6b5549f1b942d1d581d98cac")}
|
69
70
|
|
70
|
-
|
71
|
-
|
72
|
-
|
71
|
+
it "contains the list of screenshots for the job" do
|
72
|
+
expect( job.screenshot_urls ).to be_a_kind_of Enumerable
|
73
|
+
expect( job.screenshot_urls.length ).to_not be 0
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns a job when a valid one is fetched" do
|
77
|
+
expect( job ).to be_an_instance_of SauceWhisk::Job
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "for an incomplete job" do
|
82
|
+
let(:job) {SauceWhisk::Jobs.fetch("1ca64b180cfa40e0a4aee5a4a482f271")}
|
83
|
+
|
84
|
+
it "returns a job even when asset fetching fails" do
|
85
|
+
expect( job ).to be_an_instance_of SauceWhisk::Job
|
86
|
+
expect( job.screenshots ).to be_nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "##fetch!", :vcr => {:cassette_name => "jobs"} do
|
92
|
+
context "for a completed job" do
|
93
|
+
let(:job) {SauceWhisk::Jobs.fetch! "bd9c43dd6b5549f1b942d1d581d98cac"}
|
94
|
+
|
95
|
+
it "contains the list of screenshots for the job" do
|
96
|
+
expect( job.screenshot_urls ).to be_a_kind_of Enumerable
|
97
|
+
expect( job.screenshot_urls.length ).to_not be 0
|
98
|
+
end
|
99
|
+
|
100
|
+
it "returns a job when a valid one is fetched" do
|
101
|
+
expect( job ).to be_an_instance_of SauceWhisk::Job
|
102
|
+
end
|
73
103
|
end
|
74
104
|
|
75
|
-
|
76
|
-
job.
|
105
|
+
context "for an incomplete job" do
|
106
|
+
let(:job) {SauceWhisk::Jobs.fetch! "1ca64b180cfa40e0a4aee5a4a482f271" }
|
107
|
+
|
108
|
+
it "raises an exception" do
|
109
|
+
expect{
|
110
|
+
job
|
111
|
+
}.to raise_exception SauceWhisk::JobNotComplete
|
112
|
+
end
|
77
113
|
end
|
78
114
|
end
|
79
115
|
|
@@ -26,23 +26,46 @@ describe SauceWhisk::RestRequestBuilder do
|
|
26
26
|
describe "#fully_qualified_resource" do
|
27
27
|
context "with a resource defined" do
|
28
28
|
it "should end with the resource" do
|
29
|
-
dummy_client.fully_qualified_resource.
|
29
|
+
expect( dummy_client.fully_qualified_resource ).to eq "#{SauceWhisk.base_url}/#{dummy_client.resource}"
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
context "without a resource defined" do
|
34
34
|
it "should return the base url" do
|
35
|
-
dummy_client_without_resource.fully_qualified_resource.
|
35
|
+
expect( dummy_client_without_resource.fully_qualified_resource ).to eq SauceWhisk.base_url
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe "#auth_details" do
|
41
41
|
it "should return the env vars" do
|
42
|
-
dummy_client.auth_details.
|
42
|
+
expect( dummy_client.auth_details ).to eq mock_auth
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
describe "#make_request" do
|
47
|
+
before :all do
|
48
|
+
VCR.insert_cassette 'rest_request_retry', :record => :new_episodes
|
49
|
+
end
|
50
|
+
|
51
|
+
after :all do
|
52
|
+
VCR.eject_cassette
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should retry 404'd methods n times" do
|
56
|
+
expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}"
|
57
|
+
expected_params = {:method => :get, :url => expected_url}.merge mock_auth
|
58
|
+
times = 0
|
59
|
+
expect( RestClient::Request ).to receive(:execute) do |arg|
|
60
|
+
expect(arg).to eq expected_params
|
61
|
+
raise RestClient::ResourceNotFound.new if(times >= SauceWhisk.rest_retries)
|
62
|
+
times += 1
|
63
|
+
end
|
64
|
+
dummy_client.get
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
46
69
|
describe "#get" do
|
47
70
|
before :all do
|
48
71
|
VCR.insert_cassette 'rest_request', :record => :new_episodes
|
@@ -54,7 +77,7 @@ describe SauceWhisk::RestRequestBuilder do
|
|
54
77
|
it "should call the base URL with the resource name" do
|
55
78
|
expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}"
|
56
79
|
expected_params = {:method => :get, :url => expected_url}.merge mock_auth
|
57
|
-
RestClient::Request.
|
80
|
+
expect( RestClient::Request ).to receive(:execute).with(expected_params)
|
58
81
|
dummy_client.get
|
59
82
|
end
|
60
83
|
end
|
@@ -64,7 +87,7 @@ describe SauceWhisk::RestRequestBuilder do
|
|
64
87
|
|
65
88
|
it "calls the base URL with the delete method" do
|
66
89
|
expected_params = {:method => :delete, :url => expected_url}.merge mock_auth
|
67
|
-
RestClient::Request.
|
90
|
+
expect( RestClient::Request ).to receive(:execute).with(expected_params)
|
68
91
|
dummy_client.delete "identifier"
|
69
92
|
end
|
70
93
|
end
|
@@ -74,40 +97,40 @@ begin
|
|
74
97
|
let(:expected_payload) {{:tunnel_identifier => "KarlMarx"}}
|
75
98
|
it "calls the base URL" do
|
76
99
|
expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}"
|
77
|
-
RestClient::Request.
|
100
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:url => expected_url}))
|
78
101
|
|
79
102
|
dummy_client.post(:payload => expected_payload)
|
80
103
|
end
|
81
104
|
|
82
105
|
it "uses the correct method" do
|
83
|
-
RestClient::Request.
|
106
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:method => :post}))
|
84
107
|
dummy_client.post(:payload => expected_payload)
|
85
108
|
end
|
86
109
|
|
87
110
|
it "includes the correct payload, in JSON" do
|
88
|
-
RestClient::Request.
|
111
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:payload => expected_payload.to_json}))
|
89
112
|
dummy_client.post(:payload => expected_payload)
|
90
113
|
end
|
91
114
|
|
92
115
|
it "includes the correct content_type" do
|
93
|
-
RestClient::Request.
|
116
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:content_type => "application/json"}))
|
94
117
|
dummy_client.post(:payload => expected_payload)
|
95
118
|
end
|
96
119
|
|
97
120
|
it "includes the correct length" do
|
98
121
|
expected_length = expected_payload.to_json.length
|
99
|
-
RestClient::Request.
|
122
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:headers => {"Content-Length" => expected_length}}))
|
100
123
|
dummy_client.post(:payload => expected_payload)
|
101
124
|
end
|
102
125
|
|
103
126
|
it "includes the authentication parameters" do
|
104
|
-
RestClient::Request.
|
127
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including(mock_auth))
|
105
128
|
dummy_client.post(:payload => expected_payload)
|
106
129
|
end
|
107
130
|
|
108
131
|
it "allows for base resource additions" do
|
109
132
|
expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}/dummy_res"
|
110
|
-
RestClient::Request.
|
133
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:payload => expected_payload.to_json, :url => expected_url}))
|
111
134
|
|
112
135
|
dummy_client.post(:payload => expected_payload, :resource =>"dummy_res")
|
113
136
|
end
|
@@ -117,32 +140,32 @@ end
|
|
117
140
|
describe "#put", :vcr => {:cassette_name => 'jobs'} do
|
118
141
|
let(:expected_url) {"#{SauceWhisk.base_url}/#{dummy_client.resource}/something"}
|
119
142
|
it "calls the base URL with the put method" do
|
120
|
-
RestClient::Request.
|
143
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:url => expected_url}))
|
121
144
|
dummy_client.put "something", "another_thing"
|
122
145
|
end
|
123
146
|
|
124
147
|
it "includes the right content_type" do
|
125
|
-
RestClient::Request.
|
148
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:content_type => "application/json"}))
|
126
149
|
dummy_client.put "something", "another_thing"
|
127
150
|
end
|
128
151
|
|
129
152
|
it "includes the right method" do
|
130
|
-
RestClient::Request.
|
153
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:method => :put}))
|
131
154
|
dummy_client.put "something", "another_thing"
|
132
155
|
end
|
133
156
|
|
134
157
|
it "includes the content length" do
|
135
|
-
RestClient::Request.
|
158
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including(:headers => {"Content-Length" => 13}))
|
136
159
|
dummy_client.put "something", "another_thing"
|
137
160
|
end
|
138
161
|
|
139
162
|
it "includes authentication details" do
|
140
|
-
RestClient::Request.
|
163
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including(mock_auth))
|
141
164
|
dummy_client.put "something", "another_thing"
|
142
165
|
end
|
143
166
|
|
144
167
|
it "sends the payload" do
|
145
|
-
RestClient::Request.
|
168
|
+
expect( RestClient::Request ).to receive(:execute).with(hash_including({:payload => "another_thing"}))
|
146
169
|
dummy_client.put "something", "another_thing"
|
147
170
|
end
|
148
171
|
end
|
@@ -20,7 +20,7 @@ describe SauceWhisk do
|
|
20
20
|
describe "##pass_job" do
|
21
21
|
it "should call #pass on the jobs object" do
|
22
22
|
job_id = "0418999"
|
23
|
-
SauceWhisk::Jobs.
|
23
|
+
expect( SauceWhisk::Jobs ).to receive(:pass_job).with(job_id) {true}
|
24
24
|
SauceWhisk.pass_job job_id
|
25
25
|
end
|
26
26
|
end
|
@@ -32,16 +32,16 @@ describe SauceWhisk do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
SauceWhisk.logger = dummy_logger
|
35
|
-
SauceWhisk.logger.
|
35
|
+
expect( SauceWhisk.logger ).to be dummy_logger
|
36
36
|
end
|
37
37
|
|
38
|
-
it "defaults to
|
38
|
+
it "defaults to STDOUT" do
|
39
39
|
SauceWhisk.logger = nil
|
40
|
-
SauceWhisk.logger.
|
40
|
+
expect( SauceWhisk.logger ).to be_a_kind_of Logger
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
describe "##
|
44
|
+
describe "##asset_fetch_retries" do
|
45
45
|
it "tries to read from Sauce.config" do
|
46
46
|
SauceWhisk.instance_variable_set(:@asset_fetch_retries, nil)
|
47
47
|
mock_config = Class.new(Hash) do
|
@@ -51,7 +51,26 @@ describe SauceWhisk do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
stub_const "::Sauce::Config", mock_config
|
54
|
-
SauceWhisk.asset_fetch_retries.
|
54
|
+
expect( SauceWhisk.asset_fetch_retries ).to equal 3
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "##rest_retries" do
|
59
|
+
it "defaults to 1" do
|
60
|
+
SauceWhisk.instance_variable_set(:@rest_retries, nil)
|
61
|
+
expect( SauceWhisk.rest_retries ).to equal 1
|
62
|
+
end
|
63
|
+
|
64
|
+
it "tries to read from Sauce.config" do
|
65
|
+
SauceWhisk.instance_variable_set(:@rest_retries, nil)
|
66
|
+
mock_config = Class.new(Hash) do
|
67
|
+
def initialize
|
68
|
+
self.store(:rest_retries, 3)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
stub_const "::Sauce::Config", mock_config
|
73
|
+
expect( SauceWhisk.rest_retries ).to equal 3
|
55
74
|
end
|
56
75
|
end
|
57
76
|
end
|