API Docs for: 0.9.3
Show:

File: lib/abstractClient.js

// Copyright 2014, Yahoo! Inc.
// Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms.

var Base = require('preceptor-core').Base;
var utils = require('preceptor-core').utils;
var ReportManager = require('preceptor-reporter');
var _ = require('underscore');
var Promise = require('promise');

var defaultClient = require('./defaults/defaultClient');

/**
 * @class AbstractClient
 * @extends Base
 *
 * @property {object} _options
 * @property {AbstractClientDecorator[]} decorators
 * @property {ReportManager} _reportManager
 * @property {EventReporter} _eventReporter
 */
var AbstractClient = Base.extend(

	/**
	 * Abstract client constructor
	 *
	 * @param {object[]} decorators
	 * @param {object} decoratorPlugins
	 * @param {object} options
	 * @constructor
	 */
	function (decorators, decoratorPlugins, options) {
		this.__super();

		this._reportManager = new ReportManager({ collect: false });
		this._eventReporter = this._reportManager.addReporter('Event');
		this._eventReporter.on('message', function (areaType, messageType, data) {
			// Make sure not to forward admin messages; this should stay in the client
			if (["admin"].indexOf(areaType) === -1) {
				this.emit('reportMessage', messageType, data);
			}
		}.bind(this));

		this._options = utils.deepExtend({}, [defaultClient, options || {}]);
		this.decorators = this._setupDecorators(this._eventReporter, decorators, decoratorPlugins);

		this.initialize();
	},

	{
		/**
		 * Setup decorator plugins
		 *
		 * @method _setupDecorators
		 * @param {EventReporter} eventReporter
		 * @param {object[]} decorators
		 * @param {object} decoratorPlugins
		 * @return {AbstractClientDecorator[]}
		 * @private
		 */
		_setupDecorators: function (eventReporter, decorators, decoratorPlugins) {

			var decoratorList = [];

			_.each(decorators, function (currentDecorator) {

				var decoratorPlugin = decoratorPlugins[currentDecorator.type.toLowerCase()],
					DecoratorClass,
					decoratorInstance;

				if (!decoratorPlugin) {
					throw new Error('Unknown decorator: ' + currentDecorator.type);
				}

				DecoratorClass = require(decoratorPlugin);
				decoratorInstance = new DecoratorClass(eventReporter, currentDecorator);
				decoratorList.push(decoratorInstance);

			}, this);

			return decoratorList;
		},


		/**
		 * Processes the begin of the testing environment
		 *
		 * @method processBefore
		 * @return {Promise}
		 */
		processBefore: function () {

			var promise = Promise.resolve();

			_.each(this.decorators, function (decorator) {
				promise = promise.then(function () {
					return decorator.processBefore();
				})
			}, this);

			return promise;
		},

		/**
		 * Processes the end of the testing environment
		 *
		 * @method processAfter
		 * @return {Promise}
		 */
		processAfter: function () {

			var promise = Promise.resolve();

			_.each(this.decorators, function (decorator) {
				promise = promise.then(function () {
					return decorator.processAfter();
				})
			}, this);

			return promise;
		},

		/**
		 * Processes the beginning of a test
		 *
		 * @method processBeforeTest
		 * @return {Promise}
		 */
		processBeforeTest: function () {

			var promise = Promise.resolve();

			_.each(this.decorators, function (decorator) {
				promise = promise.then(function () {
					return decorator.processBeforeTest();
				})
			}, this);

			return promise;
		},

		/**
		 * Processes the ending of a test
		 *
		 * @method processAfterTest
		 * @return {Promise}
		 */
		processAfterTest: function () {

			var promise = Promise.resolve();

			_.each(this.decorators, function (decorator) {
				promise = promise.then(function () {
					return decorator.processAfterTest();
				})
			}, this);

			return promise;
		},


		/**
		 * Gets the options
		 *
		 * @method getOptions
		 * @return {object}
		 */
		getOptions: function () {
			return this._options;
		},

		/**
		 * Gets the decorator
		 *
		 * @method getDecorator
		 * @return {AbstractClientDecorator[]}
		 */
		getDecorator: function () {
			return this.decorators;
		},


		/**
		 * Gets the report-manager
		 *
		 * @method getReportManager
		 * @return {ReportManager}
		 */
		getReportManager: function () {
			return this._reportManager;
		},

		/**
		 * Gets the event-reporter
		 *
		 * @method getEventReporter
		 * @return {EventReporter}
		 */
		getEventReporter: function () {
			return this._eventReporter;
		},


		/**
		 * Will be called when the client begins
		 *
		 * @method run
		 * @return {Promise}
		 */
		run: function () {
			throw new Error('Unimplemented method "run" in the client.');
		}
	},

	{
		/**
		 * @property TYPE
		 * @type {string}
		 * @static
		 */
		TYPE: 'AbstractClient'
	});

module.exports = AbstractClient;