TheBrainFamily/chimpy

View on GitHub
src/__tests__/session-manager-spec.js

Summary

Maintainability
F
4 days
Test Coverage
jest.dontMock('underscore');
jest.dontMock('../lib/session-manager');
jest.dontMock('../lib/boolean-helper');

//jest.dontMock('loglevel');
//require('loglevel').setLevel('TRACE');

describe('Session Manager', function () {

  describe('Constructor', function () {

    it('sets the options on the instance when no exceptions are thrown', function () {
      var SessionManager = require('../lib/session-manager');
      var options = {port: 1234, browser: 'something'};

      var sessionManager = new SessionManager(options);

      expect(sessionManager.options).toBe(options);
    });

  });

  describe('Remote', function () {

    beforeEach(function () {
      delete process.env['chimp.noSessionReuse'];
      delete process.env['chimp.watch'];
    });

    it('should delegate the webdriver remote call if using phantom', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      wd.remote = jest.fn().
        mockReturnValueOnce('return from remote1').
        mockReturnValueOnce('return from remote2');
      var sessionManager = new SessionManager({port: 1234, browser: 'phantomjs'});

      var sessions = [1234];
      sessionManager._getWebdriverSessions = jest.fn().mockImplementation(function (callback) {
        callback(sessions);
      });
      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};

      var callback = jest.fn();
      sessionManager.remote(options, callback);
      sessionManager.remote(options, callback);


      expect(wd.remote.mock.calls.length).toBe(2);
      expect(callback.mock.calls[0][1]).toBe('return from remote1');
      expect(callback.mock.calls[1][1]).toBe('return from remote2');
      expect(wd.remote.mock.calls[0][0]).toBe(options);
      expect(wd.remote.mock.calls[1][0]).toBe(options);

    });

    it('should delegate the webdriver remote call if a session has not already started', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      var browser = {};
      wd.remote = jest.fn().mockReturnValue(browser);

      var sessionManager = new SessionManager({port: 1234, browser: 'something'});

      var sessions = [];
      sessionManager._getWebdriverSessions = jest.fn().mockImplementation(function (callback) {
        callback(null, sessions);
      });
      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};
      var callback = jest.fn();
      sessionManager.remote(options, callback);

      expect(callback.mock.calls[0][1]).toBe(browser);
      expect(wd.remote.mock.calls.length).toBe(1);
      expect(wd.remote.mock.calls[0][0]).toBe(options);

    });

    it('should reuse a session if one has already started in watch mode', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      process.env['chimp.watch'] = true;
      var browser = {_original: {requestHandler: {sessionID: 'some-id'}}};
      wd.remote = jest.fn().mockReturnValue(browser);

      var sessionManager = new SessionManager({port: 1234, browser: 'something'});

      var sessions = [{id: 'session-id'}];
      sessionManager._getWebdriverSessions = jest.fn().mockImplementation(function (callback) {
        callback(null, sessions);
      });
      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};
      var callback = jest.fn();
      sessionManager.remote(options, callback);


      expect(callback.mock.calls[0][1]).toBe(browser);
      expect(browser._original.requestHandler.sessionID).toBe(sessions[0].id);

      expect(wd.remote.mock.calls.length).toBe(1);
      expect(wd.remote.mock.calls[0][0]).toBe(options);

    });

    it('should reuse a session if one has already started in server mode', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      process.env['chimp.server'] = true;
      var browser = {_original: {requestHandler: {sessionID: 'some-id'}}};
      wd.remote = jest.fn().mockReturnValue(browser);

      var sessionManager = new SessionManager({port: 1234, browser: 'something'});

      var sessions = [{id: 'session-id'}];
      sessionManager._getWebdriverSessions = jest.fn().mockImplementation(function (callback) {
        callback(null, sessions);
      });
      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};
      var callback = jest.fn();
      sessionManager.remote(options, callback);


      expect(callback.mock.calls[0][1]).toBe(browser);
      expect(browser._original.requestHandler.sessionID).toBe(sessions[0].id);

      expect(wd.remote.mock.calls.length).toBe(1);
      expect(wd.remote.mock.calls[0][0]).toBe(options);

    });

    it('starts a new session when noSessionReuse is true when a session exists', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      wd.remote = jest.fn().
        mockReturnValueOnce('return from remote1').
        mockReturnValueOnce('return from remote2');
      var sessionManager = new SessionManager({port: 1234, browser: 'something'});

      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};
      process.env['chimp.noSessionReuse'] = true;
      var callback = jest.fn();
      sessionManager.remote(options, callback);
      sessionManager.remote(options, callback);

      expect(callback.mock.calls[0][1]).toBe('return from remote1');
      expect(callback.mock.calls[1][1]).toBe('return from remote2');
      expect(callback.mock.calls[1][1].requestHandler).toBeFalsy();
      expect(callback.mock.calls[1][1].requestHandler).toBeFalsy();

      expect(wd.remote.mock.calls.length).toBe(2);
      expect(wd.remote.mock.calls[0][0]).toBe(options);
      expect(wd.remote.mock.calls[1][0]).toBe(options);

    });

    it('respects noSessionReuse in watch mode', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');

      wd.remote = jest.fn().
        mockReturnValueOnce('return from remote1').
        mockReturnValueOnce('return from remote2');
      var sessionManager = new SessionManager({port: 1234, browser: 'something'});

      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      var options = {some: 'options'};
      process.env['chimp.watch'] = true;
      process.env['chimp.noSessionReuse'] = true;
      var callback = jest.fn();
      sessionManager.remote(options, callback);
      sessionManager.remote(options, callback);

      expect(callback.mock.calls[0][1]).toBe('return from remote1');
      expect(callback.mock.calls[1][1]).toBe('return from remote2');
      expect(callback.mock.calls[0][1].requestHandler).toBeFalsy();
      expect(callback.mock.calls[1][1].requestHandler).toBeFalsy();

      expect(wd.remote.mock.calls.length).toBe(2);
      expect(wd.remote.mock.calls[0][0]).toBe(options);
      expect(wd.remote.mock.calls[1][0]).toBe(options);

    });

    it('should monkey patch the browser when reusing sessions in watch mode', function () {

      var wd = require('xolvio-sync-webdriverio');
      var SessionManager = require('../lib/session-manager');
      var sessionManager = new SessionManager({port: 1234, browser: 'somebrowser'});
      var sessions = [];
      sessionManager._getWebdriverSessions = jest.fn().mockImplementation(function (callback) {
        callback(null, sessions);
      });
      sessionManager._waitForConnection = jest.fn().mockImplementation(function (browser, callback) {
        callback();
      });

      wd.remote = jest.fn();
      process.env['chimp.watch'] = true;
      sessionManager._monkeyPatchBrowserSessionManagement = jest.fn();

      var options = {some: 'options'};
      var callback = jest.fn();
      sessionManager.remote(options, callback);

      expect(sessionManager._monkeyPatchBrowserSessionManagement.mock.calls.length).toBe(1);
    });
  });
});