Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/logger / test / middleware.spec.js
Size: Mime:
/* global jasmine, describe, it, expect, beforeEach */

const request = require('supertest');
const express = require('express');
const LoggerMiddleware = require('../src/middleware');
const Logger = require('../src/logger');
const InMemoryTransport = require('./support/InMemoryTransport');

function createFakeApp(logger) {
  const fakeApp = express();
  fakeApp.enable('trust proxy');

  fakeApp.get('/middleware-test', (req, res, next) => {
    res
      .json({})
      .status(200)
      .end();
    next();
  });

  fakeApp.get('/middleware-test/not-found', (req, res, next) => {
    res
      .json({})
      .status(404)
      .end();
    next();
  });

  fakeApp.get('/middleware-test/throw', () => {
    throw new Error('Error in test!');
  });

  LoggerMiddleware.initialize(fakeApp, logger);

  fakeApp.use(LoggerMiddleware.expressLogger);
  fakeApp.use(LoggerMiddleware.expressErrorLogger);

  return fakeApp;
}

let logReader;
let server;
let app;

beforeAll(() => {
  logReader = new InMemoryTransport();
  const logger = new Logger('test', {
    K8S_POD_NAME: `TestPodName`,
    K8S_POD_NAMESPACE: `TestPodNamespace`,
    K8S_POD_IP: `0.0.0.0`,
    K8S_NODE_NAME: `TestNodeName`,
  });
  logger.instance.add(logReader);
  app = createFakeApp(logger);
  server = app.listen(3001);
});

beforeEach(() => {
  logReader.clearLog();
});

afterAll(done => {
  server.close(done);
});

describe('logger middleware', () => {
  it('logs a request', done => {
    request(app)
      .get('/middleware-test')
      .then(() => {
        expect(logReader.getLog()).toHaveLength(1);
        done();
      });
  });

  it('logs the status code', done => {
    request(app)
      .get('/middleware-test/not-found')
      .then(() => {
        expect(logReader.getLog()[0]).toEqual(
          jasmine.objectContaining({
            resStatusCode: `404`,
          })
        );
        done();
      });
  });

  it('logs the request URL', done => {
    request(app)
      .get('/middleware-test/not-found')
      .then(() => {
        expect(logReader.getLog()[0]).toEqual(
          jasmine.objectContaining({
            reqUrl: `/middleware-test/not-found`,
          })
        );
        done();
      });
  });

  it('logs the request headers', done => {
    request(app)
      .get('/middleware-test')
      .set('X-B3-TraceId', 'testTrace')
      .set('X-B3-SpanId', 'testSpan')
      .set('X-B3-ParentSpanId', 'testParentSpan')
      .set('X-Span-Export', 'testSpanExport')
      .then(() => {
        expect(logReader.getLog()[0]).toEqual(
          jasmine.objectContaining({
            trace: `testTrace`,
            span: `testSpan`,
            parent: `testParentSpan`,
            exportable: `testSpanExport`,
          })
        );
        done();
      });
  });

  it('logs errors', done => {
    request(app)
      .get('/middleware-test/throw')
      .then(() => {
        expect(logReader.getLog()[0].severity).toBe(`error`);
        expect(logReader.getLog()[0].rest).toMatch(/Error/);
        done();
      });
  });

  it('sets the request status code to 500 when there is an error', done => {
    request(app)
      .get('/middleware-test/throw')
      .then(() => {
        expect(logReader.getLog()[0]).toEqual(
          jasmine.objectContaining({
            resStatusCode: `500`,
          })
        );
        done();
      });
  });
});