sauce_whisk 0.0.1

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 (70) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +37 -0
  6. data/Rakefile +10 -0
  7. data/lib/sauce_whisk/assets.rb +25 -0
  8. data/lib/sauce_whisk/jobs.rb +112 -0
  9. data/lib/sauce_whisk/rest_request_builder.rb +29 -0
  10. data/lib/sauce_whisk/version.rb +3 -0
  11. data/lib/sauce_whisk.rb +23 -0
  12. data/sauce_whisk.gemspec +27 -0
  13. data/spec/fixtures/vcr_cassettes/assets.yml +161478 -0
  14. data/spec/fixtures/vcr_cassettes/jobs.yml +256 -0
  15. data/spec/fixtures/vcr_cassettes/no_jobs.yml +0 -0
  16. data/spec/fixtures/vcr_cassettes/rest_request.yml +0 -0
  17. data/spec/lib/sauce_whisk/asset_spec.rb +39 -0
  18. data/spec/lib/sauce_whisk/assets_spec.rb +27 -0
  19. data/spec/lib/sauce_whisk/job_spec.rb +113 -0
  20. data/spec/lib/sauce_whisk/jobs_spec.rb +78 -0
  21. data/spec/lib/sauce_whisk/rest_request_builder_spec.rb +50 -0
  22. data/spec/lib/sauce_whisk/sauce_whisk_spec.rb +27 -0
  23. data/spec/spec_helper.rb +25 -0
  24. data/vendor/psych/lib/psych/class_loader.rb +101 -0
  25. data/vendor/psych/lib/psych/coder.rb +94 -0
  26. data/vendor/psych/lib/psych/core_ext.rb +35 -0
  27. data/vendor/psych/lib/psych/deprecated.rb +85 -0
  28. data/vendor/psych/lib/psych/exception.rb +13 -0
  29. data/vendor/psych/lib/psych/handler.rb +249 -0
  30. data/vendor/psych/lib/psych/handlers/document_stream.rb +22 -0
  31. data/vendor/psych/lib/psych/handlers/recorder.rb +39 -0
  32. data/vendor/psych/lib/psych/json/ruby_events.rb +19 -0
  33. data/vendor/psych/lib/psych/json/stream.rb +16 -0
  34. data/vendor/psych/lib/psych/json/tree_builder.rb +12 -0
  35. data/vendor/psych/lib/psych/json/yaml_events.rb +29 -0
  36. data/vendor/psych/lib/psych/nodes/alias.rb +18 -0
  37. data/vendor/psych/lib/psych/nodes/document.rb +60 -0
  38. data/vendor/psych/lib/psych/nodes/mapping.rb +56 -0
  39. data/vendor/psych/lib/psych/nodes/node.rb +55 -0
  40. data/vendor/psych/lib/psych/nodes/scalar.rb +67 -0
  41. data/vendor/psych/lib/psych/nodes/sequence.rb +81 -0
  42. data/vendor/psych/lib/psych/nodes/stream.rb +37 -0
  43. data/vendor/psych/lib/psych/nodes.rb +77 -0
  44. data/vendor/psych/lib/psych/omap.rb +4 -0
  45. data/vendor/psych/lib/psych/parser.rb +51 -0
  46. data/vendor/psych/lib/psych/scalar_scanner.rb +149 -0
  47. data/vendor/psych/lib/psych/set.rb +4 -0
  48. data/vendor/psych/lib/psych/stream.rb +37 -0
  49. data/vendor/psych/lib/psych/streaming.rb +27 -0
  50. data/vendor/psych/lib/psych/syntax_error.rb +21 -0
  51. data/vendor/psych/lib/psych/tree_builder.rb +96 -0
  52. data/vendor/psych/lib/psych/visitors/depth_first.rb +26 -0
  53. data/vendor/psych/lib/psych/visitors/emitter.rb +51 -0
  54. data/vendor/psych/lib/psych/visitors/json_tree.rb +24 -0
  55. data/vendor/psych/lib/psych/visitors/to_ruby.rb +372 -0
  56. data/vendor/psych/lib/psych/visitors/visitor.rb +19 -0
  57. data/vendor/psych/lib/psych/visitors/yaml_tree.rb +496 -0
  58. data/vendor/psych/lib/psych/visitors.rb +6 -0
  59. data/vendor/psych/lib/psych/y.rb +9 -0
  60. data/vendor/psych/lib/psych.bundle +0 -0
  61. data/vendor/psych/lib/psych.rb +497 -0
  62. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/Makefile +221 -0
  63. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/mkmf.log +50 -0
  64. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych.bundle +0 -0
  65. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych.o +0 -0
  66. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych_emitter.o +0 -0
  67. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych_parser.o +0 -0
  68. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych_to_ruby.o +0 -0
  69. data/vendor/psych/tmp/x86_64-darwin12.3.0/psych/1.9.3/psych_yaml_tree.o +0 -0
  70. metadata +194 -0
@@ -0,0 +1,256 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - ! '*/*; q=0.5, application/xml'
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: !binary |-
20
+ T0s=
21
+ headers:
22
+ !binary "U2VydmVy":
23
+ - !binary |-
24
+ bmdpbngvMC43LjYy
25
+ !binary "RGF0ZQ==":
26
+ - !binary |-
27
+ RnJpLCAyNCBNYXkgMjAxMyAwNjowNjozOSBHTVQ=
28
+ !binary "Q29udGVudC1UeXBl":
29
+ - !binary |-
30
+ YXBwbGljYXRpb24vanNvbg==
31
+ !binary "VHJhbnNmZXItRW5jb2Rpbmc=":
32
+ - !binary |-
33
+ Y2h1bmtlZA==
34
+ !binary "Q29ubmVjdGlvbg==":
35
+ - !binary |-
36
+ a2VlcC1hbGl2ZQ==
37
+ !binary "UHJhZ21h":
38
+ - !binary |-
39
+ bm8tY2FjaGU=
40
+ !binary "Q2FjaGUtQ29udHJvbA==":
41
+ - !binary |-
42
+ bm8tY2FjaGU=
43
+ !binary "WC1GcmFtZS1PcHRpb25z":
44
+ - !binary |-
45
+ REVOWQ==
46
+ !binary "U2V0LUNvb2tpZQ==":
47
+ - !binary |-
48
+ Y3NyZl90b2tlbj01M2I2Nzc4MDk4NjdkZmMyZGRkNjU4MjI4YzYzYTc2Njsg
49
+ ZXhwaXJlcz0iRnJpLCAyNC1NYXktMjAxMyAwNjoyMzoxOSBHTVQiOyBNYXgt
50
+ QWdlPTYwMDsgUGF0aD0v
51
+ - !binary |-
52
+ bWV0cmljcz0zMTNlYzg5ZmFlMzhmNDQwOGI3MzY1ODEzZjI1MGMyMzk2YWIw
53
+ Nzk2ZGZmZjI3ODhkODY3NDcyYmJjM2Q4YmIzOTRiMDRjYzg7IFBhdGg9Lw==
54
+ !binary "Q29udGVudC1FbmNvZGluZw==":
55
+ - !binary |-
56
+ Z3ppcA==
57
+ body:
58
+ encoding: ASCII-8BIT
59
+ string: !binary |-
60
+ H4sIAAAAAAAAA12XS4quuQ2Gt9KccQa2JVlybyVkYPkCWUPTe8/zBRrKB6oG
61
+ Ren3b0vvTf/+69d/968///jl1fuKMAl1lZkpqdGH1lW0m8uvv//1xz+1W8tY
62
+ eUpfq2s5LWyM7WOKj5jn+s9aWWp9ZNM2UseNKKKn1NZ3P1HW+VmrM8q+eteJ
63
+ o5k1SqnZQiP3bmvFc24t1iyOWXcO7KNRdHyMI5LD7amVUWfZeywzrWPOsjKa
64
+ Z4Tm6NGe2pNl04B751HpZfbbbndxyzG17Z+13Y7bmnLWvDSqzrGOqBcbq3Sr
65
+ v92XVy9bZ62rOSVPbV7bWLMt/vXcwV1vFbU1ommMHeOcWjff5eWWeGZRu4i3
66
+ unQ1Uc07eaZPzrZ+yo75s/auKwyuZfhWU+a2d6xadvZpZz9zy9p9lbPThHM3
67
+ XRGGY5FtSStynzs0EeajoIG3pY1cUspg8CKy6zPjJoVJuXa6qYu56Lo31xlX
68
+ ed+LHb22mwEsEKgmN8FFjWVFvPJS/Vlr5/QELNLb0RVM7/LMuDW6WPrTX629
69
+ AJx7zT+QZ2aMWezoXL1bPHO7t4LdqLqvaBWPHpuvth4Rd5Tf+lBvl36ATAcP
70
+ I/OCeP5YMTtDevoL9IYwrW3zm9200tZpwnUAaX/vAGCqGb+76A4d4svBxz2V
71
+ Vu+nv6eWqHvS1KZ66FM9kVbiSOnt+oPfZhPG+7IWHzdn1vJRXYDYFYj41Lpz
72
+ BRE4n3r4ZPYN1JeW4GeUB+u7A8IlWajpvYYA4RbHp1+p4+nDufu0Qn8Kc+sL
73
+ BB9BVPjsqL5aPrqzF03t6uu4rsp3lO9kkAOPzqslXzOrQJ+9TIs3+n09tF8U
74
+ 6mx5OFQcUNJK49pawTp6Nks5vYSXeZ7aMap02yOSO0Q1Kq40aSmzHrEHZ737
75
+ uZE3y6w6fE+dzMt1mKyx19OzvdJvTeEzRU+v6Nkss3Hztvyc51z0dn0dTSCg
76
+ E0WAQ92zrmUDkD596CioQZld29VoOWDahh7rHhAsT3+buLftDAw8mJ+ZpZrk
77
+ ltn5ez1Y37vQ3k+nD01Gc+Ey3UPRc8+Sr06iQxfBt0xFS+aQo35b+yiyd74z
78
+ zotC11G8FC0QyKAOioqW9Hp3f3iBgPdAK0v7QJExt7t/nnFbqboefdgCd7Ks
79
+ Wys89zRlDg2t1215nrfNPNif72HjgJ2biqXonHkXcMiHm3Mzt5QtW0PtTABk
80
+ ibQJvpjQ9WetR3qdExHGD6UaHVvnttPnlHn2g4dRa28T1IahPdnA+ujZ6TfU
81
+ tJebak16GFhHTuOTHNpdZ5MhUXnKc4fWC3aVjBM8AHgkIKIzNb1UP9xsF6Jf
82
+ ZCdOUURkeh/Byb77FblPf5lCZVJ9wyNdMKj5XKj3wJo+1Xx0koEmxiNjdo37
83
+ yXa//slOB4DzwY5cx011+ewo3mljb0ctyz28dNjTM7hAhIEEOrDCOePG8Ggr
84
+ ikbJ+njh+cilW5FwEBRY7Kr4qx25Y9943uZ+9mw438IjGlc3p4kQ3m45KODT
85
+ syq3rc3zg/t+QWKgAYZC5Wd7Ty5pAslAFwI98Cz/mutfG7uD1PFickxU45bE
86
+ 2VW0z08YGlZxDs5SnrfZKI22Eo4CE647fA0LVGWT6H7LZ04Mm4I2w3PFujIu
87
+ ys1XwKDvJj9r0wH3QBdqRXf0MK8L9qKhREjLmxENpb+IgvE2gtFUCcJG7+va
88
+ J+5PrWJkwIGkJ/CNW7bvdUKMK0lGe7ATCaRGIWYArI6QtYsa33RE2+31Y7TJ
89
+ EZoBEkkm1A78rTH1W9ccj05arIM0SZvGlEDEp2ZLwg/iEG+ePAgYpu3tct9r
90
+ McdIJAiND1Ltb7kPKyECW0Nz1AofZST77E5UmaXLe65jD+BwoibcfQAQJS61
91
+ sxC/83Aev4nKdevnwyUX1270UQqhpJJXHi1ZyFPLxCShhpDu59iFODUu/9qP
92
+ twwqGBm6tERlF7zGKtIDTqzwzKe2kLdbMyLep6Yec4EFP8WICdWf/uLwu/Rs
93
+ EB0bBPJoqazGFQiOXd87BNLLPM8l+pEZok+p8A44QPnx4oEwCFStffmMgDjQ
94
+ qrFHAdCB1j19qC6jj0qiO5vsib35pyUZ+Dy3fjUVzWBcK768zrhplmJBjjjg
95
+ Qre8b2ubvQbU5gUDORi2fmZQkAvJ523nHDgBkTf+9gnUVSISzniSlBj69vd0
96
+ pQuIM+4CGKM0TAAT9+FanretypY1tbK1fLtICeA4TykdByVCP+fObyMDt6x3
97
+ qdd1UqGcapg0Oerp7yF6A3/egsFwDhtJKZfgdzo7X310kiRtYHWTapHWDktZ
98
+ QQBx7lvuaq8fz8bJvZD6kQbMwvYkWbFlTDd/sYOz14owqaxvLzTugGsNfLaR
99
+ zfXlUK/kleNkyP2pZMCxUb6M7ZNV6vUhsqAQg9Bx9gusmUyzzjxfyuTujw+t
100
+ ORsFPrf1jxcTHSw+gS8A3uupVZL2twHYuR19zvj/Nn3YaIle5vHWkqTNii+0
101
+ ml03vbNZx8eKAd+eGSs81qrUk7tIzOyjQfCZnbWIFeLNkyXngnMXUec7WAoa
102
+ ho+zcBG7/szYcqXwcoI6tyZr4Mw5QRjOgFo+d/gCKc1Bl9DHvjDD2Jvwbh+s
103
+ mebP2sYpJCN2Q/HPrYMcteGglIEczEdTJ+R1WhE7yVwpA+jkWWzRLK047TNj
104
+ QtfyQG78kzz2PGoneQnzYE5Pfwfe0rHvJL+B8Up/jYiogzQJAZ8+eN02ps+5
105
+ B95y0aYKZPbARyabPTP+z/8AL4vSMjARAAA=
106
+ http_version:
107
+ recorded_at: Fri, 24 May 2013 06:13:22 GMT
108
+ - request:
109
+ method: put
110
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/bd9c43dd6b5549f1b942d1d581d98cac
111
+ body:
112
+ encoding: UTF-8
113
+ string: ! '{"passed":true}'
114
+ headers:
115
+ Accept:
116
+ - ! '*/*; q=0.5, application/xml'
117
+ Accept-Encoding:
118
+ - gzip, deflate
119
+ Content-Length:
120
+ - '15'
121
+ User-Agent:
122
+ - Ruby
123
+ response:
124
+ status:
125
+ code: 200
126
+ message: OK
127
+ headers:
128
+ Server:
129
+ - nginx/0.7.62
130
+ Date:
131
+ - Fri, 24 May 2013 06:06:41 GMT
132
+ Content-Type:
133
+ - application/json
134
+ Connection:
135
+ - keep-alive
136
+ Pragma:
137
+ - no-cache
138
+ Cache-Control:
139
+ - no-cache
140
+ X-Frame-Options:
141
+ - DENY
142
+ Set-Cookie:
143
+ - csrf_token=1fca4050f7e7f15f6136777dca366a74; expires="Fri, 24-May-2013 06:23:21
144
+ GMT"; Max-Age=600; Path=/
145
+ - metrics=afb450bf034cd6510e7200f0070655a0e3d1d6489531f349e57a418491e14accc2f8033e;
146
+ Path=/
147
+ Content-Length:
148
+ - '611'
149
+ body:
150
+ encoding: US-ASCII
151
+ string: ! '{"status": "complete", "commands_not_successful": 2, "name": "Ruby
152
+ Example for Appium", "video_url": "http://saucelabs.com/jobs/bd9c43dd6b5549f1b942d1d581d98cac/video.flv",
153
+ "tags": [], "proxied": false, "start_time": 1362100867, "log_url": "http://saucelabs.com/jobs/bd9c43dd6b5549f1b942d1d581d98cac/selenium-server.log",
154
+ "creation_time": 1362100864, "custom-data": null, "public": null, "browser_version":
155
+ "6.0", "end_time": 1362101005, "passed": true, "error": null, "owner": "<SAUCE_USERNAME>",
156
+ "build": null, "os": "Mac 10.8", "id": "bd9c43dd6b5549f1b942d1d581d98cac",
157
+ "breakpointed": null, "browser": "iphone"}'
158
+ http_version:
159
+ recorded_at: Fri, 24 May 2013 06:13:24 GMT
160
+ - request:
161
+ method: get
162
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/bd9c43dd6b5549f1b942d1d581d98cac
163
+ body:
164
+ encoding: US-ASCII
165
+ string: ''
166
+ headers:
167
+ Accept:
168
+ - ! '*/*; q=0.5, application/xml'
169
+ Accept-Encoding:
170
+ - gzip, deflate
171
+ User-Agent:
172
+ - Ruby
173
+ response:
174
+ status:
175
+ code: 200
176
+ message: OK
177
+ headers:
178
+ Server:
179
+ - nginx/0.7.62
180
+ Date:
181
+ - Fri, 24 May 2013 06:06:42 GMT
182
+ Content-Type:
183
+ - application/json
184
+ Connection:
185
+ - keep-alive
186
+ Pragma:
187
+ - no-cache
188
+ Cache-Control:
189
+ - no-cache
190
+ X-Frame-Options:
191
+ - DENY
192
+ Set-Cookie:
193
+ - csrf_token=b67fdc8286031ffcc397033717951329; expires="Fri, 24-May-2013 06:23:22
194
+ GMT"; Max-Age=600; Path=/
195
+ - metrics=38ed2c05075ab9be1c87ef087c892c819423094cb9022f8253ad47ce976bacab1f00e111;
196
+ Path=/
197
+ Content-Length:
198
+ - '611'
199
+ body:
200
+ encoding: US-ASCII
201
+ string: ! '{"status": "complete", "commands_not_successful": 2, "name": "Ruby
202
+ Example for Appium", "video_url": "http://saucelabs.com/jobs/bd9c43dd6b5549f1b942d1d581d98cac/video.flv",
203
+ "tags": [], "proxied": false, "start_time": 1362100867, "log_url": "http://saucelabs.com/jobs/bd9c43dd6b5549f1b942d1d581d98cac/selenium-server.log",
204
+ "creation_time": 1362100864, "custom-data": null, "public": null, "browser_version":
205
+ "6.0", "end_time": 1362101005, "passed": true, "error": null, "owner": "<SAUCE_USERNAME>",
206
+ "build": null, "os": "Mac 10.8", "id": "bd9c43dd6b5549f1b942d1d581d98cac",
207
+ "breakpointed": null, "browser": "iphone"}'
208
+ http_version:
209
+ recorded_at: Fri, 24 May 2013 06:13:25 GMT
210
+ - request:
211
+ method: get
212
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/bd9c43dd6b5549f1b942d1d581d98cac/assets
213
+ body:
214
+ encoding: US-ASCII
215
+ string: ''
216
+ headers:
217
+ Accept:
218
+ - ! '*/*; q=0.5, application/xml'
219
+ Accept-Encoding:
220
+ - gzip, deflate
221
+ User-Agent:
222
+ - Ruby
223
+ response:
224
+ status:
225
+ code: 200
226
+ message: OK
227
+ headers:
228
+ Server:
229
+ - nginx/0.7.62
230
+ Date:
231
+ - Fri, 24 May 2013 06:06:44 GMT
232
+ Content-Type:
233
+ - application/json
234
+ Connection:
235
+ - keep-alive
236
+ Pragma:
237
+ - no-cache
238
+ Cache-Control:
239
+ - no-cache
240
+ X-Frame-Options:
241
+ - DENY
242
+ Set-Cookie:
243
+ - csrf_token=a8dd55863c6e34728839548800f5be3f; expires="Fri, 24-May-2013 06:23:23
244
+ GMT"; Max-Age=600; Path=/
245
+ - metrics=a8da11c096f8e70948593274782c462cbf1a5460c0f54e86f6bd4d33af778cb31cc1a5d8;
246
+ Path=/
247
+ Content-Length:
248
+ - '191'
249
+ body:
250
+ encoding: US-ASCII
251
+ string: ! '{"sauce-log": "log.json", "video": "video.flv", "selenium-log": "selenium-server.log",
252
+ "screenshots": ["0000screenshot.png", "0001screenshot.png", "0002screenshot.png",
253
+ "0003screenshot.png"]}'
254
+ http_version:
255
+ recorded_at: Fri, 24 May 2013 06:13:26 GMT
256
+ recorded_with: VCR 2.5.0
File without changes
File without changes
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Asset do
4
+
5
+ describe "#initialize" do
6
+ let(:data) {"DEDEDEDEDED"}
7
+ let(:name) {"video01.mpg"}
8
+ let(:job_id) {"c4revevegegerg"}
9
+ let(:type) {:video}
10
+
11
+ before :each do
12
+ params = {:data => data, :name => name, :type => type, :job_id => job_id}
13
+
14
+ @asset = Asset.new params
15
+ end
16
+
17
+ it "should store the name" do
18
+ @asset.name.should eq name
19
+ end
20
+
21
+ it "should store the data" do
22
+ @asset.data.should eq data
23
+ end
24
+
25
+ it "should store the type" do
26
+ @asset.asset_type.should eq type
27
+ end
28
+
29
+ it "should store the job_id" do
30
+ @asset.job.should eq job_id
31
+ end
32
+ end
33
+
34
+ describe "#type" do
35
+ it "should default to screenshot" do
36
+ Asset.new.asset_type.should eq :screenshot
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Assets do
4
+ let(:auth) {"#{ENV["SAUCE_USERNAME"]}:#{ENV["SAUCE_ACCESS_KEY"]}"}
5
+
6
+ describe "#fetch", :vcr => {:cassette_name => "assets"} do
7
+ let(:job_id) {"bd9c43dd6b5549f1b942d1d581d98cac"}
8
+ let(:asset_name) {"0000screenshot.png"}
9
+
10
+ it "fetches an asset for the requested job" do
11
+ Assets.fetch job_id, asset_name
12
+
13
+ assert_requested :get, "https://#{auth}@saucelabs.com/rest/v1/dylanatsauce/jobs/#{job_id}/assets/#{asset_name}"
14
+ end
15
+
16
+ it "returns an asset" do
17
+ Assets.fetch(job_id, asset_name).should be_an_instance_of Asset
18
+ end
19
+
20
+ it "initializes the asset properly" do
21
+ asset = Assets.fetch job_id, asset_name
22
+ asset.name.should eq asset_name
23
+ asset.job.should eq job_id
24
+ asset.asset_type.should eq :screenshot
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,113 @@
1
+ require "spec_helper"
2
+
3
+ describe Job do
4
+ let(:job) {Job.new}
5
+ subject {Job.new}
6
+
7
+ it {should respond_to :id}
8
+
9
+ context "Initialized" do
10
+ let(:params) {{
11
+ "id" => "dsfargeg",
12
+ "owner" => "Dave",
13
+ "status" => "Things",
14
+ "error" => nil,
15
+ "name" => "Test All The RESTS",
16
+ "browser" => "firefox",
17
+ "browser_version" => "18",
18
+ "os" => "Windows 2008",
19
+ "creation_time" => Time.now.to_i,
20
+ "start_time" => Time.now + 4,
21
+ "end_time" => Time.now + 118,
22
+ "video_url" => "http://www.notarealplace.com/somewhere/resource",
23
+ "log_url" => "http://www.underthesea.com/notreally/404",
24
+ "public" => false,
25
+ "tags" => ["ruby", "awesome", "restful"],
26
+ "custom_data" => ""
27
+ }}
28
+
29
+ subject {Job.new(params)}
30
+
31
+ it "sets parameters at init" do
32
+ params.each do |k,v|
33
+ subject.send(k).should eq v
34
+ end
35
+ end
36
+
37
+ it "tracks changes to methods" do
38
+ subject.name = "ANewName"
39
+ subject.updated_fields.should include :name
40
+
41
+ subject.visibility = true
42
+ subject.updated_fields.should include :visibility
43
+ end
44
+
45
+ it "does not track unchanged methods" do
46
+ subject.updated_fields.should_not include :build
47
+ end
48
+
49
+ it "has empty updated_fields for new instances" do
50
+ new_job = Job.new(params)
51
+ new_job.updated_fields.should eq []
52
+ end
53
+
54
+ describe "#save" do
55
+ subject {Job.new(params)}
56
+
57
+ context "with changed values" do
58
+ before(:each) do
59
+ subject.name = "New_Name"
60
+ end
61
+
62
+ it "calls the save method of the Jobs object" do
63
+ Jobs.should_receive(:save).with(subject)
64
+ subject.save
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "parameters" do
70
+ it "lets you set only the parameters which are mutable" do
71
+ [:name, :build, :passed, :tags, :custom_data, :visibility].each do |param|
72
+ changed_value = "Changed#{param}"
73
+ subject.send("#{param}=", changed_value)
74
+ subject.send(param).should eq changed_value
75
+ end
76
+ end
77
+
78
+ it "throws an exception if you try to set one of the fixed attributes" do
79
+ [:id, :owner, :browser, :browser_version, :os, :error, :creation_time,
80
+ :start_time, :end_time, :video_url, :log_url
81
+ ].each do |param|
82
+ expect {
83
+ subject.send("#{param}=", "TOTALLYDIFFERENT")
84
+ }.to raise_exception
85
+
86
+ subject.send(param).should_not eq "TOTALLYDIFFERENT"
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ context "fetched from the API" do
93
+ subject {Jobs.fetch "bd9c43dd6b5549f1b942d1d581d98cac"}
94
+
95
+ describe "#screenshots", :vcr => {:cassette_name => "assets"} do
96
+ it "contains all the screenshots for that job" do
97
+ subject.screenshots.length.should be 4
98
+ end
99
+
100
+ it "contains actual screenshots" do
101
+ subject.screenshots.first.should be_a_kind_of Asset
102
+ subject.screenshots.first.asset_type.should eq :screenshot
103
+ end
104
+ end
105
+
106
+ describe "#video", :vcr => {:cassette_name => "assets"} do
107
+ it "should be a video asset" do
108
+ subject.video.should be_a_kind_of Asset
109
+ subject.video.asset_type.should eq :video
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,78 @@
1
+ require "spec_helper"
2
+
3
+ describe Jobs do
4
+ let(:auth) {"#{ENV["SAUCE_USERNAME"]}:#{ENV["SAUCE_ACCESS_KEY"]}"}
5
+ describe "#all", :vcr => {:cassette_name => 'jobs'} do
6
+
7
+ it "should return an enumerable" do
8
+ Jobs.all.should be_an Enumerable
9
+ end
10
+
11
+ it "should return a set of jobs" do
12
+ jobs_found = Jobs.all
13
+ jobs_found.each {|job| job.should be_a Job}
14
+ end
15
+ end
16
+
17
+ describe "##change_status", :vcr => {:cassette_name => "jobs"} do
18
+ let(:pass_string) {{:passed => true}.to_json}
19
+ it "exists" do
20
+ Jobs.respond_to? :change_status
21
+ end
22
+
23
+ it "passes a test status to the REST api" do
24
+ job_id = "bd9c43dd6b5549f1b942d1d581d98cac"
25
+ Jobs.change_status job_id, true
26
+ assert_requested :put, "https://#{auth}@saucelabs.com/rest/v1/dylanatsauce/jobs/#{job_id}", :body => pass_string, :content_type => "application/json"
27
+ end
28
+ end
29
+
30
+ describe "##pass_job" do
31
+ it "Calls the API and passes the given job" do
32
+ job_id = "rerfreferf"
33
+ Jobs.should_receive(:change_status).with(job_id, true) {}
34
+
35
+ Jobs.pass_job job_id
36
+ end
37
+ end
38
+
39
+ describe "##fail_job" do
40
+ it "Calls change_status to fail the job" do
41
+ job_id = "rcercer"
42
+ Jobs.should_receive(:change_status).with(job_id, false) {}
43
+
44
+ Jobs.fail_job job_id
45
+ end
46
+ end
47
+
48
+ describe "##save", :vcr => {:cassette_name => "jobs"} do
49
+ it "sends a put request" do
50
+ job_id = "bd9c43dd6b5549f1b942d1d581d98cac"
51
+ job = Job.new({:id => job_id})
52
+ Jobs.save (job)
53
+ assert_requested :put, "https://#{auth}@saucelabs.com/rest/v1/dylanatsauce/jobs/#{job.id}", :body => anything, :content_type => "application/json"
54
+ end
55
+
56
+ it "only sends updated information" do
57
+ job_id = "bd9c43dd6b5549f1b942d1d581d98cac"
58
+ job = Job.new({:id => job_id})
59
+ job.name = "Updated Name"
60
+ Jobs.save (job)
61
+ expected_body = {:name => "Updated Name"}.to_json
62
+ assert_requested :put, "https://#{auth}@saucelabs.com/rest/v1/dylanatsauce/jobs/#{job.id}", :body => expected_body, :content_type => "application/json"
63
+ end
64
+ end
65
+
66
+ describe "##fetch", :vcr => {:cassette_name => "jobs"} do
67
+ let(:job) {Jobs.fetch("bd9c43dd6b5549f1b942d1d581d98cac")}
68
+
69
+ it "contains the list of screenshots for the job" do
70
+ job.screenshot_urls.should be_a_kind_of Enumerable
71
+ job.screenshot_urls.length.should_not be 0
72
+ end
73
+
74
+ it "returns a job when a valid one is fetched" do
75
+ job.should be_an_instance_of Job
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+ require "rest_client"
3
+
4
+ describe RestRequestBuilder do
5
+ let(:dummy_client) {
6
+ Class.new do
7
+ extend RestRequestBuilder
8
+
9
+ def self.resource
10
+ "dummy"
11
+ end
12
+ end
13
+ }
14
+
15
+ let (:mock_auth) {{
16
+ :user => ENV["SAUCE_USERNAME"],
17
+ :password => ENV["SAUCE_ACCESS_KEY"]
18
+ }}
19
+
20
+ describe "#auth_details" do
21
+ it "should return the env vars" do
22
+ dummy_client.auth_details.should eq mock_auth
23
+ end
24
+ end
25
+
26
+ describe "#get" do
27
+ before :all do
28
+ VCR.insert_cassette 'rest_request', :record => :new_episodes
29
+ end
30
+ after :all do
31
+ VCR.eject_cassette
32
+ end
33
+
34
+ it "should call the base URL with the resource name" do
35
+ expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}"
36
+ expected_params = {:method => :get, :url => expected_url}.merge mock_auth
37
+ RestClient::Request.should_receive(:execute).with(expected_params)
38
+ dummy_client.get
39
+ end
40
+ end
41
+
42
+ describe "#put", :vcr => {:cassette_name => 'jobs'} do
43
+ it "calls the base URL with the put method" do
44
+ expected_url = "#{SauceWhisk.base_url}/#{dummy_client.resource}/something"
45
+ expected_params = {:method => :put, :url => expected_url, :payload => "another_thing", :content_type => "application/json"}.merge mock_auth
46
+ RestClient::Request.should_receive(:execute).with(expected_params)
47
+ dummy_client.put "something", "another_thing"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe SauceWhisk do
4
+ describe "##base_url" do
5
+ subject {SauceWhisk.base_url}
6
+ it {should eq "https://saucelabs.com/rest/v1"}
7
+
8
+ end
9
+
10
+ describe "##username" do
11
+ subject {SauceWhisk.username}
12
+ it {should eq ENV["SAUCE_USERNAME"]}
13
+ end
14
+
15
+ describe "##password" do
16
+ subject {SauceWhisk.password}
17
+ it {should eq ENV["SAUCE_ACCESS_KEY"]}
18
+ end
19
+
20
+ describe "##pass_job" do
21
+ it "should call #pass on the jobs object" do
22
+ job_id = "0418999"
23
+ Jobs.should_receive(:pass_job).with(job_id) {true}
24
+ SauceWhisk.pass_job job_id
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ require "psych"
2
+ require "sauce_whisk"
3
+ require "webmock/rspec"
4
+ require "vcr"
5
+
6
+ puts "PSYCH: #{Psych::VERSION}"
7
+
8
+
9
+ VCR.configure do |config|
10
+ config.cassette_library_dir = "spec/fixtures/vcr_cassettes"
11
+ config.hook_into :webmock
12
+ config.configure_rspec_metadata!
13
+ config.default_cassette_options = {
14
+ :erb => true,
15
+ :record => :new_episodes
16
+ }
17
+ config.filter_sensitive_data("<SAUCE_USERNAME>") { ENV["SAUCE_USERNAME"] }
18
+ config.filter_sensitive_data("<SAUCE_ACCESS_KEY>") { ENV["SAUCE_ACCESS_KEY"] }
19
+
20
+ #config.debug_logger = STDOUT
21
+ end
22
+
23
+ RSpec.configure do |config|
24
+ config.treat_symbols_as_metadata_keys_with_true_values = true
25
+ end