1 | "use strict";
|
2 |
|
3 | var should = require("should");
|
4 | var BrowserStack = require("../lib/browserstack");
|
5 | var util = require("./util");
|
6 |
|
7 | var username = util.browserStack.username;
|
8 | var password = util.browserStack.password;
|
9 |
|
10 | if (!username || !password) {
|
11 | throw new Error("Please set BROWSERSTACK_USERNAME and BROWSERSTACK_KEY environment variables.");
|
12 | }
|
13 |
|
14 | describe("BrowserStack API", function() {
|
15 | this.timeout(60000);
|
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 |
|
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 | });
|