Skip to content
This repository was archived by the owner on Feb 7, 2021. It is now read-only.

Commit fad4cac

Browse files
jordanpowell88wesleygrimes
authored andcommitted
feat: add async methods to CRUD operations (#31)
* feat: add async methods to CRUD operations
1 parent 21892d2 commit fad4cac

File tree

4 files changed

+454
-37
lines changed

4 files changed

+454
-37
lines changed

lib/services/in-memory-db.service.spec.ts

Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { marbles } from 'rxjs-marbles';
12
import { InMemoryDBEntity } from '../interfaces';
23
import { InMemoryDBService } from './in-memory-db.service';
34

@@ -43,6 +44,39 @@ describe('In Memory DB Service', () => {
4344
expect(actualRecord).toEqual(expectedRecord);
4445
});
4546
});
47+
48+
describe('getAsync', () => {
49+
it(
50+
'should return expected record as an observable if given valid id',
51+
marbles(m => {
52+
// arrange
53+
service.records = [...sampleRecords];
54+
const expectedRecord = m.cold('a|', sampleRecords[0]);
55+
56+
// act
57+
const actualRecord = m.cold('a|', service.getAsync(1));
58+
59+
// assert
60+
m.expect(actualRecord).toBeObservable(expectedRecord);
61+
}),
62+
);
63+
64+
it(
65+
'should return observable with no value given invalid id',
66+
marbles(m => {
67+
// arrange
68+
service.records = [...sampleRecords];
69+
const expectedRecord = m.cold('a|', {});
70+
71+
// act
72+
const actualRecord = m.cold('a|', service.getAsync(-1));
73+
74+
// assert
75+
m.expect(actualRecord).toBeObservable(expectedRecord);
76+
}),
77+
);
78+
});
79+
4680
describe('getMany', () => {
4781
it('should return expected records if given valid ids', () => {
4882
// arrange
@@ -68,6 +102,41 @@ describe('In Memory DB Service', () => {
68102
expect(actualRecords).toEqual(expectedRecords);
69103
});
70104
});
105+
106+
describe('getManyAsync', () => {
107+
it(
108+
'should return expected records as observable if given valid ids',
109+
marbles(m => {
110+
// arrange
111+
service.records = [...sampleRecords];
112+
const expectedRecord = m.cold('a|', [
113+
...[sampleRecords[0], sampleRecords[1]],
114+
]);
115+
116+
// act
117+
const actualRecord = m.cold('a|', service.getManyAsync([1, 2]));
118+
119+
// assert
120+
m.expect(actualRecord).toBeObservable(expectedRecord);
121+
}),
122+
);
123+
124+
it(
125+
'should return only expected records as observables if given an invalid id',
126+
marbles(m => {
127+
// arrange
128+
service.records = [...sampleRecords];
129+
const expectedRecord = m.cold('a|', [sampleRecords[0]]);
130+
131+
// act
132+
const actualRecords = m.cold('a|', service.getManyAsync([-1, 1]));
133+
134+
// assert
135+
m.expect(actualRecords).toBeObservable(expectedRecord);
136+
}),
137+
);
138+
});
139+
71140
describe('getAll', () => {
72141
it('should return all expected records', () => {
73142
// arrange
@@ -92,6 +161,38 @@ describe('In Memory DB Service', () => {
92161
expect(actualRecords).toEqual(expectedRecords);
93162
});
94163
});
164+
165+
describe('getAllAsync', () => {
166+
it(
167+
'should return all expected records as observable',
168+
marbles(m => {
169+
// arrange
170+
service.records = [...sampleRecords];
171+
const expectedRecords = m.cold('a|', service.records);
172+
173+
// act
174+
const actualRecords = m.cold('a|', service.getAllAsync());
175+
176+
// assert
177+
m.expect(actualRecords).toBeObservable(expectedRecords);
178+
}),
179+
);
180+
it(
181+
'should return empty array as observable if no records',
182+
marbles(m => {
183+
// arrange
184+
service.records = [];
185+
const expectedRecords = m.cold('a|', []);
186+
187+
// act
188+
const actualRecords = m.cold('a|', service.getAllAsync());
189+
190+
// assert
191+
m.expect(actualRecords).toBeObservable(expectedRecords);
192+
}),
193+
);
194+
});
195+
95196
describe('create', () => {
96197
it('should update records with correct items', () => {
97198
// arrange
@@ -118,6 +219,41 @@ describe('In Memory DB Service', () => {
118219
expect(actualRecord).toEqual(expectedRecord);
119220
});
120221
});
222+
223+
describe('createAsync', () => {
224+
it(
225+
'should update records with correct items asyncronously',
226+
marbles(m => {
227+
// arrange
228+
service.records = [];
229+
const itemToAdd: Partial<TestEntity> = { someField: 'Test' };
230+
const expectedRecords = m.cold('a|', [...[{ ...itemToAdd, id: 1 }]]);
231+
232+
// act
233+
service.createAsync(itemToAdd);
234+
const actualRecords = m.cold('a|', service.records);
235+
236+
// assert
237+
m.expect(actualRecords).toBeObservable(expectedRecords);
238+
}),
239+
);
240+
it(
241+
'should return generated id as observable',
242+
marbles(m => {
243+
// arrange
244+
service.records = [];
245+
const itemToAdd: Partial<TestEntity> = { someField: 'Test' };
246+
const expectedRecord = m.cold('a|', { ...itemToAdd, id: 1 });
247+
248+
// act
249+
const actualRecord = m.cold('a|', service.createAsync(itemToAdd));
250+
251+
// assert
252+
m.expect(actualRecord).toBeObservable(expectedRecord);
253+
}),
254+
);
255+
});
256+
121257
describe('createMany', () => {
122258
it('should update records with correct items', () => {
123259
// arrange
@@ -156,6 +292,58 @@ describe('In Memory DB Service', () => {
156292
expect(actualGeneratedRecords).toEqual(expectedGeneratedRecords);
157293
});
158294
});
295+
296+
describe('createManyAsync', () => {
297+
it(
298+
'should update records with correct items asynchronously',
299+
marbles(m => {
300+
// arrange
301+
service.records = [];
302+
const item1ToAdd: Partial<TestEntity> = { someField: 'Test' };
303+
const item2ToAdd: Partial<TestEntity> = { someField: 'Another' };
304+
const expectedRecords = m.cold('a|', [
305+
...[{ ...item1ToAdd, id: 1 }, { ...item2ToAdd, id: 2 }],
306+
]);
307+
308+
// act
309+
const createdRecords = m.cold(
310+
'a|',
311+
service.createManyAsync([item1ToAdd, item2ToAdd]),
312+
);
313+
const actualRecords = m.cold('a|', service.records);
314+
315+
// assert
316+
m.expect(actualRecords).toBeObservable(expectedRecords);
317+
m.expect(createdRecords).toBeObservable(expectedRecords);
318+
}),
319+
);
320+
it(
321+
'should return generated ids asyncronously',
322+
marbles(m => {
323+
// arrange
324+
service.records = [];
325+
const item1ToAdd: Partial<TestEntity> = { someField: 'Test' };
326+
const item2ToAdd: Partial<TestEntity> = { someField: 'Another' };
327+
328+
const expectedGeneratedRecords = m.cold('a|', [
329+
{ ...item1ToAdd, id: 1 },
330+
{ ...item2ToAdd, id: 2 },
331+
]);
332+
333+
// act
334+
const actualGeneratedRecords = m.cold(
335+
'a|',
336+
service.createManyAsync([item1ToAdd, item2ToAdd]),
337+
);
338+
339+
// assert
340+
m.expect(actualGeneratedRecords).toBeObservable(
341+
expectedGeneratedRecords,
342+
);
343+
}),
344+
);
345+
});
346+
159347
describe('update', () => {
160348
it('should update record as expected', () => {
161349
// arrange
@@ -174,6 +362,31 @@ describe('In Memory DB Service', () => {
174362
expect(actualUpdatedRecord).toEqual(expectedUpdatedRecord);
175363
});
176364
});
365+
366+
describe('updateAsync', () => {
367+
it(
368+
'should update record as expected asyncronously',
369+
marbles(m => {
370+
// arrange
371+
const originRecord: TestEntity = { id: 1, someField: 'AAA' };
372+
const updatedRecord: TestEntity = { id: 1, someField: 'BBB' };
373+
service.records = [...[originRecord]];
374+
const expectedRecord = m.cold('a|', updatedRecord);
375+
376+
// act
377+
service.updateAsync(updatedRecord);
378+
379+
// assert
380+
const actualUpdatedRecord = m.cold(
381+
'a|',
382+
service.records.find(record => record.id === originRecord.id),
383+
);
384+
385+
m.expect(actualUpdatedRecord).toBeObservable(expectedRecord);
386+
}),
387+
);
388+
});
389+
177390
describe('updateMany', () => {
178391
it('should update records as expected', () => {
179392
// arrange
@@ -199,6 +412,40 @@ describe('In Memory DB Service', () => {
199412
expect(actualUpdatedRecords).toEqual(expectedUpdatedRecords);
200413
});
201414
});
415+
416+
describe('updateManyAsync', () => {
417+
it(
418+
'should update records as expected asynronously',
419+
marbles(m => {
420+
// arrange
421+
const originRecords: TestEntity[] = [
422+
{ id: 1, someField: 'AAA' },
423+
{ id: 2, someField: 'BBB' },
424+
{ id: 3, someField: 'CCC' },
425+
];
426+
const updatedRecords: TestEntity[] = [
427+
{ id: 1, someField: 'YYY' },
428+
{ id: 2, someField: 'ZZZ' },
429+
];
430+
service.records = [...originRecords];
431+
const expectedRecords = m.cold('a|', updatedRecords);
432+
433+
// act
434+
service.updateManyAsync(updatedRecords);
435+
436+
// assert
437+
const actualUpdatedRecords = m.cold(
438+
'a|',
439+
service.records.filter(record =>
440+
updatedRecords.map(o => o.id).includes(record.id),
441+
),
442+
);
443+
444+
m.expect(actualUpdatedRecords).toBeObservable(expectedRecords);
445+
}),
446+
);
447+
});
448+
202449
describe('delete', () => {
203450
it('should remove record as expected', () => {
204451
// arrange
@@ -216,6 +463,25 @@ describe('In Memory DB Service', () => {
216463
expect(service.records.length).toEqual(1);
217464
});
218465
});
466+
467+
describe('deleteAsync', () => {
468+
it('should remove record as expected asyncronously', () => {
469+
// arrange
470+
service.records = [
471+
{ id: 1, someField: 'AAA' },
472+
{ id: 2, someField: 'BBB' },
473+
];
474+
475+
// act
476+
service.deleteAsync(2);
477+
478+
// assert
479+
const secondRecord = service.records.find(record => record.id === 2);
480+
expect(secondRecord).toEqual(undefined);
481+
expect(service.records.length).toEqual(1);
482+
});
483+
});
484+
219485
describe('deleteMany', () => {
220486
it('should remove records as expected', () => {
221487
// arrange
@@ -234,6 +500,26 @@ describe('In Memory DB Service', () => {
234500
expect(service.records.length).toEqual(1);
235501
});
236502
});
503+
504+
describe('deleteManyAsync', () => {
505+
it('should remove records as expected asyncronously', () => {
506+
// arrange
507+
service.records = [
508+
{ id: 1, someField: 'AAAA' },
509+
{ id: 2, someField: 'BBB' },
510+
{ id: 3, someField: 'CCC' },
511+
];
512+
513+
// act
514+
service.deleteManyAsync([1, 2]);
515+
516+
// assert
517+
const thirdRecord = service.records[0];
518+
expect(thirdRecord).toEqual({ id: 3, someField: 'CCC' });
519+
expect(service.records.length).toEqual(1);
520+
});
521+
});
522+
237523
describe('query', () => {
238524
it('should return expected records for given predicate', () => {
239525
// arrange
@@ -250,4 +536,27 @@ describe('In Memory DB Service', () => {
250536
expect(foundRecord).toEqual(expectedFoundRecord);
251537
});
252538
});
539+
540+
describe('queryAsync', () => {
541+
it(
542+
'should return expected records for given predicate as observable',
543+
marbles(m => {
544+
// arrange
545+
service.records = [
546+
{ id: 1, someField: 'AAA' },
547+
{ id: 2, someField: 'BBB' },
548+
];
549+
const expectedFoundRecord = m.cold('a|', service.records[1]);
550+
551+
// act
552+
const foundRecord = m.cold(
553+
'a|',
554+
service.queryAsync(record => record.someField === 'BBB'),
555+
);
556+
557+
// assert
558+
m.expect(foundRecord).toBeObservable(expectedFoundRecord);
559+
}),
560+
);
561+
});
253562
});

0 commit comments

Comments
 (0)