gemini-sauce
Version:
Plugin for starting up Sauce Connect when running tests with Gemini
171 lines (129 loc) • 3.83 kB
JavaScript
var _ = require('lodash');
var expect = require('chai').expect;
var mockery = require('mockery');
var sinon = require('sinon');
describe('plugin', function() {
var plugin,
gemini,
q,
deferred,
sauce;
before(function() {
q = sinon.spy();
sauce = sinon.spy();
mockery.registerMock('q', q);
mockery.registerMock('./sauce', function() { return sauce; });
});
beforeEach(function() {
q.reset();
sauce.reset();
gemini = sinon.spy();
gemini.on = function(event, cb) {
gemini[event] = cb;
};
gemini.config = {
getBrowserIds: function () {
return _.keys(gemini.config._browsers)
},
forBrowser: function (browserId) {
return gemini.config._browsers[browserId]
},
_browsers: {}
};
deferred = sinon.spy();
deferred.resolve = sinon.spy();
q.defer = sinon.spy(function() {
return deferred;
});
mockery.enable({
warnOnReplace: false,
warnOnUnregistered: false
});
plugin = require('../lib/plugin');
mockery.disable();
});
afterEach(function() {
delete process.env.SAUCE_USERNAME;
delete process.env.SAUCE_ACCESS_KEY;
});
it('should fail if credentials not provided', function() {
expect(function() {
plugin(gemini, {});
}).to.throw(Error);
});
it ('should read credentials from env', function() {
process.env.SAUCE_USERNAME = 'foo';
process.env.SAUCE_ACCESS_KEY = 'bar';
var opts = {};
plugin(gemini, opts);
expect(opts.username).to.equal('foo');
expect(opts.accessKey).to.equal('bar');
});
function init() {
plugin(gemini, {username: 'foo', accessKey: 'bar'});
};
describe('on startRunner', function() {
function startRunner() {
return gemini['startRunner']();
};
beforeEach(function() {
init();
sauce.start = sinon.spy();
});
it('should start sauce tunnel', function() {
startRunner();
expect(sauce.start.called).to.be.true;
});
it('should inject gridUrl to browsers', function() {
gemini.config._browsers = {'chrome': {desiredCapabilities: {platform: 'Windows'}}};
sauce.start = function(opts, cb) {
cb({gridUrl: 'url'});
};
startRunner();
expect(gemini.config._browsers.chrome.gridUrl).to.equal('url');
});
it('should inject tunnel identifier to browsers', function() {
gemini.config._browsers = {'chrome': {desiredCapabilities: {platform: 'Windows'}}};
sauce.start = function(opts, cb) {
cb({tunnelId: 'identifier'});
};
startRunner();
expect(gemini.config._browsers.chrome.desiredCapabilities['tunnel-identifier']).to.equal('identifier');
});
it('should return a promise', function() {
deferred.promise = sinon.spy();
expect(startRunner()).to.equal(deferred.promise);
});
it('should resolve the given promise', function() {
sauce.start = function(opts, cb) {
cb({});
};
startRunner();
expect(deferred.resolve.called).to.be.true;
});
});
describe('on endRunner', function() {
function endRunner() {
return gemini['endRunner']();
};
beforeEach(function() {
plugin(gemini, {username: 'foo', accessKey: 'bar'});
sauce.stop = sinon.spy();
});
it('should stop sauce tunnel', function() {
endRunner();
expect(sauce.stop.called).to.be.true;
});
it('should return a promise', function() {
deferred.promise = sinon.stub();
expect(endRunner()).to.equal(deferred.promise);
});
it('should resolve the given promise', function() {
sauce.stop = function(cb) {
cb();
}
endRunner();
expect(deferred.resolve.called).to.be.true;
});
});
});