ezpaarse-project/ezpaarse

View on GitHub
test/job-logs-test.js

Summary

Maintainability
F
1 wk
Test Coverage
/* eslint no-sync: 0 */
/* global describe, it */
'use strict';

var fs      = require('fs');
var path    = require('path');
var should  = require('should');
var helpers = require('./helpers.js');

var logFile                = path.join(__dirname, '/dataset/sd.mini.log');
var wrongSecondLineLogFile = path.join(__dirname, '/dataset/sd.wrong-second-line.log');
var ignoredDomain          = path.join(__dirname, '/dataset/ignored-domain.log');
var unknownDomain          = path.join(__dirname, '/dataset/unknown-domain.log');
var unqualifiedEC          = path.join(__dirname, '/dataset/unqualified-ec.log');
var duplicateEC            = path.join(__dirname, '/dataset/duplicate-ecs.log');
var unorderedEC            = path.join(__dirname, '/dataset/unordered-ecs.log');
var deniedEC               = path.join(__dirname, '/dataset/sd.denied.log');
var filteredEC             = path.join(__dirname, '/dataset/filtered-ecs.log');
var robotEC                = path.join(__dirname, '/dataset/robot-ec.log');

describe('The server', function () {
  describe('receives a log file', function () {
    it('and sends a job ID in headers (@01)', function (done) {
      var headers = {
        'Accept' : 'application/json'
      };
      helpers.post('/', logFile, headers, function (err, res) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);
        should.exist(res.headers['job-id'],
          'The header "Job-ID" was not sent by the server');
        done();
      });
    });
    it('and does not generate rejects files by default (@02)', function (done) {
      var headers = {
        'Accept' : 'text/csv'
      };
      helpers.post('/', wrongSecondLineLogFile, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        var logHeaders = [];
        for (var header in res.headers) {
          if (header.substr(0, 6) == 'lines-') {
            logHeaders.push(header);
          }
        }

        logHeaders.length.should.not.equal(0);

        (function check() {
          var header = logHeaders.pop();
          if (!header) { return done(); }

          var logURL = res.headers[header];

          helpers.get(logURL, function (error, response, logBody) {
            if (!response) { throw new Error('ezPAARSE is not running'); }
            if (error)     { throw error; }
            response.statusCode.should.equal(404,
              'the URL of ' + header + ' should return 404, got ' + response.statusCode);
            check();
          });
        })();
      });
    });
  });
  describe('receives a log file', function () {
    it('and correctly handles Job-Traces.log (@03)', function (done) {
      var headers = {
        'Accept' : 'application/json'
      };
      helpers.post('/', logFile, headers, function (err, res) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        var logURL = res.headers['job-traces'];
        should.exist(logURL,
          'The header "Job-Traces" was not sent by the server');

        helpers.get(logURL, function (error, response) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);
          done();
        });
      });
    });
  });
  describe('receives a log file with a bad line', function () {
    it('and correctly handles Lines-Unknown-Formats.log (@04)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'unknown-formats'
      };
      helpers.post('/', wrongSecondLineLogFile, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));

        var logURL = res.headers['lines-unknown-formats'];
        should.exist(logURL,
          'The header "Lines-Unknown-Formats" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          logBody = logBody.trim().split('\n');
          should.ok(logBody.length === 1, '1 line should be present in the log file');

          var logLine = fs.readFileSync(wrongSecondLineLogFile).toString().split('\n')[1];
          logBody[0].should.equal(logLine);
          done();
        });
      });
    });
  });
  describe('receives a log file with an ignored domain', function () {
    it('and correctly handles Lines-Ignored-Domains.log (@05)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'ignored-domains'
      };
      helpers.post('/', ignoredDomain, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);
        should.ok(body === '', 'The body is not empty');

        var logURL = res.headers['lines-ignored-domains'];
        should.exist(logURL,
          'The header "Lines-Ignored-Domains" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(ignoredDomain).toString().trim();
          logBody.trim().should.equal(logLine, 'The logfile and the input should be identical');
          done();
        });
      });
    });
  });
  describe('receives a log file with an unknown domain', function () {
    it('and correctly handles Lines-Unknown-Domains.log (@06)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'unknown-domains'
      };
      helpers.post('/', unknownDomain, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);
        should.ok(body === '', 'The body is not empty');

        var logURL = res.headers['lines-unknown-domains'];
        should.exist(logURL,
          'The header "Lines-Unknown-Domains" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(unknownDomain).toString().trim();
          logBody.trim().should.equal(logLine, 'The logfile and the input should be identical');
          done();
        });
      });
    });
  });
  describe('receives a log file with an unqualified log line', function () {
    it('and correctly handles Lines-Unqualified-ECs.log (@07)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'unqualified-ecs'
      };
      helpers.post('/', unqualifiedEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);
        should.ok(body === '', 'The body is not empty');

        var logURL = res.headers['lines-unqualified-ecs'];
        should.exist(logURL,
          'The header "Lines-Unqualified-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(unqualifiedEC).toString().trim();
          logBody.trim().should.equal(logLine, 'The logfile and the input should be identical');
          done();
        });
      });
    });
  });
  describe('receives a log file with duplicate consultations', function () {
    it('and correctly handles Lines-Duplicate-ECs.log (@09)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'duplicate-ecs'
      };
      helpers.post('/', duplicateEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));
        var logURL = res.headers['lines-duplicate-ecs'];

        should.exist(logURL,
          'The header "Lines-Duplicate-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(duplicateEC).toString().split('\n')[0].trim();
          logBody.trim().should.equal(logLine, 'The logfile should match the first line');
          done();
        });
      });
    });
  });
  describe('receives a log file with chronological errors', function () {
    it('and correctly handles Lines-Unordered-ECs.log (@10)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'unordered-ecs'
      };
      helpers.post('/', unorderedEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));
        var logURL = res.headers['lines-unordered-ecs'];

        should.exist(logURL,
          'The header "Lines-Unordered-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(unorderedEC).toString().split('\n')[1].trim();
          logBody.trim().should.equal(logLine, 'The logfile should match the second line');
          done();
        });
      });
    });
  });
  describe('receives a log file with chronological errors and Reject-File at none', function () {
    it('and does not handle Lines-Unordered-ECs.log (@11)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'none'
      };
      helpers.post('/', unorderedEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));
        var logURL = res.headers['lines-unordered-ecs'];

        should.exist(logURL,
          'The header "Lines-Unordered-ECs" was not sent by the server');
        should.exist(res.headers['job-id'],
          'The header "Job-ID" was not sent by the server');

        helpers.get(logURL, function (error, response) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.should.have.status(404);
          done();
        });
      });
    });
  });
  describe('receives a log file with denied access', function () {
    it('and correctly handles denied-ecs.csv (@12)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'none'
      };
      helpers.post('/', deniedEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        should.ok(body.length === 0, 'the response should be empty');

        var logURL = res.headers['denied-ecs'];
        should.exist(logURL,
          'The header "Denied-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          logBody = logBody.trim().split('\n');
          should.ok(logBody.length === 3, '3 lines should be present in the log file,'
            + ' got ' + logBody.length);
          done();
        });
      });
    });
  });
  describe('receives a log file with filtered lines', function () {
    it('and correctly handles Lines-Filtered-ECs.log (@13)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'filtered-ecs'
      };
      helpers.post('/', filteredEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));
        var logURL = res.headers['lines-filtered-ecs'];

        should.exist(logURL,
          'The header "Lines-Filtered-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(filteredEC).toString().split('\n')[1].trim();
          logBody.trim().should.equal(logLine, 'The logfile should match the second line');
          done();
        });
      });
    });
  });
  describe('recives a log file with lines filtered by default', function() {
    it('and does not filter them when ezPAARSE-Filter-Redirects is false (@14)', function (done) {
      var headers = {
        'ezPAARSE-Filter-Redirects' : 'false',
        'Accept' : 'text/csv'
      };
      helpers.post('/', filteredEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 3, '2 EC should be returned, got ' + (body.length - 1));
        done();
      });
    });
  });
  describe('receives a log file with a robot host', function () {
    it('and correctly handles Lines-Robots.log (@15)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'robots-ecs'
      };
      helpers.post('/', robotEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);
        should.ok(body === '', 'The body is not empty');

        var logURL = res.headers['lines-robots-ecs'];
        should.exist(logURL,
          'The header "Lines-Robots-ECs" was not sent by the server');

        helpers.get(logURL, function (error, response, logBody) {
          if (!response) { throw new Error('ezPAARSE is not running'); }
          if (error)     { throw error; }
          response.statusCode.should.equal(200,
            'couldn\'t get the logfile, server sent ' + response.statusCode);

          var logLine = fs.readFileSync(robotEC).toString().trim();
          logBody.trim().should.equal(logLine, 'The logfile and the input should be identical');
          done();
        });
      });
    });
    it('and produce an EC if the filter is disabled (@16)', function (done) {
      var headers = {
        'Accept' : 'text/csv',
        'Reject-Files': 'robots-ecs',
        'Disable-Filters': 'robots'
      };
      helpers.post('/', robotEC, headers, function (err, res, body) {
        if (!res) { throw new Error('ezPAARSE is not running'); }
        if (err)  { throw err; }
        res.statusCode.should.equal(200, 'expected 200, got ' + res.statusCode);

        body = body.trim().split('\n');
        should.ok(body.length === 2, '1 EC should be returned, got ' + (body.length - 1));

        done();
      });
    });
  });
});