neotoma/sync-server

View on GitHub
tests/controllers/item/storeItemData.js

Summary

Maintainability
C
7 hrs
Test Coverage
require('park-ranger')();

var app = require('app'),
  assert = require('assert'),
  assertFunctionCallbacksError = require('app/lib/assertions/functionCallbacksError'),
  assertFunctionCallbacksNoError = require('app/lib/assertions/functionCallbacksNoError'),
  async = require('async'),
  mongoose = require('app/lib/mongoose'),
  nock = require('app/lib/nock'),
  resetAppSpy = require('./routines/resetAppSpy'),
  storeItemData = require('app/controllers/item/storeItemData'),
  wh = require('app/lib/warehouse');

describe('itemController storeItemData method', function() {
  beforeEach(mongoose.removeAllCollections);
  beforeEach(resetAppSpy);

  assertFunctionCallbacksError(storeItemData, [{
    when: 'no item parameter provided',
    params: [undefined, wh.jsonData(), wh.one('job')],
    error: 'Parameter item undefined or null'
  }, {
    when: 'no data parameter provided',
    params: [wh.one('item'), undefined, wh.one('job')],
    error: 'Parameter data undefined or null'
  }, {
    when: 'item parameter has no user property',
    params: [wh.one('item'), wh.jsonData(), wh.one('job')],
    error: 'Parameter item has no user property',
    before: function(done) {
      this.params[0] = wh.one('item', {
        user: undefined
      });

      done();
    }
  }, {
    when: 'item parameter has no storage property',
    params: [wh.one('item'), wh.jsonData(), wh.one('job')],
    error: 'Parameter item has no storage property',
    before: function(done) {
      this.params[0] = wh.one('item', {
        storage: undefined
      });

      done();
    }
  }, {
    when: 'item parameter has no save property',
    params: [wh.one('item'), wh.jsonData(), wh.one('job')],
    error: 'Parameter item has no save property',
    before: function(done) {
      this.params[0] = wh.mockProperties('item');
      done();
    }
  }]);

  assertFunctionCallbacksNoError(storeItemData, [{
    when: 'provided item with json data',
    params: [wh.one('item'), wh.jsonData(), wh.one('job')],
    before: function(done) {
      var storage, userStorageAuth;

      var saveContentType = (done) => {
        wh.oneSaved('contentType', {
          _id: this.params[0].contentType
        }, done);
      };

      var saveSource = (done) => {
        wh.oneSaved('source', {
          _id: this.params[0].source
        }, done);
      };

      var saveStorage = (done) => {
        wh.oneSaved('storage', {
          _id: this.params[0].storage
        }, (error, savedStorage) => {
          storage = savedStorage;
          done(error);
        });
      };

      var saveUser = (done) => {
        wh.oneSaved('user', {
          _id: this.params[0].user
        }, done);
      };

      var saveItem = (done) => {
        this.params[0].save(done);
      };

      var saveUserStorageAuth = (done) => {
        wh.oneSaved('userStorageAuth', {
          user: this.params[0].user,
          storage: this.params[0].storage
        }, (error, savedUserStorageAuth) => {
          userStorageAuth = savedUserStorageAuth;
          done(error);
        });
      };

      var populateItem = (done) => {
        this.params[0].populate('contentType source storage user', done);
      };

      var setupNock = (done) => {
        nock.postStorage(storage, userStorageAuth);
        done();
      };

      async.series([
        saveContentType,
        saveSource,
        saveStorage,
        saveUser,
        saveItem,
        saveUserStorageAuth,
        populateItem,
        setupNock
      ], done);
    },
    after: function(done) {
      try {
        assert(this.params[0].storageVerifiedAt);
        assert.equal(this.params[0].storageBytes, wh.bytes);
        assert.equal(this.params[0].storagePath, wh.jsonPath);
        assert(app.emit.firstCall.calledWith('storedItemData', this.params[0]));

        done();
      } catch (error) {
        done(error);
      }
    }
  }]);
});