UNPKG

@harishreddym/baqend

Version:

Baqend JavaScript SDK

895 lines (758 loc) 26.9 kB
'use strict'; var DB; if (typeof module !== 'undefined') { require('./node'); DB = require('../lib'); } describe('Test entity type', function () { var em, emf, EntityClass, EmbeddedClass, obj, state, metamodel, EntityType, EmbeddedType, types; emf = new DB.EntityManagerFactory({ schema: [], tokenStorage: {} /* will later be set in the before handler */}); metamodel = emf.metamodel; EntityType = new DB.metamodel.EntityType('jstest.Type', metamodel.entity(Object)); EmbeddedType = new DB.metamodel.EmbeddableType('jstest.Embedded'); types = { // values used for collection tests boolean: { type: metamodel.baseType('Boolean'), simple: true, values: [true, false] }, float: { type: metamodel.baseType('Double'), simple: true, values: [-2.3, 4] }, integer: { type: metamodel.baseType('Integer'), simple: true, values: [0, -4, 56] }, string: { type: metamodel.baseType('String'), simple: true, values: ['', 'Test String'] }, time: { type: metamodel.baseType('Time'), simple: true, values: [new Date('1970-01-01T00:00:00Z'), new Date('1970-01-01T17:33:14Z')] }, date: { type: metamodel.baseType('Date'), simple: true, values: [new Date('1970-01-01T00:00:00Z'), new Date('2013-11-22T00:00:00Z')] }, dateTime: { type: metamodel.baseType('DateTime'), simple: true, values: [new Date(), new Date('1970-01-01T17:33:14Z')] }, file: { type: metamodel.baseType('File'), simple: false, values: function () { return [new em.File(), new em.File('/file/www/index.html'), new em.File('/file/test/myFile.png')]; } }, geoPoint: { type: metamodel.baseType('GeoPoint'), values: [new DB.GeoPoint(34.5658, 110.4576), new DB.GeoPoint(0, 0)] }, jsonArray: { type: metamodel.baseType('JsonArray'), values: [[1, 'string', { key: 'value' }, [1, 2, 3]], [], [null, 0, false, '', [], {}]] }, jsonObject: { type: metamodel.baseType('JsonObject'), values: [ { k1: 1, k2: 'string', k3: { key: 'value' }, k4: [1, 2, 3], }, {}, { k1: 3.4, k2: 0, k3: false, k4: '', k5: [], k6: {}, }, ], }, }; Object.keys(types).forEach(function (name) { var vals = types[name].values; if (Array.isArray(vals)) { types[name].values = function () { return vals; }; } }); var TYPES = [EntityType, EmbeddedType]; for (var i = 0; i < TYPES.length; i += 1) { var type = TYPES[i]; for (var name1 in types) { type.addAttribute(new DB.metamodel.SingularAttribute(name1, types[name1].type)); } type.addAttribute(new DB.metamodel.SingularAttribute('ref', EntityType)); type.addAttribute(new DB.metamodel.SingularAttribute('embedded', EmbeddedType)); for (var name2 in types) { type.addAttribute(new DB.metamodel.ListAttribute(name2 + 'List', types[name2].type)); } type.addAttribute(new DB.metamodel.ListAttribute('refList', EntityType)); type.addAttribute(new DB.metamodel.ListAttribute('embeddedList', EmbeddedType)); for (var name3 in types) { if (types[name3].simple) { type.addAttribute(new DB.metamodel.SetAttribute(name3 + 'Set', types[name3].type)); } } type.addAttribute(new DB.metamodel.SetAttribute('refSet', EntityType)); for (var name4 in types) { type.addAttribute(new DB.metamodel.MapAttribute('simple' + name4 + 'Map', metamodel.baseType('String'), types[name4].type)); if (types[name4].simple) { type.addAttribute(new DB.metamodel.MapAttribute(name4 + 'simpleMap', types[name4].type, metamodel.baseType('String'))); } } type.addAttribute(new DB.metamodel.MapAttribute('simpleRefMap', metamodel.baseType('String'), EntityType)); type.addAttribute(new DB.metamodel.MapAttribute('refSimpleMap', EntityType, metamodel.baseType('String'))); type.addAttribute(new DB.metamodel.MapAttribute('refMap', EntityType, EntityType)); type.addAttribute(new DB.metamodel.MapAttribute('simpleEmbeddedMap', metamodel.baseType('String'), EmbeddedType)); type.addAttribute(new DB.metamodel.MapAttribute('dateTimeEmbeddedMap', metamodel.baseType('DateTime'), EmbeddedType)); } metamodel.addType(EntityType); metamodel.addType(EmbeddedType); before(function () { emf.tokenStorage = helper.rootTokenStorage; return emf.connect(env.TEST_SERVER).then(function () { return metamodel.save(); }).then(function () { return emf.createEntityManager(); }).then(function (entityManager) { em = entityManager; EntityClass = em['jstest.Type']; EmbeddedClass = em['jstest.Embedded']; }); }); beforeEach(function () { obj = new EntityClass(); state = DB.util.Metadata.get(obj); }); function testObject() { var obj = EntityType.create(); setValues(obj); return obj; } function embeddableObject() { var obj = EmbeddedType.create(); setValues(obj); return obj; } function setValues(obj) { for (var prop in obj) { if (Object.hasOwnProperty.call(obj) && prop !== 'id') { obj[prop] = null; } } obj.boolean = true; obj.float = 1.1; obj.integer = 45; obj.string = 'myString'; } describe('boolean value', function () { test('boolean', false, true, ['test', true], [3, true], [{}, true], [[], true]); }); describe('float value', function () { test('float', 0.0, 42.42, 42); }); describe('integer value', function () { test('integer', 0, 42); }); describe('string value', function () { test('string', '', 'Test String', 'String', null); }); describe('time value', function () { test('time', new Date(0), new Date('1970-01-01T17:33:14+05:00'), [new Date('1970-01-01T17:33:14-08:00'), new Date('1970-01-01T01:33:14Z')], new Date('1970-01-01T17:33:14Z')); }); describe('date value', function () { test('date', new Date(0), new Date('2013-11-22T00:00Z'), new Date('2013-11-22T00:00Z'), new Date('0000-01-01T00:00Z')); }); describe('dateTime value', function () { test('dateTime', new Date(0), new Date(), new Date('0000-01-01T00:00:00Z')); }); describe('file value', function () { test('file'); it('should convert file references to ids', function () { var ref = new em.File('/file/test/myFile.png'); obj.file = ref; var json = state.getJson(); expect(ref.id).contain('/file/'); expect(json.file).be.ok; expect(json.file).equals(ref.id); state.setJson(json); expect(obj.file).equals(ref); }); it('should convert file ids to file references', function () { var ref = new em.File('/file/test/myFile.png'); obj.file = ref; return obj.save().then(function () { obj.file = null; return obj.load({ refresh: true }); }).then(function () { expect(obj.file.id).equals(ref.id); expect(obj.file).not.equal(ref); expect(obj.file instanceof em.File).to.be.true; expect(obj.file.url).contains('/file/test/myFile.png'); }); }); }); describe('geoPoint value', function () { test('geoPoint', new DB.GeoPoint(), new DB.GeoPoint(34.5658, 110.4576), new DB.GeoPoint(-45.67, -177.45)); }); describe('jsonObject value', function () { test('jsonObject', {}, { key: 'value', num: 1, arr: [1, 2, 3] }, [[], null]); }); describe('jsonArray value', function () { test('jsonArray', [[], []], [[1, 'test', { key: 'value' }], [1, 'test', { key: 'value' }]], [{}, null]); }); describe('ref value', function () { test('ref', EntityType.create(), testObject(), [{}, null]); it('should convert references to ids', function () { var ref = testObject(); obj.ref = ref; var json = state.getJson(); expect(ref.id).contain('/db/'); expect(json.ref).be.ok; expect(json.ref).equals(ref.id); state.setJson(json); expect(obj.ref).equals(ref); }); }); describe('embedded value', function () { test('embedded', EmbeddedType.create(), embeddableObject(), [{}, null]); }); Object.keys(types).forEach(function (name) { describe(name + 'List value', function () { testList(name + 'List', function () { return DB.List.from(types[name].values()); }); }); }); describe('refList value', function () { testList('refList', function () { return new DB.List(testObject(), testObject(), null, testObject()); }); }); describe('embeddedList value', function () { testList('embeddedList', function () { return new DB.List(embeddableObject(), embeddableObject(), null, embeddableObject()); }); }); Object.keys(types).forEach(function (name) { if (types[name].simple) { describe(name + 'Set value', function () { testSet(name + 'Set', function () { return new DB.Set(types[name].values()); }); }); } }); describe('refSet value', function () { testSet('refSet', function () { return new DB.Set([testObject(), null, testObject(), testObject()]); }); }); describe('simpleMap value', function () { testMap('simplebooleanMap', function () { return new DB.Map([ ['Test', true], ['String', false], ]); }); }); Object.keys(types).forEach(function (name) { describe('simple' + name + 'Map value', function () { testMap('simple' + name + 'Map', function () { var map = new DB.Map(); var vals = types[name].values(); for (var i = 0; i < vals.length; i += 1) { map.set('key' + i, vals[i]); } return map; }); }); if (types[name].simple) { describe(name + 'simpleMap value', function () { testMap(name + 'simpleMap', function () { var keys = types[name].values(); var map = new DB.Map(); for (var i = 0; i < keys.length; i += 1) { map.set(keys[i], 'value' + i); } return map; }); }); } }); describe('simpleRefMap value', function () { // null values should be removed testMap('simpleRefMap', function () { return new DB.Map([ ['Test', testObject()], ['String', testObject()], ['123', testObject()], ]); }); it('should remove null values', function () { var map2 = new DB.Map([ ['Test', testObject()], ['String', testObject()], ['123', testObject()], ]); map2.set('null', null); obj.simpleRefMap = map2; return obj.save({ refresh: true }).then(function () { expect(obj.simpleRefMap.size).eqls(3); expect(obj.simpleRefMap.has('null')).be.false; }); }); }); describe('refSimpleMap value', function () { testMap('refSimpleMap', function () { return new DB.Map([ [testObject(), 'value1'], [testObject(), 'value2'], ]); }); it('should remove null values', function () { var nullKey = testObject(); var map2 = new DB.Map([ [testObject(), 'value1'], [testObject(), 'value2'], ]); map2.set(nullKey, null); obj.refSimpleMap = map2; return obj.save({ refresh: true }).then(function () { expect(obj.refSimpleMap.size).eqls(2); expect(obj.refSimpleMap.has(nullKey)).be.false; }); }); }); describe('refMap value', function () { testMap('refMap', function () { return new DB.Map([ [testObject(), testObject()], [testObject(), testObject()], ]); }); it('should remove null values', function () { var nullKey = testObject(); var map2 = new DB.Map([ [testObject(), testObject()], [testObject(), testObject()], ]); map2.set(nullKey, null); obj.refMap = map2; return obj.save({ refresh: true }).then(function () { expect(obj.refMap.size).eqls(2); expect(obj.refMap.has(nullKey)).be.false; }); }); }); describe('simpleEmbeddedMap value', function () { testMap('simpleEmbeddedMap', function () { return new DB.Map([ ['Test', embeddableObject()], ['String', embeddableObject()], ]); }); it('should keep embedded identity', function () { var map1 = new DB.Map([ ['Test', embeddableObject()], ['String', embeddableObject()], ]); obj.simpleEmbeddedMap = new DB.Map(map1); return obj.save({ refresh: true }).then(function () { var mapValue = obj.simpleEmbeddedMap; expect(mapValue.get('Test')).equal(map1.get('Test')); expect(mapValue.get('String')).equal(map1.get('String')); }); }); it('should remove null values', function () { var nullKey = '123'; var map2 = new DB.Map([ ['Test', embeddableObject()], ['String', embeddableObject()], ]); map2.set(nullKey, null); obj.simpleEmbeddedMap = map2; return obj.save({ refresh: true }).then(function () { expect(obj.simpleEmbeddedMap.size).eqls(2); expect(obj.simpleEmbeddedMap.has(nullKey)).be.false; }); }); }); describe('dateTimeEmbeddedMap value', function () { testMap('dateTimeEmbeddedMap', function () { return new DB.Map([ [new Date('1970-01-01T00:00Z'), embeddableObject()], [new Date(), embeddableObject()], ]); }); it('should keep embedded identity', function () { var map1 = new DB.Map([ [new Date('1970-01-01T00:00Z'), embeddableObject()], [new Date(), embeddableObject()], ]); obj.dateTimeEmbeddedMap = new DB.Map(map1); return obj.save({ refresh: true }).then(function () { var mapValue = obj.dateTimeEmbeddedMap; expect(mapValue.get('Test')).equal(map1.get('Test')); expect(mapValue.get('String')).equal(map1.get('String')); }); }); it('should remove null values', function () { var nullKey = new Date('2015-01-01T00:00Z'); var map2 = new DB.Map([ [new Date('1970-01-01T00:00Z'), embeddableObject()], [new Date(), embeddableObject()], ]); map2.set(nullKey, null); obj.dateTimeEmbeddedMap = map2; return obj.save({ refresh: true }).then(function () { expect(obj.dateTimeEmbeddedMap.size).eqls(2); expect(obj.dateTimeEmbeddedMap.has(nullKey)).be.false; }); }); }); /** * @param {String} name field the name of the field to test * @param {Object[]|Object...} values values to test for */ function test(name) { it('should save undefined as null', function () { var obj = new EntityClass(); obj[name] = undefined; return obj.save({ refresh: true }).then(function () { expect(obj[name]).be.null; }); }); it('should save null properly', function () { var obj = new EntityClass(); obj[name] = null; return obj.save({ refresh: true }).then(function () { expect(obj[name]).be.null; }); }); var args = Array.prototype.slice.call(arguments, 1); args.forEach(function (arg) { var expectedValue, value; if (arg instanceof Array) { value = arg[0]; expectedValue = arg[1]; } else { value = arg; expectedValue = value; } it(value + ' should be saved and reloaded', function () { obj[name] = value; return obj.save({ refresh: true }).then(function () { expect(obj[name]).eql(expectedValue); }); }); }); } function testList(name, listProvider) { var list; test(name); before(function () { list = listProvider(); }); it('should be saved with an empty list', function () { obj[name] = new DB.List(); return obj.save({ refresh: true }).then(function () { var list = obj[name]; expect(list.length).eql(0); }); }); it('should add values', function () { obj[name] = DB.List.from(list); return obj.save().then(function () { obj[name].splice(0, obj[name].length); expect(obj[name].length).eql(0); return obj.load({ refresh: true }); }).then(function () { var newList = obj[name]; expect(newList.length).eql(list.length); for (var i = 0; i < list.length; i += 1) { expect(newList[i]).eql(list[i]); } }); }); it('should remove values', function () { var newList = DB.List.from(list); obj[name] = newList; var json = state.getJson(); json[name] = []; state.setJson(json); expect(newList.length).eq(0); }); it('should track removes', function () { obj[name] = DB.List.from(list); var version = 0; return obj.save().then(function () { obj[name].pop(); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newList = obj[name]; expect(obj.version).eql(version + 1); expect(newList.length).eql(list.length - 1); for (var i = 0; i < list.length - 1; i += 1) { expect(newList[i]).eql(list[i]); } }); }); it('should save empty list', function () { obj[name] = DB.List.from(list); var version = 0; return obj.save().then(function () { obj[name] = []; version = obj.version; return obj.save(); }).then(function () { return obj.load({ refresh: true }); }).then(function (obj) { var newList = obj[name]; expect(obj.version).eql(version + 1); expect(newList.length).eql(0); }); }); it('should track adds', function () { obj[name] = new DB.List(); var version = 0; return obj.save().then(function () { obj[name].push(list[0]); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newList = obj[name]; expect(obj.version).eql(version + 1); expect(newList.length).eql(1); expect(newList[0]).eql(list[0]); }); }); it('should track changes', function () { obj[name] = [list[0]]; var version = 0; return obj.save().then(function () { obj[name][0] = list[1]; version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newList = obj[name]; expect(obj.version).eql(version + 1); expect(newList.length).eql(1); expect(newList[0]).eql(list[1]); }); }); it('should not track none changes', function () { obj[name] = DB.List.from(list); var version = 0; return obj.save().then(function () { version = obj.version; obj[name][0] = list[0]; return obj.save({ refresh: true }); }).then(function () { expect(obj.version).eql(version); }); }); it('should be saved and reloaded', function () { var value = DB.List.from(list); var expectedValue = DB.List.from(value); obj[name] = value; return obj.save({ refresh: true }).then(function () { var list = obj[name]; var len = expectedValue.length; expect(list.length).eql(len); for (var i = 0; i < len; i += 1) { expect(list[i]).eql(expectedValue[i]); } }); }); } function testSet(name, setProvider) { var set; test(name); before(function () { set = setProvider(); }); it('should be saved with an empty set', function () { obj[name] = new DB.Set(); return obj.save({ refresh: true }).then(function () { var set = obj[name]; expect(set.size).eql(0); }); }); it('should add values', function () { obj[name] = new DB.Set(set); return obj.save().then(function () { obj[name].clear(); return obj.load({ refresh: true }); }).then(function () { var newSet = obj[name]; expect(newSet.size).gt(0); for (var iter = set.values(), item = iter.next(); !item.done; item = iter.next()) { expect(newSet.has(item.value)).be.true; } }); }); it('should remove values', function () { var newSet = new DB.Set(set); obj[name] = newSet; var json = state.getJson(); json[name] = []; state.setJson(json); expect(newSet.size).eq(0); }); it('should track removes', function () { obj[name] = new DB.Set(set); var version = 0; var removed = set.values().next().value; return obj.save().then(function () { obj[name].delete(removed); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newSet = obj[name]; expect(obj.version).eql(version + 1); expect(newSet.size).eql(set.size - 1); for (var iter = set.values(), item = iter.next(); !item.done; item = iter.next()) { expect(newSet.has(item.value)).eql(item.value !== removed); } }); }); it('should track adds', function () { obj[name] = new DB.Set(); var version = 0; var add = set.values().next().value; return obj.save().then(function () { obj[name].add(add); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newSet = obj[name]; expect(obj.version).eql(version + 1); expect(newSet.size).eql(1); expect(newSet.values().next().value).eql(add); }); }); it('should track changes', function () { var items = set.values(); var val1 = items.next().value; var val2 = items.next().value; obj[name] = new DB.Set(); obj[name].add(val1); var version = 0; return obj.save().then(function () { obj[name].delete(val1); obj[name].add(val2); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newSet = obj[name]; expect(obj.version).eql(version + 1); expect(newSet.size).eql(1); expect(newSet.values().next().value).eql(val2); }); }); it('should not track none changes', function () { obj[name] = new DB.Set(set); var version = 0; return obj.save().then(function () { version = obj.version; obj[name].add(set.values().next().value); return obj.save({ refresh: true }); }).then(function () { expect(obj.version).eql(version); }); }); it('should be saved and reloaded', function () { var value = new DB.Set(set); var expectedValue = new DB.Set(value); obj[name] = value; return obj.save({ refresh: true }).then(function () { var set = obj[name]; var size = expectedValue.size; expect(set.size).eql(size); expectedValue.forEach(function (val) { expect(set.has(val)).be.true; }); }); }); } function testMap(name, mapProvider) { var map; test(name); before(function () { map = mapProvider(); }); it('should be saved with an empty map', function () { obj[name] = new DB.Map(); return obj.save({ refresh: true }).then(function () { var map = obj[name]; expect(map.size).eql(0); }); }); it('should add key', function () { obj[name] = new DB.Map(map); return obj.save().then(function () { obj[name].clear(); return obj.load({ refresh: true }); }).then(function () { var newMap = obj[name]; expect(newMap.size).gt(0); for (var iter = map.entries(), item = iter.next(); !item.done; item = iter.next()) { expect(newMap.get(item.value[0])).eqls(item.value[1]); } }); }); it('should remove key', function () { var newMap = new DB.Map(map); obj[name] = newMap; var json = state.getJson(); json[name] = {}; state.setJson(json); expect(newMap.size).eq(0); }); it('should track removes', function () { obj[name] = new DB.Map(map); var version = 0; var removed = map.keys().next().value; return obj.save().then(function () { obj[name].delete(removed); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newMap = obj[name]; expect(obj.version).eql(version + 1); expect(newMap.size).eql(map.size - 1); for (var iter = map.entries(), item = iter.next(); !item.done; item = iter.next()) { if (item.value[0] === removed) { expect(newMap.has(item.value[0])).be.false; } else { expect(newMap.get(item.value[0])).eqls(item.value[1]); } } }); }); it('should track adds', function () { obj[name] = new DB.Map(); var version = 0; var add = map.entries().next().value; return obj.save().then(function () { obj[name].set(add[0], add[1]); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newMap = obj[name]; expect(obj.version).eql(version + 1); expect(newMap.size).eql(1); expect(newMap.get(add[0])).eql(add[1]); }); }); it('should track changes', function () { var items = map.entries(); var entry1 = items.next().value; var entry2 = items.next().value; obj[name] = new DB.Map(); obj[name].set(entry1[0], entry1[1]); var version = 0; return obj.save().then(function () { obj[name].delete(entry1[0]); obj[name].set(entry2[0], entry2[1]); version = obj.version; return obj.save({ refresh: true }); }).then(function () { var newMap = obj[name]; expect(obj.version).eql(version + 1); expect(newMap.size).eql(1); expect(newMap.get(entry2[0])).eql(entry2[1]); }); }); it('should not track none changes', function () { obj[name] = new DB.Map(map); var version = 0; return obj.save().then(function () { version = obj.version; var entry = map.entries().next().value; obj[name].set(entry[0], entry[1]); return obj.save({ refresh: true }); }).then(function () { expect(obj.version).eql(version); }); }); it(' should be saved and reloaded', function () { var value = new DB.Map(map); var expectedValue = new DB.Map(value); obj[name] = value; return obj.save({ refresh: true }).then(function () { var map = obj[name]; expect(map.size).eql(expectedValue.size); for (var iter = expectedValue.entries(), item = iter.next(); !item.done; item = iter.next()) { expect(map.get(item.value[0])).eqls(item.value[1]); } }); }); } });