/// export import mocha = require('../../test/mocha'); import r = require('./http/Response'); var expect = mocha.chai.expect; var spy = mocha.sinon.spy; var mock = mocha.mock; var rcsdk = mocha.rcsdk; describe('RCSDK.core.Helper', function() { 'use strict'; var Helper = rcsdk.getHelper(), defaultUrl = 'default', defaultSyncUrl = 'default-sync'; function attachSpy(suite) { suite.beforeEach(function() { this._createUrl = Helper.createUrl.bind(Helper); Helper.createUrl = spy(function(options) { options = options || {}; return (options.sync ? defaultSyncUrl : defaultUrl); }); }); suite.afterEach(function() { Helper.createUrl = this._createUrl; }); } describe('getId', function() { it('return value of object.id', function() { expect(Helper.getId({id: 'foo'})).to.equal('foo'); expect(Helper.getId({})).to.be.an('undefined'); }); }); describe('isNew', function() { it('returns true if object does not have id or url', function() { expect(Helper.isNew({id: 'foo'})).to.equal(true); expect(Helper.isNew({uri: 'foo'})).to.equal(true); expect(Helper.isNew({})).to.equal(true); expect(Helper.isNew({id: 'foo', uri: 'bar'})).to.equal(false); }); }); describe('loadRequest', function() { attachSpy(this); it('provides given url, if not - object.url, if not - default url', function() { expect(Helper.loadRequest({uri: 'object-uri'}, {url: 'given-url'}).url).to.equal('given-url'); expect(Helper.loadRequest(null, {url: 'given-url'}).url).to.equal('given-url'); expect(Helper.loadRequest({uri: 'object-uri'}).url).to.equal('object-uri'); expect(Helper.loadRequest().url).to.equal(defaultUrl); expect(Helper.createUrl).to.be.calledOnce; }); }); describe('saveRequest', function() { attachSpy(this); it('provides given url, if not - object.url, if not - default url', function() { expect(Helper.saveRequest({uri: 'object-uri'}, {url: 'given-url'}).url).to.equal('given-url'); expect(Helper.saveRequest({uri: 'object-uri'}).url).to.equal('object-uri'); expect(Helper.saveRequest({}, {}).url).to.equal(defaultUrl); expect(Helper.createUrl).to.be.calledOnce; }); it('throws exceptions if no object is provided', function() { expect(function() { Helper.saveRequest(); }).to.throw(Error); }); }); describe('deleteRequest', function() { attachSpy(this); it('provides given url, if not - object.url, if not - exception', function() { expect(Helper.deleteRequest({uri: 'object-uri'}, {url: 'given-url'}).url).to.equal('given-url'); expect(Helper.deleteRequest({uri: 'object-uri'}).url).to.equal('object-uri'); expect(function() { Helper.deleteRequest({}); }).to.throw(Error); }); it('throws exceptions if no object is provided', function() { expect(function() { Helper.deleteRequest(); }).to.throw(Error); }); }); describe('syncRequest', function() { attachSpy(this); it('provides default sync url if nothing was given', function() { expect(Helper.syncRequest({url: 'given-url'}).url).to.equal('given-url'); expect(Helper.syncRequest().url).to.equal(defaultSyncUrl); expect(Helper.createUrl).to.be.calledOnce; }); it('sets syncType to FSync if no syncToken was given', function() { expect(Helper.syncRequest().query.syncType).to.equal('FSync'); }); it('sets syncType to ISync if syncToken was given and deletes all other options.get', function() { var options = { get: { syncToken: 'foo', foo: 'foo' } }, request = Helper.syncRequest(options); expect(request.query.foo).to.be.an('undefined'); expect(request.query.syncType).to.equal('ISync'); expect(request.query.syncToken).to.equal(options.get.syncToken); }); }); describe('index', function() { it('creates an indexed object of given array items', function() { var array = [ {id: 'foo', name: 'foo'}, {id: 'bar', name: 'bar'} ], index = Helper.index(array); expect(index.foo).to.equal(array[0]); expect(index.bar).to.equal(array[1]); }); it('creates an indexed object using given getId callback of given array items', function() { // array items should not have name property to ensure test is real var array = [ {name: 'foo'}, {name: 'bar'} ], index = Helper.index(array, function(item:any) { return item.name; }); expect(index.foo).to.equal(array[0]); expect(index.bar).to.equal(array[1]); }); it('if two or more items have same id the first wins by default', function() { var array = [ {id: 'foo', name: 'foo'}, {id: 'foo', name: 'bar'} ], index = Helper.index(array); expect(index.foo).to.equal(array[0]); expect(Object.keys(index)).to.deep.equal(['foo']); expect(Object.keys(index).length).to.equal(1); }); it('if two or more items have same id resulting index will contain an array of them if flag is provided', function() { var array = [ {id: 'foo', name: 'foo'}, {id: 'foo', name: 'bar'} ], index = Helper.index(array, null, true); expect(index.foo).to.deep.equal(array); expect(Object.keys(index)).to.deep.equal(['foo']); expect(Object.keys(index).length).to.equal(1); }); it('if items do not have id resulting index will not contain them', function() { var array = [ {id: 'foo', name: 'foo'}, {name: 'bar'} ], index = Helper.index(array); expect(index.foo).to.equal(array[0]); expect(Object.keys(index)).to.deep.equal(['foo']); expect(Object.keys(index).length).to.equal(1); }); }); describe('merge', function() { it('replaces target items with supplement ones if they same ids, original target items stay untouched', function() { var target = [ {id: 'foo', name: 'foo'}, {id: 'bar', name: 'bar'} ], supplement = [ {id: 'foo', name: 'foo-x'} ], merged = Helper.merge(target, supplement); // merged first item belongs to supplement expect(merged[0]).to.equal(supplement[0]); // target item is not in merged array expect(merged.indexOf(target[0])).to.equal(-1); expect(merged[0].id).to.equal('foo'); expect(merged[0].name).to.equal('foo-x'); // target item stays untouched expect(target[0].name).to.equal('foo'); expect(merged.length).to.equal(2); }); it('applies properties of supplement to target items if they have same ids (target items are mutated)', function() { var target = [ {id: 'foo', name: 'foo'}, {id: 'bar', name: 'bar'} ], supplement = [ {id: 'foo', name: 'foo-x'} ], merged = Helper.merge(target, supplement, null, true); // merged first item belongs to target expect(merged[0]).to.not.equal(supplement[0]); expect(merged[0]).to.equal(target[0]); // merged item has new properties and proper id expect(merged[0].id).to.equal('foo'); expect(merged[0].name).to.equal('foo-x'); // target item was mutated expect(target[0].name).to.equal('foo-x'); expect(merged.length).to.equal(2); }); it('allows to provide custom getId function)', function() { var target = [ {id: 'foo', name: 'foo'}, {id: 'bar', name: 'bar'} ], supplement = [ {id: 'foo-x', name: 'foo'} ], merged = Helper.merge(target, supplement, function(item:any) { return item.name; }); // merged first item belongs to supplement expect(merged[0]).to.equal(supplement[0]); // target item is not in merged array expect(merged.indexOf(target[0])).to.equal(-1); // merged item has new properties and proper id expect(merged[0].name).to.equal('foo'); expect(merged[0].id).to.equal('foo-x'); // target item stays untouched expect(target[0].id).to.equal('foo'); expect(merged.length).to.equal(2); }); it('appends supplement', function() { var target = [ {id: 'foo', name: 'foo'}, {id: 'bar', name: 'bar'} ], supplement = [ {id: 'foo-x', name: 'foo'} ], merged = Helper.merge(target, supplement); expect(merged.length).to.equal(3); expect(merged[2].name).to.equal('foo'); expect(merged[2].id).to.equal('foo-x'); }); }); describe('parseMultipartResponse', function() { it('evaluates multipart response', function() { var ajax = { isMultipart: function() { return true; }, data: [ {data: 'foo'}, {data: 'bar'}, {error: new Error('this is skipped')} ] }; var items = Helper.parseMultipartResponse(ajax); expect(ajax.isMultipart()).to.equal(true); expect(items).to.deep.equal(['foo', 'bar']); expect(items.length).to.equal(2); }); it('evaluates one-item response', function() { var ajax = r.$get(rcsdk.getContext(), 200, 'OK', {foo: 'foo'}), items = Helper.parseMultipartResponse(ajax); expect(items).to.deep.equal([{foo: 'foo'}]); expect(items.length).to.equal(1); }); }); });