UNPKG

@bigtest/mirage

Version:

A client-side server to develop, test and prototype your app.

649 lines (503 loc) 17.2 kB
import { Db, IdentityManager as DefaultIdentityManager } from '@bigtest/mirage'; import {module, test} from 'qunit'; let db; module('Unit | Db'); test('it can be instantiated', function(assert) { db = new Db(); assert.ok(db); }); test('it can load data on instantiation', function(assert) { db = new Db({ users: [{ id: 1, name: 'Link' }], addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] }); assert.equal(db.users.length, 1); assert.equal(db.addresses.length, 2); }); test('it can empty its data', function(assert) { db = new Db({ users: [{ id: 1, name: 'Link' }], addresses: [{ id: 1, name: '123 Hyrule Way' }, { id: 2, name: 'Lorem ipsum' }] }); db.emptyData(); assert.equal(db.users.length, 0); assert.equal(db.addresses.length, 0); }); module('Unit | Db #createCollection', { beforeEach() { db = new Db(); }, afterEach() { db.emptyData(); } }); test('it can create an empty collection', function(assert) { db.createCollection('contacts'); assert.ok(db.contacts); }); test('it can create many collections', function(assert) { db.createCollections('contacts', 'addresses'); assert.ok(db.contacts); assert.ok(db.addresses); }); module('Unit | Db #loadData', { beforeEach() { db = new Db(); }, afterEach() { db.emptyData(); } }); test('it can load an object of data', function(assert) { let data = { contacts: [{ id: '1', name: 'Link' }], addresses: [{ id: '1', name: '123 Hyrule Way' }] }; db.loadData(data); assert.deepEqual(db.contacts, data.contacts); assert.deepEqual(db.addresses, data.addresses); }); test('it clones all data so nothing is passed by reference', function(assert) { let data = { contacts: [{ id: '1', someArray: ['foo', 'bar'] }] }; db.loadData(data); let contactRecord = db.contacts.find(1); contactRecord.someArray.push('baz'); assert.equal(contactRecord.someArray.length, 3); assert.equal(data.contacts[0].someArray.length, 2); }); module('Unit | Db #all', { beforeEach() { this.data = { contacts: [{ id: '1', name: 'Link' }], addresses: [{ id: '1', name: '123 Hyrule Way' }] }; db = new Db(this.data); }, afterEach() { db.emptyData(); } }); test('it can return a collection', function(assert) { assert.deepEqual(db.contacts, this.data.contacts); assert.deepEqual(db.addresses, this.data.addresses); }); test('the collection is a copy', function(assert) { let { contacts } = db; assert.deepEqual(contacts, this.data.contacts); contacts[0].name = 'Zelda'; assert.deepEqual(db.contacts, this.data.contacts); }); module('Unit | Db #insert', { beforeEach() { db = new Db(); db.createCollection('contacts'); }, afterEach() { db.emptyData(); } }); test('it inserts an object and returns it', function(assert) { let link = db.contacts.insert({ name: 'Link' }); let expectedRecord = { id: '1', name: 'Link' }; assert.deepEqual(db.contacts, [expectedRecord]); assert.deepEqual(link, expectedRecord); }); test('it returns a copy', function(assert) { let link = db.contacts.insert({ name: 'Link' }); let expectedRecord = { id: '1', name: 'Link' }; assert.deepEqual(link, expectedRecord); link.name = 'Young link'; assert.deepEqual(db.contacts.find(1), expectedRecord); }); test('it can insert objects sequentially', function(assert) { db.contacts.insert({ name: 'Link' }); db.contacts.insert({ name: 'Ganon' }); let records = [ { id: '1', name: 'Link' }, { id: '2', name: 'Ganon' } ]; assert.deepEqual(db.contacts, records); }); test('it does not add an id if present', function(assert) { let attrs = { id: '5', name: 'Link' }; db.contacts.insert(attrs); assert.deepEqual(db.contacts, [attrs]); }); test('it can insert an array and return it', function(assert) { db.contacts.insert({ name: 'Link' }); let contacts = db.contacts.insert([{ name: 'Zelda' }, { name: 'Ganon' }]); assert.deepEqual(db.contacts, [{ id: '1', name: 'Link' }, { id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); assert.deepEqual(contacts, [{ id: '2', name: 'Zelda' }, { id: '3', name: 'Ganon' }]); }); test('it does not add ids to array data if present', function(assert) { db.contacts.insert([{ id: 2, name: 'Link' }, { id: 1, name: 'Ganon' }]); assert.deepEqual(db.contacts, [{ id: '1', name: 'Ganon' }, { id: '2', name: 'Link' }]); }); test('it can insert a record with an id of 0', function(assert) { db.contacts.insert({ id: 0, name: 'Link' }); assert.deepEqual(db.contacts, [{ id: '0', name: 'Link' }]); }); test('IDs increment correctly, even after a record is removed', function(assert) { let records = db.contacts.insert([{ name: 'Link' }, { name: 'Ganon' }]); db.contacts.remove(records[0]); let record = db.contacts.insert({ name: 'Zelda' }); assert.equal(record.id, 3); }); test('inserting a record with an already used ID throws an error', function(assert) { assert.expect(2); db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); assert.throws(function() { db.contacts.insert({ id: 1, name: 'Duncan McCleod' }); }); db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); assert.throws(function() { db.contacts.insert({ id: 'atp', name: 'Adenosine Triphosphate' }); }); }); test('tracks the correct IDs being used', function(assert) { db.contacts.insert({ name: 'Vegeta' }); db.contacts.insert({ id: 2, name: 'Krilli' }); assert.equal(db.contacts.length, 2); }); module('Unit | Db #findBy', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { name: 'Zelda' }, { name: 'Link' }, { name: 'Epona', race: 'Horse' }, { name: 'Epona', race: 'Centaur' }, { id: 'abc', name: 'Ganon' } ]); }, afterEach() { db.emptyData(); } }); test('returns a record that matches the given name', function(assert) { let contact = db.contacts.findBy({ 'name': 'Link' }); assert.deepEqual(contact, { id: '2', name: 'Link' }); }); test('returns a copy not a reference', function(assert) { let contact = db.contacts.findBy({ 'name': 'Link' }); contact.name = 'blah'; assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); }); test('returns the first record matching the criteria', function(assert) { let contact = db.contacts.findBy({ 'name': 'Epona' }); assert.deepEqual(contact, { id: '3', name: 'Epona', race: 'Horse' }); }); test('returns a record only matching multiple criteria', function(assert) { let contact = db.contacts.findBy({ 'name': 'Epona', 'race': 'Centaur' }); assert.deepEqual(contact, { id: '4', name: 'Epona', race: 'Centaur' }); }); test('returns null when no record is found', function(assert) { let contact = db.contacts.findBy({ 'name': 'Fi' }); assert.equal(contact, null); }); module('Unit | Db #find', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { name: 'Zelda' }, { name: 'Link' }, { id: 'abc', name: 'Ganon' } ]); }, afterEach() { db.emptyData(); } }); test('returns a record that matches a numerical id', function(assert) { let contact = db.contacts.find(2); assert.deepEqual(contact, { id: '2', name: 'Link' }); }); test('returns a copy not a reference', function(assert) { let contact = db.contacts.find(2); assert.deepEqual(contact, { id: '2', name: 'Link' }); contact.name = 'blah'; assert.deepEqual(db.contacts.find(2), { id: '2', name: 'Link' }); }); test('returns a record that matches a string id', function(assert) { let contact = db.contacts.find('abc'); assert.deepEqual(contact, { id: 'abc', name: 'Ganon' }); }); test('returns multiple record that matches an array of ids', function(assert) { let contacts = db.contacts.find([1, 2]); assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); }); test('returns a record whose id is a string that start with numbers', function(assert) { db.contacts.insert({ id: '123-456', name: 'Epona' }); let contact = db.contacts.find('123-456'); assert.deepEqual(contact, { id: '123-456', name: 'Epona' }); }); test('returns multiple record that match an array of ids', function(assert) { let contacts = db.contacts.find([1, 2]); assert.deepEqual(contacts, [{ id: '1', name: 'Zelda' }, { id: '2', name: 'Link' }]); }); test('returns an empty array when it doesnt find multiple ids', function(assert) { let contacts = db.contacts.find([99, 100]); assert.deepEqual(contacts, []); }); module('Unit | Db #where', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { name: 'Link', evil: false, age: 17 }, { name: 'Zelda', evil: false, age: 17 }, { name: 'Ganon', evil: true, age: 45 } ]); }, afterEach() { db.emptyData(); } }); test('returns an array of records that match the query', function(assert) { let result = db.contacts.where({ evil: true }); assert.deepEqual(result, [ { id: '3', name: 'Ganon', evil: true, age: 45 } ]); }); test('it coerces query params to strings', function(assert) { let result = db.contacts.where({ age: '45' }); assert.deepEqual(result, [ { id: '3', name: 'Ganon', evil: true, age: 45 } ]); }); test('returns a copy, not a referecne', function(assert) { let result = db.contacts.where({ evil: true }); assert.deepEqual(result, [ { id: '3', name: 'Ganon', evil: true, age: 45 } ]); result[0].evil = false; assert.deepEqual(db.contacts.where({ evil: true }), [ { id: '3', name: 'Ganon', evil: true, age: 45 } ]); }); test('returns an empty array if no records match the query', function(assert) { let result = db.contacts.where({ name: 'Link', evil: true }); assert.deepEqual(result, []); }); test('accepts a filter function', function(assert) { let result = db.contacts.where(function(record) { return record.age === 45; }); assert.deepEqual(result, [ { id: '3', name: 'Ganon', evil: true, age: 45 } ]); }); module('Unit | Db #update', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { name: 'Link', evil: false }, { name: 'Zelda', evil: false }, { name: 'Ganon', evil: true }, { id: '123-abc', name: 'Epona', evil: false } ]); }, afterEach() { db.emptyData(); } }); test('it can update the whole collection', function(assert) { db.contacts.update({ name: 'Sam', evil: false }); let actualContacts = db.contacts; let expectedContacts = [ { id: '123-abc', name: 'Sam', evil: false }, { id: '1', name: 'Sam', evil: false }, { id: '2', name: 'Sam', evil: false }, { id: '3', name: 'Sam', evil: false } ]; assert.deepEqual( actualContacts, expectedContacts, [actualContacts.map(function(r) { return r.id; }).join(','), expectedContacts.map(function(r) { return r.id; }).join(',')].join(';') ); }); test('it can update a record by id', function(assert) { db.contacts.update(3, { name: 'Ganondorf', evil: false }); let ganon = db.contacts.find(3); assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: false }); }); test('it can update a record by id when the id is a string', function(assert) { db.contacts.update('123-abc', { evil: true }); let epona = db.contacts.find('123-abc'); assert.deepEqual(epona, { id: '123-abc', name: 'Epona', evil: true }); }); test('it can update multiple records by ids', function(assert) { db.contacts.update([1, 2], { evil: true }); let link = db.contacts.find(1); let zelda = db.contacts.find(2); assert.equal(link.evil, true); assert.equal(zelda.evil, true); }); test('it can update records by query', function(assert) { db.contacts.update({ evil: false }, { name: 'Sam' }); assert.deepEqual(db.contacts, [ { id: '123-abc', name: 'Sam', evil: false }, { id: '1', name: 'Sam', evil: false }, { id: '2', name: 'Sam', evil: false }, { id: '3', name: 'Ganon', evil: true } ]); }); test('updating a single record returns that record', function(assert) { let ganon = db.contacts.update(3, { name: 'Ganondorf' }); assert.deepEqual(ganon, { id: '3', name: 'Ganondorf', evil: true }); }); test('updating a collection returns the updated records', function(assert) { let characters = db.contacts.update({ evil: true }); assert.deepEqual(characters, [ { id: '123-abc', name: 'Epona', evil: true }, { id: '1', name: 'Link', evil: true }, { id: '2', name: 'Zelda', evil: true } ]); }); test('updating multiple records returns the updated records', function(assert) { let characters = db.contacts.update({ evil: false }, { evil: true }); assert.deepEqual(characters, [ { id: '123-abc', name: 'Epona', evil: true }, { id: '1', name: 'Link', evil: true }, { id: '2', name: 'Zelda', evil: true } ]); }); test('throws when updating an ID is attempted', function(assert) { assert.expect(1); assert.throws(function() { db.contacts.update(1, { id: 3 }); }); }); module('Unit | Db #remove', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { name: 'Link', evil: false }, { name: 'Zelda', evil: false }, { name: 'Ganon', evil: true }, { id: '123-abc', name: 'Epona', evil: false } ]); }, afterEach() { db.emptyData(); } }); test('it can remove an entire collection', function(assert) { db.contacts.remove(); assert.deepEqual(db.contacts, []); }); test('it can remove a single record by id', function(assert) { db.contacts.remove(1); assert.deepEqual(db.contacts, [ { id: '123-abc', name: 'Epona', evil: false }, { id: '2', name: 'Zelda', evil: false }, { id: '3', name: 'Ganon', evil: true } ]); }); test('it can remove a single record when the id is a string', function(assert) { db.contacts.remove('123-abc'); assert.deepEqual(db.contacts, [ { id: '1', name: 'Link', evil: false }, { id: '2', name: 'Zelda', evil: false }, { id: '3', name: 'Ganon', evil: true } ]); }); test('it can remove multiple records by ids', function(assert) { db.contacts.remove([1, 2]); assert.deepEqual(db.contacts, [ { id: '123-abc', name: 'Epona', evil: false }, { id: '3', name: 'Ganon', evil: true } ]); }); test('it can remove multiple records by query', function(assert) { db.contacts.remove({ evil: false }); assert.deepEqual(db.contacts, [ { id: '3', name: 'Ganon', evil: true } ]); }); test('it can add a record after removing all records', function(assert) { db.contacts.remove(); db.contacts.insert({ name: 'Foo' }); assert.equal(db.contacts.length, 1); assert.deepEqual(db.contacts, [ { id: '1', name: 'Foo' } ]); }); module('Unit | Db #firstOrCreate', { beforeEach() { db = new Db(); db.createCollection('contacts'); db.contacts.insert([ { id: 1, name: 'Link', evil: false }, { id: 2, name: 'Zelda', evil: false }, { id: 3, name: 'Ganon', evil: true } ]); }, afterEach() { db.emptyData(); } }); test('it can find the first record available from the query', function(assert) { let record = db.contacts.firstOrCreate({ name: 'Link' }); assert.deepEqual(record, { id: '1', name: 'Link', evil: false }); }); test('it creates a new record from query + attrs if none found', function(assert) { let record = db.contacts.firstOrCreate({ name: 'Mario' }, { evil: false }); assert.equal(record.name, 'Mario'); assert.equal(record.evil, false); assert.ok(record.id); }); test('does not require attrs', function(assert) { let record = db.contacts.firstOrCreate({ name: 'Luigi' }); assert.equal(record.name, 'Luigi'); assert.ok(record.id); }); module('Unit | Db #registerIdentityManagers and #identityManagerFor'); test('identityManagerFor returns ember-cli-mirage default IdentityManager if there aren\'t any custom ones', function(assert) { let db = new Db(); assert.equal(db.identityManagerFor('foo'), DefaultIdentityManager); }); test('it can register identity managers per db collection and for application', function(assert) { let FooIdentityManager = class {}; let ApplicationIdentityManager = class {}; let db = new Db(); db.registerIdentityManagers({ foo: FooIdentityManager, application: ApplicationIdentityManager }); assert.equal( db.identityManagerFor('foo'), FooIdentityManager, 'it allows to declare an identity manager per db collection' ); assert.equal( db.identityManagerFor('bar'), ApplicationIdentityManager, 'it falls back to application idenitity manager if there isn\'t one for a specific db collection' ); }); test('it can register idenitity managers on instantiation', function(assert) { let CustomIdentityManager = class {}; let db = new Db(undefined, { foo: CustomIdentityManager }); assert.equal(db.identityManagerFor('foo'), CustomIdentityManager); assert.equal(db.identityManagerFor('bar'), DefaultIdentityManager); });