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
			| 
								 
											3 years ago
										 
									 | 
							
								"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();
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |