Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit 2e2ba19

Browse files
committed
#10 cache functionality implemented
1 parent 4299fbf commit 2e2ba19

File tree

4 files changed

+337
-104
lines changed

4 files changed

+337
-104
lines changed

src/app/shared/rxjs-imports.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'rxjs/add/observable/defer';
2+
import 'rxjs/add/observable/forkJoin';
23
import 'rxjs/add/observable/from';
34
import 'rxjs/add/observable/fromPromise';
45
import 'rxjs/add/observable/of';
56
import 'rxjs/add/observable/throw';
6-
import 'rxjs/add/observable/forkJoin';
77

88
import 'rxjs/add/operator/catch';
99
import 'rxjs/add/operator/concatMap';

src/app/shared/services/storage.service.spec.ts

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
SessionStorageService
88
} from './storage.service';
99

10-
fdescribe('StorageService', () => {
10+
describe('StorageService', () => {
1111

1212
const store = {
1313
local: undefined as LocalStorageService,
@@ -117,6 +117,18 @@ fdescribe('StorageService', () => {
117117
});
118118
});
119119

120+
it('getStorageEngine', async (done) => {
121+
try {
122+
for (const type of stores) {
123+
const result = await store[type].getStorageEngine().toPromise();
124+
expect(result).toBe((type === 'session') ? 'session' : 'asyncStorage', type);
125+
done();
126+
}
127+
} catch (err) {
128+
done.fail(err);
129+
}
130+
});
131+
120132
describe('observe', () => {
121133
it('emits when setItem updates an entry', async (done) => {
122134
try {
@@ -162,6 +174,42 @@ fdescribe('StorageService', () => {
162174
});
163175
});
164176

177+
it('key', async (done) => {
178+
try {
179+
for (const type of stores) {
180+
await store[type].setItem('val1', 1).toPromise();
181+
await store[type].setItem('val2', 2).toPromise();
182+
183+
expect(await store[type].key(0).toPromise()).toBe(store[type]['getKey']('val1'));
184+
expect(await store[type].key(1).toPromise()).toBe(store[type]['getCacheKey']('val1'));
185+
expect(await store[type].key(2).toPromise()).toBe(store[type]['getKey']('val2'));
186+
expect(await store[type].key(3).toPromise()).toBe(store[type]['getCacheKey']('val2'));
187+
188+
}
189+
done();
190+
} catch (err) {
191+
done.fail(err);
192+
}
193+
});
194+
195+
it('length', async (done) => {
196+
try {
197+
198+
for (const type of stores) {
199+
await store[type].setItem('test-val-1', true).toPromise();
200+
await store[type].setItem('test-val-2', true).toPromise();
201+
await store[type].setItem('test-val-3', true).toPromise();
202+
await store[type].setItem('test-val-4', true).toPromise();
203+
expect(await store[type].length().toPromise()).toBe(8);
204+
}
205+
206+
done();
207+
} catch (err) {
208+
done.fail(err);
209+
}
210+
211+
});
212+
165213
it('removeItem', async (done) => {
166214
try {
167215
for (const type of stores) {
@@ -197,15 +245,10 @@ fdescribe('StorageService', () => {
197245
try {
198246
for (const type of stores) {
199247
await store[type].setItem('test', 'test value').toPromise();
200-
201-
const valueField = (type === 'session')
202-
? `${store.session.prefix}-test`
203-
: 'test';
204-
const cacheField = (type === 'session')
205-
? `${store.session.prefix}-test-${store.session.cachePostfix}`
206-
: 'test-ttl';
207-
expect(await store[type].key(0).toPromise()).toBe(valueField, type);
208-
expect(await store[type].key(1).toPromise()).toBe(cacheField, type);
248+
const valueKey = store[type]['getKey']('test');
249+
const cacheKey = store[type]['getCacheKey']('test');
250+
expect(await store[type].key(0).toPromise()).toBe(valueKey, type);
251+
expect(await store[type].key(1).toPromise()).toBe(cacheKey, type);
209252
}
210253

211254
done();
@@ -216,15 +259,15 @@ fdescribe('StorageService', () => {
216259

217260
});
218261

219-
describe('cache expiration', () => {
220-
it('expires value', async (done) => {
262+
describe('cache', () => {
263+
it('getItem expires value', async (done) => {
221264

222265
try {
223266

224267
for (const type of stores) {
225268
await store[type].setItem('test', 'should be expired (null)', 1).toPromise();
226269
expect(await store[type].getItem('test').toPromise()).toBe('should be expired (null)', type);
227-
// wait two seconds
270+
228271
await new Promise((resolve) => setTimeout(resolve, 1010));
229272
expect(await store[type].getItem('test').toPromise()).toBe(null, type);
230273
}
@@ -233,7 +276,42 @@ fdescribe('StorageService', () => {
233276
} catch (err) {
234277
done.fail(err);
235278
}
279+
});
280+
281+
it('getItem removes expired value', async (done) => {
282+
283+
try {
284+
285+
for (const type of stores) {
286+
await store[type].setItem('test', 'should be expired (null)', 1).toPromise();
287+
expect(await store[type].getItem('test').toPromise()).toBe('should be expired (null)', type);
288+
289+
await new Promise((resolve) => setTimeout(resolve, 1010));
290+
expect(await store[type].getItem('test').toPromise()).toBe(null, type);
291+
expect(await store[type].key(0).toPromise()).toBe(null, type);
292+
}
236293

294+
done();
295+
} catch (err) {
296+
done.fail(err);
297+
}
298+
});
299+
300+
it('clearExpiredCache', async (done) => {
301+
try {
302+
for (const type of stores) {
303+
await store[type].setItem('test', 'some value', 1).toPromise();
304+
expect(await store[type].getItem('test').toPromise()).toBe('some value');
305+
306+
await new Promise((resolve) => setTimeout(resolve, 1010));
307+
await store[type].clearExpiredCache().toPromise();
308+
expect(await store[type].getItem('test').toPromise()).toBe(null, type);
309+
}
310+
311+
done();
312+
} catch (err) {
313+
done.fail(err);
314+
}
237315
});
238316
});
239317
});

0 commit comments

Comments
 (0)