Incognito/one-time-secret

View on GitHub
src/httpd/HTTPD.spec.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Writable } from 'stream';
import { HTTPD } from './HTTPD';

const createJestLoggerMock = function() {
  return <any> {
    info: jest.fn(),
    debug: jest.fn(),
    error: jest.fn()
  };
}

const createHttpdMock = function (serverMock: any, requestHandlerMock: any): HTTPD {
  return new HTTPD(
    <any> { info: jest.fn(), debug: jest.fn(), error: jest.fn() },
    <any> serverMock,
    <any> requestHandlerMock,
    1337,
    31337
  );
}

describe('HTTPD Spec', function() {
  it('should setup the server', function() {
    const serverSetTimeoutMock = jest.fn();
    const serverOnMock = jest.fn();
    const serverMock = {
      on: serverOnMock,
      setTimeout: serverSetTimeoutMock
    };

    const processMock = jest.fn();
    const requestHandlerMock = { process: processMock };

    const sut = createHttpdMock(serverMock, requestHandlerMock);

    expect(serverSetTimeoutMock.mock.calls.length).toBe(1);
    expect(serverSetTimeoutMock.mock.calls[0][0]).toBe(31337);

    expect(sut).toEqual(expect.any(HTTPD));
  });

  it('should start', function() {
    const serverListenMock = jest.fn();
    const serverSetTimeoutMock = jest.fn();
    const serverOnMock = jest.fn();
    const serverMock = {
      on: serverOnMock,
      setTimeout: serverSetTimeoutMock,
      listen: serverListenMock
    };
    const requestHandlerMock = {};

    const sut = createHttpdMock(serverMock, requestHandlerMock);

    sut.start();

    expect(serverListenMock.mock.calls.length).toBe(1);
    expect(serverListenMock.mock.calls[0][0]).toBe(1337);
  });

  it('should log error on client error', async function() {
    jest.mock('http');
    const serverStreamMock = <any> new Writable();
    serverStreamMock.setTimeout = jest.fn();

    const requestHandlerMock = { process: jest.fn() };
    const loggerMock = createJestLoggerMock();

    // tslint:disable-next-line
    new HTTPD(
      loggerMock,
      serverStreamMock,
      <any> requestHandlerMock,
      1337,
      31337
    );
    const endMock = jest.fn();
    serverStreamMock.emit('clientError', <any> 'error', <any> { end: endMock });

    await new Promise((resolve) => {
      process.nextTick(resolve);
    });
    expect(loggerMock.error).toBeCalled();
    expect(endMock).toBeCalledWith('HTTP/1.1 400 Bad Request\r\n\r\n');
  });

  it('should log error on client error without error message', async function() {
    jest.mock('http');
    const serverStreamMock = <any> new Writable();
    serverStreamMock.setTimeout = jest.fn();

    const requestHandlerMock = { process: jest.fn() };
    const loggerMock = createJestLoggerMock();

    // tslint:disable-next-line
    new HTTPD(
      loggerMock,
      serverStreamMock,
      <any> requestHandlerMock,
      1337,
      31337
    );
    const endMock = jest.fn();
    serverStreamMock.emit('clientError', <any> false, <any> { end: endMock });

    await new Promise((resolve) => {
      process.nextTick(resolve);
    });
    expect(loggerMock.error).not.toBeCalled();
    expect(loggerMock.info).toBeCalled();
    expect(endMock).toBeCalledWith('HTTP/1.1 400 Bad Request\r\n\r\n');
  });

  it('should log error on client error', async function() {
    jest.mock('http');
    const serverStreamMock = <any> new Writable();
    serverStreamMock.setTimeout = jest.fn();

    const requestHandlerMock = { process: jest.fn() };
    const loggerMock = createJestLoggerMock();

    // tslint:disable-next-line
    new HTTPD(
      loggerMock,
      serverStreamMock,
      <any> requestHandlerMock,
      1337,
      31337
    );

    const requestMock = <any> {};
    const responseMock = <any> {};
    serverStreamMock.emit('request', requestMock, responseMock);

    await new Promise((resolve) => {
      process.nextTick(resolve);
    });

    expect(loggerMock.debug).toBeCalled();
    expect(requestHandlerMock.process).toBeCalledWith(requestMock, responseMock);
  });

});