You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							119 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							119 lines
						
					
					
						
							3.7 KiB
						
					
					
				"use strict";
 | 
						|
 | 
						|
var _chai = require("chai");
 | 
						|
 | 
						|
var _apiController = _interopRequireDefault(require("./api-controller"));
 | 
						|
 | 
						|
var _filter = require("../utils/filter");
 | 
						|
 | 
						|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
						|
 | 
						|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
						|
describe('ApiController', function () {
 | 
						|
  beforeEach(function () {
 | 
						|
    this.total = 0;
 | 
						|
    this.fieldName = 'title';
 | 
						|
    this.recordJSON = {
 | 
						|
      title: 'recordTitle'
 | 
						|
    };
 | 
						|
    this.recordStub = {
 | 
						|
      toJSON: () => this.recordJSON,
 | 
						|
      params: {},
 | 
						|
      recordActions: []
 | 
						|
    };
 | 
						|
    this.resourceName = 'Users';
 | 
						|
    this.action = {
 | 
						|
      name: 'actionName',
 | 
						|
      handler: this.sinon.stub().returns({
 | 
						|
        record: this.recordStub
 | 
						|
      }),
 | 
						|
      isAccessible: this.sinon.stub().returns(true)
 | 
						|
    };
 | 
						|
    const property = {
 | 
						|
      name: () => this.fieldName,
 | 
						|
      reference: () => false,
 | 
						|
      isId: () => true,
 | 
						|
      type: () => 'string'
 | 
						|
    };
 | 
						|
    this.resourceStub = {
 | 
						|
      id: this.sinon.stub().returns('someId'),
 | 
						|
      decorate: this.sinon.stub().returns({
 | 
						|
        actions: {
 | 
						|
          list: this.action,
 | 
						|
          edit: this.action,
 | 
						|
          show: this.action,
 | 
						|
          delete: this.action,
 | 
						|
          new: this.action,
 | 
						|
          [this.action.name]: this.action
 | 
						|
        },
 | 
						|
        getListProperties: this.sinon.stub().returns([property]),
 | 
						|
        titleProperty: () => ({
 | 
						|
          name: () => this.fieldName
 | 
						|
        }),
 | 
						|
        properties: {
 | 
						|
          [property.name()]: property
 | 
						|
        },
 | 
						|
        resourceActions: () => [this.action],
 | 
						|
        recordActions: () => [this.action],
 | 
						|
        recordsDecorator: records => records,
 | 
						|
        getFlattenProperties: this.sinon.stub().returns([property]),
 | 
						|
        id: this.resourceName
 | 
						|
      }),
 | 
						|
      find: this.sinon.stub().returns([]),
 | 
						|
      count: this.sinon.stub().returns(this.total),
 | 
						|
      findOne: this.sinon.stub().returns(this.recordStub)
 | 
						|
    };
 | 
						|
    this.recordStub.resource = this.resourceStub;
 | 
						|
    this.adminStub = {
 | 
						|
      findResource: this.sinon.stub().returns(this.resourceStub),
 | 
						|
      options: {
 | 
						|
        rootPath: '/admin'
 | 
						|
      },
 | 
						|
      translateMessage: () => 'message'
 | 
						|
    };
 | 
						|
    this.currentAdmin = {
 | 
						|
      email: 'john@doe.com',
 | 
						|
      name: 'John'
 | 
						|
    };
 | 
						|
    this.apiController = new _apiController.default({
 | 
						|
      admin: this.adminStub
 | 
						|
    }, this.currentAdmin);
 | 
						|
    this.sinon.stub(_filter.Filter.prototype, 'populate').returns([this.recordStub]);
 | 
						|
  });
 | 
						|
  describe('#resourceAction', function () {
 | 
						|
    it('calls the handler of correct action', async function () {
 | 
						|
      await this.apiController.resourceAction({
 | 
						|
        params: {
 | 
						|
          action: this.action.name
 | 
						|
        }
 | 
						|
      }, {});
 | 
						|
      (0, _chai.expect)(this.action.handler).to.have.been.calledWith(this.sinon.match.any, this.sinon.match.any, this.sinon.match.has('action', this.action));
 | 
						|
    });
 | 
						|
  });
 | 
						|
  describe('#recordAction', function () {
 | 
						|
    it('calls the handler of correct action', async function () {
 | 
						|
      await this.apiController.recordAction({
 | 
						|
        params: {
 | 
						|
          action: this.action.name,
 | 
						|
          recordId: 'id'
 | 
						|
        }
 | 
						|
      }, {});
 | 
						|
      (0, _chai.expect)(this.action.handler).to.have.been.calledWith(this.sinon.match.any, this.sinon.match.any, this.sinon.match.has('action', this.action).and(this.sinon.match.has('record', this.recordStub)));
 | 
						|
    });
 | 
						|
    it('throws an error when action do not return record', function (done) {
 | 
						|
      this.action.handler = async () => ({
 | 
						|
        someData: 'without an record'
 | 
						|
      });
 | 
						|
 | 
						|
      this.apiController.recordAction({
 | 
						|
        params: {
 | 
						|
          action: this.action.name,
 | 
						|
          recordId: 'id'
 | 
						|
        }
 | 
						|
      }, {}).catch(error => {
 | 
						|
        (0, _chai.expect)(error).property('name', 'ConfigurationError');
 | 
						|
        done();
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
}); |