UNPKG

8.22 kBJavaScriptView Raw
1"use strict";
2
3var should = require("should");
4var BrowserStack = require("../lib/browserstack");
5var util = require("./util");
6
7var username = util.browserStack.username;
8var password = util.browserStack.password;
9
10if (!username || !password) {
11 throw new Error("Please set BROWSERSTACK_USERNAME and BROWSERSTACK_KEY environment variables.");
12}
13
14describe("BrowserStack API", function() {
15 this.timeout(60000); // 60s
16
17 var client;
18 var workers = [];
19
20 beforeEach(function() {
21 client = BrowserStack.createClient({
22 username: username,
23 password: password
24 });
25 });
26
27 afterEach(function(done) {
28 util.terminateWorkers(client, workers, function() {
29 workers = [];
30 done();
31 });
32 });
33
34 describe("API Status", function() {
35 it("should get API status", function(done) {
36 client.getApiStatus(function(err, status) {
37 should.ifError(err);
38
39 status.should.be.an.Object().and.have.keys([
40 "running_sessions",
41 "sessions_limit",
42 "used_time",
43 "total_available_time"
44 ]);
45
46 done(err);
47 });
48 });
49 });
50
51 describe("Browser Listing", function() {
52 it("should list browsers", function(done) {
53 client.getBrowsers(function(err, browsers) {
54 should.ifError(err);
55
56 browsers.should.be.an.Array().and.not.be.empty();
57 browsers.map(util.validateBrowserObject);
58
59 done(err);
60 });
61 });
62
63 it("should get latest browser versions", function(done) {
64 client.getLatest(function(err, versions) {
65 should.ifError(err);
66
67 versions.should.be.an.Object().and.not.be.empty();
68 done(err);
69 });
70 });
71
72 it("should get the latest version for specified browser", function(done) {
73 client.getBrowsers(function(err, browsers) {
74 should.ifError(err);
75
76 browsers = browsers.filter(function(browser) {
77 return !browser.device;
78 });
79
80 var requests = browsers.length;
81
82 browsers.forEach(function(browser) {
83 client.getLatest(browser, function(err, version) {
84 should.ifError(err);
85 version.should.match(/\d+(\.)*\d*/);
86
87 if (err || --requests < 1) {
88 if (done) {
89 done(err);
90 done = null;
91 }
92 }
93 });
94 });
95 });
96 });
97
98 it("should fail to get the latest version for invalid browser", function(done) {
99 client.getLatest({
100 os: "Windows",
101 os_version: "10",
102 browser: "mosaic"
103 }, function(err, version) {
104 should.ifError(err);
105 should.equal(undefined, version);
106
107 done(err);
108 });
109 });
110 });
111
112 describe("Worker API", function() {
113 var sampleDesktopBrowser = {
114 os: "Windows",
115 os_version: "10",
116 browser: "chrome",
117 browser_version: "47.0",
118 timeout: 20
119 };
120
121 var sampleDeviceBrowser = {
122 device: "Google Nexus 6",
123 os: "android",
124 os_version: "5.0",
125 browser: "Android Browser",
126 timeout: 20
127 };
128
129 it("should create worker", function(done) {
130 client.createWorker(util.merge(sampleDesktopBrowser, {
131 url: "http://www.example.com"
132 }), function(err, worker) {
133 should.ifError(err);
134
135 util.validateWorker(worker);
136 workers.push(worker);
137 done(err);
138 });
139 });
140
141 it("should create worker with latest edge", function(done) {
142 client.createWorker({
143 os: "Windows",
144 os_version: "10",
145 browser: "Edge",
146 browser_version: "latest",
147 url: "http://www.example.com",
148 timeout: 20
149 }, function(err, worker) {
150 should.ifError(err);
151
152 util.validateWorker(worker);
153 workers.push(worker);
154 done(err);
155 });
156 });
157
158 it("should fail to create worker for invalid browser", function(done) {
159 client.createWorker(util.merge(sampleDesktopBrowser, {
160 url: "http://www.example.com",
161 browser: "mosaic"
162 }), function(err, worker) {
163 err.should.be.an.Error();
164 err.message.should.match(/validation failed/i);
165
166 should.not.exist(worker);
167 done();
168 });
169 });
170
171 it("should create a worker with details", function(done) {
172 client.createWorker(util.merge(sampleDesktopBrowser, {
173 url: "http://www.example.com",
174 name: "worker-1",
175 build: "build-1",
176 project: "project-1"
177 }), function(err, worker) {
178 should.ifError(err);
179
180 util.validateWorker(worker);
181 workers.push(worker);
182 done(err);
183 });
184 });
185
186 it("should create a worker for a device browser", function(done) {
187 client.createWorker(util.merge(sampleDeviceBrowser, {
188 url: "http://www.example.com"
189 }), function(err, worker) {
190 should.ifError(err);
191
192 util.validateWorker(worker);
193 workers.push(worker);
194 done(err);
195 });
196 });
197
198 it("should fail to create worker for invalid device", function(done) {
199 client.createWorker(util.merge(sampleDeviceBrowser, {
200 url: "http://www.example.com",
201 device: "Nexus 5S"
202 }), function(err, worker) {
203
204 err.should.be.an.Error();
205 err.message.should.match(/validation failed/i);
206
207 should.not.exist(worker);
208 done();
209 });
210 });
211
212 it("should get created worker by id", function(done) {
213 client.createWorker(util.merge(sampleDeviceBrowser, {
214 url: "http://www.example.com"
215 }), function(err, worker) {
216 should.ifError(err);
217
218 util.validateWorker(worker);
219 workers.push(worker);
220
221 client.getWorker(worker.id, function(err, worker2) {
222 should.ifError(err);
223
224 util.validateWorker(worker2);
225 should.equal(worker.id, worker2.id, "Worker id mismatch");
226 done(err);
227 });
228 });
229 });
230
231 it("should fetch list of workers", function(done) {
232 client.createWorker(util.merge(sampleDeviceBrowser, {
233 url: "http://www.example.com"
234 }), function(err, worker) {
235 should.ifError(err);
236
237 util.validateWorker(worker);
238 workers.push(worker);
239
240 client.getWorkers(function(err, workers) {
241 should.ifError(err);
242
243 workers.should.be.an.Array().and.not.be.empty();
244
245 var workerExists = workers.filter(function(w) {
246 util.validateWorker(w);
247 return (w.id === worker.id);
248 }).shift();
249
250 done(workerExists ? null : new Error("failed to fetch created worker"));
251 });
252 });
253 });
254
255 it("should terminate a worker by id", function(done) {
256 client.createWorker(util.merge(sampleDeviceBrowser, {
257 url: "http://www.example.com"
258 }), function(err, worker) {
259 should.ifError(err);
260
261 util.validateWorker(worker);
262 workers.push(worker);
263
264 client.terminateWorker(worker.id, function(err, data) {
265 should.ifError(err);
266
267 data.should.be.an.Object();
268 data.time.should.match(/\d+/);
269
270 done(err);
271 });
272 });
273 });
274 });
275
276 describe("Worker Session APIs", function() {
277 this.timeout(100000);
278
279 var sampleDesktopBrowser = {
280 os: "Windows",
281 os_version: "10",
282 browser: "chrome",
283 browser_version: "47.0",
284 timeout: 120
285 };
286
287 it("should change worker url", function(done) {
288 client.createWorker(util.merge(sampleDesktopBrowser, {
289 url: "http://www.example.com"
290 }), function(err, worker) {
291 should.ifError(err);
292
293 util.validateWorker(worker);
294 workers.push(worker);
295
296 util.pollApiWorker(client, worker, function(err, isRunning) {
297 if (isRunning) {
298 return client.changeUrl(worker.id, {
299 url: "http://www.example.net",
300 timeout: 20
301 }, function(err, data) {
302 should.ifError(err);
303
304 data.should.be.an.Object();
305 data.message.should.match(/browser updated with new url/i);
306
307 done(err);
308 });
309 }
310
311 should.ifError(err);
312 return done(err || new Error("worker remained in queue until timeout"));
313 });
314
315 });
316 });
317
318 it("should take screenshot of worker session", function(done) {
319 client.createWorker(util.merge(sampleDesktopBrowser, {
320 url: "http://www.example.com"
321 }), function(err, worker) {
322 should.ifError(err);
323 util.validateWorker(worker);
324 workers.push(worker);
325
326 util.pollApiWorker(client, worker, function(err, isRunning) {
327 if (isRunning) {
328
329 // wait for page load
330 var pageLoadTime = 5000;
331
332 return setTimeout(function() {
333 client.takeScreenshot(worker.id, function(err, data) {
334 should.ifError(err);
335
336 data.should.be.an.Object();
337 data.url.should.match(/^http(s)?:\/\/.*\.png$/i);
338
339 done(err);
340 });
341 }, pageLoadTime);
342 }
343
344 should.ifError(err);
345 return done(err || new Error("worker remained in queue until timeout"));
346 });
347
348 });
349 });
350
351 });
352});