Home Reference Source Test

specs/object.spec.js

import chai, { assert, expect } from 'chai';

import * as ObjLib from '../src/Object';


/** @test {Object} */
describe('Object Library Tests', () => {

    /** @test {Object#deepFreeze} */
    it('test: .deepFreeze(obj)', () => {
      let obj = {
        internal: {
          b: 'Hello'
        }
      };

      ObjLib.deepFreeze(obj);

      expect(() => {
        obj.internal.a = 'some value';
      }).to.throw(chai.TypeError, /Cannot add property a, object is not extensible/);

      expect(() => {
        obj.internal.b = 'Hi';
      }).to.throw(chai.TypeError, /Cannot assign to read only property \'b\' of object \'#<Object>\'/);

    });

    /** @test {Object#cloneObject} */
    it('test: .cloneObject(objectToClone)', () => {
      let obj = {}
        , obj2 = obj;

      assert.equal(obj, obj2);
      assert.notEqual(obj, ObjLib.cloneObject(obj));
    });

    /** @test {Object#deepClone} */
    it('test: .deepClone(objectToDeepClone)', () => {
      let obj = { a: { b: { c: [ { name: 'Oleh' } ] } } };

      let copy = ObjLib.deepClone(obj);
      assert.equal(obj.a.b.c[0].name, copy.a.b.c[0].name);
      assert.notEqual(obj.a.b, copy.a.b);
      assert.notEqual(obj.a.b.c, copy.a.b.c);
      assert.deepEqual(obj, copy);

      copy.a.b.c[0].name = 'Updated Name';
      assert.notEqual(obj.a.b.c[0].name, 'Updated Name');
      assert.equal(obj.a.b.c[0].name, 'Oleh');


    });

    /** @test {Object#pick} */
    it('test: .pick(source, ...pickArray)', () => {
      let user = {
        name: 'Oleh',
        age: 29,
        profession: 'dev'
      };

      expect(ObjLib.pick(user, 'name', 'age')).to.deep.equal({name: 'Oleh', age: 29});
    });

    /** @test {Object#omit} */
    it('test: .omit(source, ...omitArray)', () => {
      let user = {
        name: 'Oleh',
        age: 29,
        profession: 'dev'
      };

      expect(ObjLib.omit(user, 'name', 'age')).to.deep.equal({profession: 'dev'});
    });

    /** @test {Object#safeGet} */
    it('test: .safeGet(obj, ...props)', () => {
      let user1 = {name: 'Oleh', address: {zip: 123}}
        , user2 = {name: 'Oleh'};

      assert.equal(ObjLib.safeGet(user1, 'address', 'zip'), 123);
      assert.isUndefined(ObjLib.safeGet(user2, 'address', 'zip'));
    });

    /** @test {Object#safeGetOr} */
    it('test: .safeGetOr(obj, orValue, ...props)', () => {
      let user1 = {name: 'Oleh', address: {zip: 123}};

      assert.equal(ObjLib.safeGetOr(user1, 'no zip available', 'address', 'zip'), 123);
      assert.equal(ObjLib.safeGetOr(user1, 'no zip available', 'address', 'zip', 'previous'), 'no zip available');
    });

    /** @test {Object#safeGet} */
    it('test: .safeGet(obj, ...props) with array', () => {
      let array =
        [
          [ [ 23, 1 ] ],
          [1],
          { name: ['John', 'Liza'] }
        ];
      assert.equal(ObjLib.safeGet(array, 0, 0, 0), 23);
      assert.equal(ObjLib.safeGet(array, 2, 'name', 1), 'Liza');
      assert.isUndefined(ObjLib.safeGet(array, 3, 1));
    });

    /** @test {Object#safeGetOr} */
    it('test: .safeGetOr(obj, orValue, ...props) with array', () => {
      let array =
        [
          [ [ 23, 1 ] ],
          [1],
          { name: ['John', 'Liza'] }
        ];
      assert.equal(ObjLib.safeGetOr(array, 'no value', 0, 0, 0), 23);
      assert.equal(ObjLib.safeGetOr(array, 'no value', 0, 0, 0, 10), 'no value');
    });

    /** @test {Object#getWithProps} */
    it('test: .getWithProps(obj, ...props)', () => {
      let user1 = {name: 'Oleh', address: {zip: 123}}
        , user2 = {name: 'Oleh'}
        , getZip = ObjLib.getWithProps('address', 'zip');

      assert.equal(getZip(user1), 123);
      assert.isUndefined(getZip(user2));
    });

    /** @test {Object#getWithCtx} */
    it('test: .getWithCtx(obj, ...props)', () => {
      let user1 = {name: 'Oleh', address: {zip: 123}}
        , user2 = {name: 'Oleh'}
        , getFromUser1 = ObjLib.getWithCtx(user1)
        , getFromUser2 = ObjLib.getWithCtx(user2);

      assert.equal(getFromUser1('address', 'zip'), 123);
      assert.isUndefined(getFromUser2('address', 'zip'));
    });

    /** @test {Object#objectProjection} */
    it('test: .objectProjection(obj, cb, skipCb = (...args) => args) ', () => {
      assert.deepEqual(
        ObjLib.objectProjection({a: 3, b: 7, c: () => {}}, (k, v) => `${k}=${v}`),
        ['a=3', 'b=7', 'c=function c() {}']);

      assert.deepEqual(
        ObjLib.objectProjection({a: 3, b: 7, c: () => {}}, (k, v) => `${k}=${v}`, (k, v) => typeof v !== 'function'),
        [ 'a=3', 'b=7' ]);
    });

    /** @test {Object#conformsTo} */
    it('test: conformsTo(object, predicateSetModel)', () => {
      let given = { b: 1, a: 'Hello' }
        , actual1 = ObjLib.conformsTo(given, { b: n => n === 1, a: n => n === 'Hello' })
        , actual2 = ObjLib.conformsTo(given, { b: n => n === 1, a: n => n === 'NOT-Hello' });

      assert.isTrue(actual1);
      assert.isFalse(actual2);
    });

    /** @test {Object@deepEquals} */
    it('deepEquals(first, second)', () => {
      assert.isTrue(ObjLib.deepEquals(
        [
          { id: 1, firstName: 'Jon', lastName: 'Snow', gender: 'm', age: 14, location: 'Winterfell' },
          { id: 2, firstName: 'Eddard', lastName: 'Stark', gender: 'm', age: 35, location: 'Winterfell' },
          { id: 3, firstName: 'Catelyn', lastName: 'Stark', gender: 'f', age: 33, location: 'Winterfell' },
          { id: 4, firstName: 'Roose', lastName: 'Bolton', gender: 'm', age: 40, location: 'Dreadfort' },
          { id: 5, firstName: 'Ramsay', lastName: 'Snow', gender: 'm', age: 15, location: 'Dreadfort' }
        ],
        [
          { id: 1, firstName: 'Jon', lastName: 'Snow', gender: 'm', age: 14, location: 'Winterfell' },
          { id: 2, firstName: 'Eddard', lastName: 'Stark', gender: 'm', age: 35, location: 'Winterfell' },
          { id: 3, firstName: 'Catelyn', lastName: 'Stark', gender: 'f', age: 33, location: 'Winterfell' },
          { id: 4, firstName: 'Roose', lastName: 'Bolton', gender: 'm', age: 40, location: 'Dreadfort' },
          { id: 5, firstName: 'Ramsay', lastName: 'Snow', gender: 'm', age: 15, location: 'Dreadfort' }
        ]
      ));

      assert.isFalse(ObjLib.deepEquals(
        [
          { id: 1, firstName: 'Jon', lastName: 'Snow', gender: 'm', age: 14, location: 'Winterfell' },
          { id: 2, firstName: 'Eddard', lastName: 'Stark', gender: 'm', age: 35, location: 'Winterfell' },
          { id: 3, firstName: 'Catelyn', lastName: 'Stark', gender: 'f', age: 33, location: 'Winterfell' },
          { id: 4, firstName: 'Roose', lastName: 'Bolton', gender: 'm', age: 40, location: 'Dreadfort' },
          { id: 5, firstName: 'Ramsay', lastName: 'Snow', gender: 'm', age: 15, location: 'Dreadfort' }
        ],
        [
          { id: 1, firstName: 'Jon', lastName: 'Snow', gender: 'm', age: 14, location: 'Winterfell' },
          { id: 2, firstName: 'Eddard', lastName: 'Stark', gender: 'm', age: 35, location: 'Winterfell' },
          { id: 3, firstName: 'Catelyn', lastName: 'Stark', gender: 'f', age: 33, location: 'Winterfell' },
          { id: 4, firstName: 'Roose', lastName: 'Bolton', gender: 'm', age: 40, location: 'Dreadfort' },
          { id: 5, firstName: 'Ramsay. Not same here!', lastName: 'Snow', gender: 'm', age: 15, location: 'Dreadfort' }
        ]
      ));
    });
});