ts-repository
Version:
Repository template interfaces and stub in-memory implementation
89 lines (88 loc) • 3.69 kB
JavaScript
;
var chai = require('chai');
var sinon = require('sinon');
var helpers_1 = require('./helpers');
var repos = require('../src/repos');
let expect = chai.expect;
class SampleEntity {
constructor(name) {
this.name = name;
}
}
class SampleIdFactory {
constructor() {
this._currentId = 1;
}
createId() {
return new repos.Id((this._currentId++).toString());
}
}
describe('IdFactory', () => {
let seedProvider = {
next: sinon.spy(() => {
return 1;
})
};
let factory = new repos.RadixIdFactory(seedProvider);
it('should use provided seed for id generation', () => {
factory.createId();
expect(seedProvider.next).to.be.called;
});
it('should generate id using constant radix', () => {
let id = factory.createId();
expect(parseInt(id.toString(), factory.radix())).to.equal(1);
});
});
describe('MemoryRepository', () => {
let idFactory, memRepo;
let capacity = 2;
beforeEach(() => {
idFactory = new SampleIdFactory();
memRepo = new repos.MemoryRepository(idFactory, capacity);
});
it('should have no entries by default', helpers_1.promised(() => memRepo.count()
.then(count => expect(count).to.equal(0))));
it('should have one entry', helpers_1.promised(() => memRepo.create(new SampleEntity('dude'))
.then(() => memRepo.count())
.then(count => expect(count).to.equal(1))));
it('should create id for entity', helpers_1.promised(() => memRepo.create(new SampleEntity('dude'))
.then(id => expect(id.toString()).to.equal('1'))));
it('should retrieve entity by id', helpers_1.promised(() => {
let entity = new SampleEntity('dude');
return memRepo.create(entity)
.then(id => memRepo.read(id))
.then(result => expect(result).to.equal(entity));
}));
it('should update entity by id', helpers_1.promised(() => {
let dude = new SampleEntity('dude');
let walter = new SampleEntity('walter');
return memRepo.create(dude)
.then(id => memRepo.update(id, walter)
.then(() => memRepo.read(id)))
.then(result => expect(result).to.equal(walter));
}));
it('should delete entity by id', helpers_1.promised(() => {
let dude = new SampleEntity('dude');
return memRepo.create(dude)
.then(id => memRepo.delete(id))
.then(() => memRepo.count())
.then(count => expect(count).to.equal(0));
}));
it('should return all entities', helpers_1.promised(() => {
let first = new SampleEntity('1');
let second = new SampleEntity('2');
return memRepo.create(first)
.then(() => memRepo.create(second)
.then(() => memRepo.all())
.then(entities => expect(entities).to.eql({
'1': first,
'2': second
})));
}));
it('should maintain capacity', helpers_1.broken(() => memRepo.create(new SampleEntity('1'))
.then(() => memRepo.create(new SampleEntity('2')))
.then(() => memRepo.create(new SampleEntity('3'))), new repos.CapacityExceeddedError(capacity)));
it('should reject update for unknown id', helpers_1.broken(() => memRepo.update(new repos.Id('404'), { name: 'donny' }), new repos.UpdateError(new repos.Id('404'))));
it('should reject read for unknown id', helpers_1.broken(() => memRepo.read(new repos.Id('404')), new repos.ReadError(new repos.Id('404'))));
it('should reject delete for unknown id', helpers_1.broken(() => memRepo.delete(new repos.Id('404')), new repos.DeleteError(new repos.Id('404'))));
});