var sanitizeAll = require('../../../sanitizer/sanitizeAll');

module.exports.tests = {};

module.exports.tests.all = function(test, common) {
  test('req.clean/errors/warnings should be initialized when they are not', function(t) {
    var req = {};
    var sanitizers = [
      function() {
        req.clean.a = 'first sanitizer';
        return {
          errors: ['error 1', 'error 2'],
          warnings: ['warning 1', 'warning 2']
        };
      },
      function() {
        req.clean.b = 'second sanitizer';
        return {
          errors: ['error 3'],
          warnings: ['warning 3']
        };
      }
    ];

    var expected_req = {
      clean: {
        a: 'first sanitizer',
        b: 'second sanitizer'
      },
      errors: ['error 1', 'error 2', 'error 3'],
      warnings: ['warning 1', 'warning 2', 'warning 3']
    };

    sanitizeAll(req, sanitizers, function(){
      t.deepEquals(req, expected_req);
      t.end();
    });

  });

  test('req.clean/errors/warnings should not be initialized when they already have been', function(t) {
    var req = {
      clean: {
        alreadyInitialized: true
      },
      errors: ['pre-existing error'],
      warnings: ['pre-existing warning']
    };

    var sanitizers = [
      function() {
        req.clean.a = 'first sanitizer';
        return {
          errors: ['error 1', 'error 2'],
          warnings: ['warning 1', 'warning 2']
        };
      },
      function() {
        req.clean.b = 'second sanitizer';
        return {
          errors: ['error 3'],
          warnings: ['warning 3']
        };
      }
    ];

    var expected_req = {
      clean: {
        alreadyInitialized: true,
        a: 'first sanitizer',
        b: 'second sanitizer'
      },
      errors: ['pre-existing error', 'error 1', 'error 2', 'error 3'],
      warnings: ['pre-existing warning', 'warning 1', 'warning 2', 'warning 3']
    };

    sanitizeAll(req, sanitizers, function(){
      t.deepEquals(req, expected_req);
      t.end();
    });

  });

  test('req.query should be passed to individual sanitizers when available', function(t) {
    var req = {
      query: {
        value: 'query value'
      }
    };
    var sanitizers = [
      function(params) {
        req.clean.query = params;
        return {
          errors: [],
          warnings: []
        };
      }
    ];

    var expected_req = {
      query: {
        value: 'query value'
      },
      clean: {
        query: {
          value: 'query value'
        }
      },
      errors: [],
      warnings: []
    };

    sanitizeAll(req, sanitizers, function(){
      t.deepEquals(req, expected_req);
      t.end();
    });

  });

  test('an empty object should be passed to individual sanitizers when req.query is unavailable', function(t) {
    var req = {};
    var sanitizers = [
      function(params) {
        if (Object.keys(params).length === 0) {
          req.clean.empty_object_was_passed = true;
        }

        return {
          errors: [],
          warnings: []
        };
      }
    ];

    var expected_req = {
      clean: {
        empty_object_was_passed: true
      },
      errors: [],
      warnings: []
    };

    sanitizeAll(req, sanitizers, function(){
      t.deepEquals(req, expected_req);
      t.end();
    });

  });

};

module.exports.all = function (tape, common) {

  function test(name, testFunction) {
    return tape('SANITIZE sanitizeAll ' + name, testFunction);
  }

  for( var testCase in module.exports.tests ){
    module.exports.tests[testCase](test, common);
  }
};