Files
nest/packages/core/test/router/router-response-controller.spec.ts
2019-04-10 12:52:40 +02:00

172 lines
5.2 KiB
TypeScript

import { isNil, isObject } from '@nestjs/common/utils/shared.utils';
import { expect } from 'chai';
import { of } from 'rxjs';
import * as sinon from 'sinon';
import { RequestMethod } from '../../../common';
import { RouterResponseController } from '../../router/router-response-controller';
import { NoopHttpAdapter } from '../utils/noop-adapter.spec';
describe('RouterResponseController', () => {
let adapter: NoopHttpAdapter;
let routerResponseController: RouterResponseController;
beforeEach(() => {
adapter = new NoopHttpAdapter({});
routerResponseController = new RouterResponseController(adapter);
});
describe('apply', () => {
let response: {
send: sinon.SinonSpy;
status?: sinon.SinonSpy;
json: sinon.SinonSpy;
};
beforeEach(() => {
response = { send: sinon.spy(), json: sinon.spy(), status: sinon.spy() };
});
describe('when result is', () => {
beforeEach(() => {
sinon
.stub(adapter, 'reply')
.callsFake((responseRef: any, body: any, statusCode?: number) => {
if (statusCode) {
responseRef.status(statusCode);
}
if (isNil(body)) {
return responseRef.send();
}
return isObject(body)
? responseRef.json(body)
: responseRef.send(String(body));
});
});
describe('nil', () => {
it('should call send()', async () => {
const value = null;
await routerResponseController.apply(value, response, 200);
expect(response.send.called).to.be.true;
});
});
describe('string', () => {
it('should call send(value)', async () => {
const value = 'string';
await routerResponseController.apply(value, response, 200);
expect(response.send.called).to.be.true;
expect(response.send.calledWith(String(value))).to.be.true;
});
});
describe('object', () => {
it('should call json(value)', async () => {
const value = { test: 'test' };
await routerResponseController.apply(value, response, 200);
expect(response.json.called).to.be.true;
expect(response.json.calledWith(value)).to.be.true;
});
});
});
});
describe('transformToResult', () => {
describe('when resultOrDeffered', () => {
describe('is Promise', () => {
it('should returns Promise', async () => {
const value = 100;
expect(
await routerResponseController.transformToResult(
Promise.resolve(value),
),
).to.be.eq(100);
});
});
describe('is Observable', () => {
it('should returns Promise', async () => {
const value = 100;
expect(
await routerResponseController.transformToResult(of(value)),
).to.be.eq(100);
});
});
describe('is value', () => {
it('should returns Promise', async () => {
const value = 100;
expect(
await routerResponseController.transformToResult(value),
).to.be.eq(100);
});
});
});
});
describe('getStatusByMethod', () => {
describe('when RequestMethod is POST', () => {
it('should returns 201', () => {
expect(
routerResponseController.getStatusByMethod(RequestMethod.POST),
).to.be.eql(201);
});
});
describe('when RequestMethod is not POST', () => {
it('should returns 200', () => {
expect(
routerResponseController.getStatusByMethod(RequestMethod.GET),
).to.be.eql(200);
});
});
});
describe('render', () => {
beforeEach(() => {
sinon
.stub(adapter, 'render')
.callsFake((response, view: string, options: any) => {
return response.render(view, options);
});
});
it('should call "res.render()" with expected args', async () => {
const template = 'template';
const value = 'test';
const result = Promise.resolve(value);
const response = { render: sinon.spy() };
await routerResponseController.render(result, response, template);
expect(response.render.calledWith(template, value)).to.be.true;
});
});
describe('setHeaders', () => {
let setHeaderStub: sinon.SinonStub;
beforeEach(() => {
setHeaderStub = sinon.stub(adapter, 'setHeader').callsFake(() => ({}));
});
it('should set all custom headers', () => {
const response = {};
const headers = [{ name: 'test', value: 'test_value' }];
routerResponseController.setHeaders(response, headers);
expect(
setHeaderStub.calledWith(response, headers[0].name, headers[0].value),
).to.be.true;
});
});
describe('status', () => {
let statusStub: sinon.SinonStub;
beforeEach(() => {
statusStub = sinon.stub(adapter, 'status').callsFake(() => ({}));
});
it('should set status', () => {
const response = {};
const statusCode = 400;
routerResponseController.setStatus(response, statusCode);
expect(statusStub.calledWith(response, statusCode)).to.be.true;
});
});
});