Newer
Older
li-utils / test / run.js
/* global __dirname, require, process, it */

'use strict';

var
  pkg = require('../package.json'),
  myObject = require('../index.js'),
  docObject = require('./dataset/in/docObject.sample.json'),
  async = require('async'),
  chai = require('chai'),
  expect = chai.expect;

// Mapping indiquant quelle fonction de test utiliser lors de chaque test
var mapTests = {
  "selectAll": testOfFileRepresentation,
  "select": testOfFileRepresentation,
  "get": testOfFileRepresentation,
  "createPath": testOfCreateFilePath
}

// Données de test
var data = {
  "files": require('./dataset/in/test.files.json')
};

describe(pkg.name + '/index.js', function() {
  async.eachSeries(Object.keys(data.files), function(key, callback) {
    /**
     * Test de chaques fonctions :
     * - myObject.files.selectAll()
     * - myObject.files.select()
     * - myObject.files.get()
     * - myObject.files.createPath()
     */
    describe('#' + key + '()', function() {
      mapTests[key](data.files[key], myObject.files[key]);
    });
    callback();
  });
});

// Set une regex pour chaque clée demandée
function setRegex(keys, options) {
  for (var i = 0; i < keys.length; i++) {
    if (options instanceof Array) {
      for (var j = 0; j < options.length; j++) {
        options[j][keys[i]] = new RegExp(options[j][keys[i]]);
      }
    } else {
      options[keys[i]] = new RegExp(options[keys[i]]);
    }
  }
}

/** Fonction de test à appliquée pour :
 * - myObject.files.selectAll()
 * - myObject.files.select()
 * - myObject.files.get()
 */
function testOfFileRepresentation(values, testedFunction) {
  async.eachSeries(values, function(item, callback) {
    it(item.label, function(done) {
      // Transforme les string en regex si nécessaire
      if (item.regExp) {
        setRegex(item.regExp, item.options);
      }
      // Si on doit tester la longueur la valeur retournée
      if (item.result.length) {
        expect(testedFunction(docObject[item.container], item.options)).to.have.length(item.result.value);
        return done();
      }
      // Si on doit tester que la valeur retournée n'est pas égale à
      if (item.result.not) {
        expect(testedFunction(docObject[item.container], item.options)).to.not.equal(item.result.value);
        return done();
      }
      // Si on doit tester que la valeur retournée est pas égale à
      expect(testedFunction(docObject[item.container], item.options)).to.equal(item.result.value);
      return done();
    });
    callback();
  });
}

/** Fonction de test à appliquée pour :
 * - myObject.files.createPath()
 */
function testOfCreateFilePath(values, testedFunction) {
  async.eachSeries(values, function(item, callback) {
    it(item.label, function(done) {
      // Si on doit tester que la valeur retournée n'est pas égale à
      if (item.result.not) {
        expect(testedFunction(item.options)).to.not.equal(item.result.value);
        return done();
      }
      // Si on doit tester que la valeur retournée est pas égale à
      expect(testedFunction(item.options)).to.equal(item.result.value);
      return done();
    });
    callback();
  });
}