forked from lix-project/lix-website
353 lines
8 KiB
JavaScript
353 lines
8 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var should = require("should");
|
||
|
var BrowserStack = require("../lib/browserstack");
|
||
|
var util = require("./util");
|
||
|
|
||
|
var username = util.browserStack.username;
|
||
|
var password = util.browserStack.password;
|
||
|
|
||
|
if (!username || !password) {
|
||
|
throw new Error("Please set BROWSERSTACK_USERNAME and BROWSERSTACK_KEY environment variables.");
|
||
|
}
|
||
|
|
||
|
describe("BrowserStack API", function() {
|
||
|
this.timeout(60000); // 60s
|
||
|
|
||
|
var client;
|
||
|
var workers = [];
|
||
|
|
||
|
beforeEach(function() {
|
||
|
client = BrowserStack.createClient({
|
||
|
username: username,
|
||
|
password: password
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterEach(function(done) {
|
||
|
util.terminateWorkers(client, workers, function() {
|
||
|
workers = [];
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("API Status", function() {
|
||
|
it("should get API status", function(done) {
|
||
|
client.getApiStatus(function(err, status) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
status.should.be.an.Object().and.have.keys([
|
||
|
"running_sessions",
|
||
|
"sessions_limit",
|
||
|
"used_time",
|
||
|
"total_available_time"
|
||
|
]);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("Browser Listing", function() {
|
||
|
it("should list browsers", function(done) {
|
||
|
client.getBrowsers(function(err, browsers) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
browsers.should.be.an.Array().and.not.be.empty();
|
||
|
browsers.map(util.validateBrowserObject);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should get latest browser versions", function(done) {
|
||
|
client.getLatest(function(err, versions) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
versions.should.be.an.Object().and.not.be.empty();
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should get the latest version for specified browser", function(done) {
|
||
|
client.getBrowsers(function(err, browsers) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
browsers = browsers.filter(function(browser) {
|
||
|
return !browser.device;
|
||
|
});
|
||
|
|
||
|
var requests = browsers.length;
|
||
|
|
||
|
browsers.forEach(function(browser) {
|
||
|
client.getLatest(browser, function(err, version) {
|
||
|
should.ifError(err);
|
||
|
version.should.match(/\d+(\.)*\d*/);
|
||
|
|
||
|
if (err || --requests < 1) {
|
||
|
if (done) {
|
||
|
done(err);
|
||
|
done = null;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should fail to get the latest version for invalid browser", function(done) {
|
||
|
client.getLatest({
|
||
|
os: "Windows",
|
||
|
os_version: "10",
|
||
|
browser: "mosaic"
|
||
|
}, function(err, version) {
|
||
|
should.ifError(err);
|
||
|
should.equal(undefined, version);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("Worker API", function() {
|
||
|
var sampleDesktopBrowser = {
|
||
|
os: "Windows",
|
||
|
os_version: "10",
|
||
|
browser: "chrome",
|
||
|
browser_version: "47.0",
|
||
|
timeout: 20
|
||
|
};
|
||
|
|
||
|
var sampleDeviceBrowser = {
|
||
|
device: "Google Nexus 6",
|
||
|
os: "android",
|
||
|
os_version: "5.0",
|
||
|
browser: "Android Browser",
|
||
|
timeout: 20
|
||
|
};
|
||
|
|
||
|
it("should create worker", function(done) {
|
||
|
client.createWorker(util.merge(sampleDesktopBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should create worker with latest edge", function(done) {
|
||
|
client.createWorker({
|
||
|
os: "Windows",
|
||
|
os_version: "10",
|
||
|
browser: "Edge",
|
||
|
browser_version: "latest",
|
||
|
url: "http://www.example.com",
|
||
|
timeout: 20
|
||
|
}, function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should fail to create worker for invalid browser", function(done) {
|
||
|
client.createWorker(util.merge(sampleDesktopBrowser, {
|
||
|
url: "http://www.example.com",
|
||
|
browser: "mosaic"
|
||
|
}), function(err, worker) {
|
||
|
err.should.be.an.Error();
|
||
|
err.message.should.match(/validation failed/i);
|
||
|
|
||
|
should.not.exist(worker);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should create a worker with details", function(done) {
|
||
|
client.createWorker(util.merge(sampleDesktopBrowser, {
|
||
|
url: "http://www.example.com",
|
||
|
name: "worker-1",
|
||
|
build: "build-1",
|
||
|
project: "project-1"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should create a worker for a device browser", function(done) {
|
||
|
client.createWorker(util.merge(sampleDeviceBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should fail to create worker for invalid device", function(done) {
|
||
|
client.createWorker(util.merge(sampleDeviceBrowser, {
|
||
|
url: "http://www.example.com",
|
||
|
device: "Nexus 5S"
|
||
|
}), function(err, worker) {
|
||
|
|
||
|
err.should.be.an.Error();
|
||
|
err.message.should.match(/validation failed/i);
|
||
|
|
||
|
should.not.exist(worker);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should get created worker by id", function(done) {
|
||
|
client.createWorker(util.merge(sampleDeviceBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
|
||
|
client.getWorker(worker.id, function(err, worker2) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker2);
|
||
|
should.equal(worker.id, worker2.id, "Worker id mismatch");
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should fetch list of workers", function(done) {
|
||
|
client.createWorker(util.merge(sampleDeviceBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
|
||
|
client.getWorkers(function(err, workers) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
workers.should.be.an.Array().and.not.be.empty();
|
||
|
|
||
|
var workerExists = workers.filter(function(w) {
|
||
|
util.validateWorker(w);
|
||
|
return (w.id === worker.id);
|
||
|
}).shift();
|
||
|
|
||
|
done(workerExists ? null : new Error("failed to fetch created worker"));
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should terminate a worker by id", function(done) {
|
||
|
client.createWorker(util.merge(sampleDeviceBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
|
||
|
client.terminateWorker(worker.id, function(err, data) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
data.should.be.an.Object();
|
||
|
data.time.should.match(/\d+/);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("Worker Session APIs", function() {
|
||
|
this.timeout(100000);
|
||
|
|
||
|
var sampleDesktopBrowser = {
|
||
|
os: "Windows",
|
||
|
os_version: "10",
|
||
|
browser: "chrome",
|
||
|
browser_version: "47.0",
|
||
|
timeout: 120
|
||
|
};
|
||
|
|
||
|
it("should change worker url", function(done) {
|
||
|
client.createWorker(util.merge(sampleDesktopBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
|
||
|
util.pollApiWorker(client, worker, function(err, isRunning) {
|
||
|
if (isRunning) {
|
||
|
return client.changeUrl(worker.id, {
|
||
|
url: "http://www.example.net",
|
||
|
timeout: 20
|
||
|
}, function(err, data) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
data.should.be.an.Object();
|
||
|
data.message.should.match(/browser updated with new url/i);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
should.ifError(err);
|
||
|
return done(err || new Error("worker remained in queue until timeout"));
|
||
|
});
|
||
|
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should take screenshot of worker session", function(done) {
|
||
|
client.createWorker(util.merge(sampleDesktopBrowser, {
|
||
|
url: "http://www.example.com"
|
||
|
}), function(err, worker) {
|
||
|
should.ifError(err);
|
||
|
util.validateWorker(worker);
|
||
|
workers.push(worker);
|
||
|
|
||
|
util.pollApiWorker(client, worker, function(err, isRunning) {
|
||
|
if (isRunning) {
|
||
|
|
||
|
// wait for page load
|
||
|
var pageLoadTime = 5000;
|
||
|
|
||
|
return setTimeout(function() {
|
||
|
client.takeScreenshot(worker.id, function(err, data) {
|
||
|
should.ifError(err);
|
||
|
|
||
|
data.should.be.an.Object();
|
||
|
data.url.should.match(/^http(s)?:\/\/.*\.png$/i);
|
||
|
|
||
|
done(err);
|
||
|
});
|
||
|
}, pageLoadTime);
|
||
|
}
|
||
|
|
||
|
should.ifError(err);
|
||
|
return done(err || new Error("worker remained in queue until timeout"));
|
||
|
});
|
||
|
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|
||
|
});
|