Home Manual Reference Source Test Repository

test/unit/collection/base.spec.js

/* eslint-disable no-new */
import assert from 'assert';
import sinon from 'sinon';
import _ from 'lodash';

import fixture from '../../fixture';

import CollectionBase from '../../../lib/collection/base';

describe('collection/base CollectionBase', () => {
  let sandbox;
  beforeEach(() => {
    sandbox = sinon.sandbox.create();
  });

  afterEach(() => {
    sandbox.restore();
  });

  describe('constructor', () => {
    it('throws when no collection name is given', () => {
      assert.throws(() => {
        new CollectionBase();
      }, /requires a name/);

      assert.throws(() => {
        new CollectionBase('');
      }, /requires a name/);
    });

    it('accepts a name and no config object', () => {
      const instance = new CollectionBase('name');

      assert.equal(instance.name, 'name');
      assert(_.isUndefined(instance.path));
      assert(_.isUndefined(instance.metadata));
      assert(_.isUndefined(instance.template));
      assert(_.isUndefined(instance.permalink));
      assert(_.isUndefined(instance.sort));
      assert(_.isUndefined(instance.pagination));
      assert(_.isUndefined(instance.files));
      assert(_.isUndefined(instance.excludePaths));
      assert(_.isUndefined(instance.metadataFiles));
      assert(_.isArray(instance.pages));
      assert.equal(instance.pages.length, 0);
      assert(_.isObject(instance.data));
    });
  });

  describe('isFiltered', () => {
    it('returns if a file in collection is filtered', () => {
      const instance = new CollectionBase('name');
      const file = {
        filtered: undefined,
      };

      assert.equal(instance.isFiltered(file), false);

      file.filtered = false;
      assert.equal(instance.isFiltered(file), false);

      file.filtered = true;
      assert.equal(instance.isFiltered(file), true);
    });
  });

  describe('sortFiles', () => {
    let files;

    const additionalData = [
      {
        number: 10,
        date: '2017-03-28',
      },
      {
        number: 1,
        date: '2013-09-08',
      },
      {
        number: 5,
        date: '2016-05-01',
      },
    ];
    beforeEach(() => {
      files = fixture.collectionFiles().map((file, index) => {
        _.extend(file.data, additionalData[index]);
        return file;
      });
    });

    it('sorts integer value descending', () => {
      const sortConfig = {
        key: 'number',
        order: 'descending',
      };

      assert.deepEqual(CollectionBase.sortFiles(files, sortConfig), [
        files[0],
        files[2],
        files[1],
      ]);
    });

    it('sorts integer value ascending', () => {
      const sortConfig = {
        key: 'number',
        order: 'ascending',
      };

      assert.deepEqual(CollectionBase.sortFiles(files, sortConfig), [
        files[1],
        files[2],
        files[0],
      ]);
    });

    it('sorts date value descending', () => {
      const sortConfig = {
        key: 'date',
        order: 'descending',
      };

      assert.deepEqual(CollectionBase.sortFiles(files, sortConfig), [
        files[0],
        files[2],
        files[1],
      ]);
    });

    it('sorts date value ascending', () => {
      const sortConfig = {
        key: 'date',
        order: 'ascending',
      };

      assert.deepEqual(CollectionBase.sortFiles(files, sortConfig), [
        files[1],
        files[2],
        files[0],
      ]);
    });
  });
});