1
1
import { InMemoryLRUCache } from 'apollo-server-caching'
2
2
import wait from 'waait'
3
+ import { ObjectId } from 'mongodb'
4
+ import { EJSON } from 'bson'
3
5
4
- import { createCachingMethods } from '../cache'
6
+ import { createCachingMethods , idToString } from '../cache'
5
7
6
8
const docs = {
7
9
id1 : {
8
10
_id : 'id1'
11
+ // _id: ObjectId()
9
12
} ,
10
13
id2 : {
11
- _id : 'id2'
12
- } ,
13
- id3 : {
14
- _id : 'id3'
14
+ _id : ObjectId ( )
15
15
}
16
16
}
17
17
18
18
const collectionName = 'test'
19
- const cacheKey = id => `mongo-${ collectionName } -${ id } `
19
+ const cacheKey = id => `mongo-${ collectionName } -${ idToString ( id ) } `
20
20
21
21
describe ( 'createCachingMethods' , ( ) => {
22
22
let collection
@@ -29,7 +29,13 @@ describe('createCachingMethods', () => {
29
29
find : jest . fn ( ( { _id : { $in : ids } } ) => ( {
30
30
toArray : ( ) =>
31
31
new Promise ( resolve => {
32
- setTimeout ( ( ) => resolve ( ids . map ( id => docs [ id ] ) ) , 0 )
32
+ setTimeout (
33
+ ( ) =>
34
+ resolve (
35
+ ids . map ( id => ( id === docs . id1 . _id ? docs . id1 : docs . id2 ) )
36
+ ) ,
37
+ 0
38
+ )
33
39
} )
34
40
} ) )
35
41
}
@@ -46,61 +52,61 @@ describe('createCachingMethods', () => {
46
52
} )
47
53
48
54
it ( 'finds one' , async ( ) => {
49
- const doc = await api . findOneById ( ' id1' )
55
+ const doc = await api . findOneById ( docs . id1 . _id )
50
56
expect ( doc ) . toBe ( docs . id1 )
51
57
expect ( collection . find . mock . calls . length ) . toBe ( 1 )
52
58
} )
53
59
54
60
it ( 'finds two with batching' , async ( ) => {
55
- const foundDocs = await api . findManyByIds ( [ 'id2' , 'id3' ] )
61
+ const foundDocs = await api . findManyByIds ( [ docs . id1 . _id , docs . id2 . _id ] )
56
62
57
- expect ( foundDocs [ 0 ] ) . toBe ( docs . id2 )
58
- expect ( foundDocs [ 1 ] ) . toBe ( docs . id3 )
63
+ expect ( foundDocs [ 0 ] ) . toBe ( docs . id1 )
64
+ expect ( foundDocs [ 1 ] ) . toBe ( docs . id2 )
59
65
60
66
expect ( collection . find . mock . calls . length ) . toBe ( 1 )
61
67
} )
62
68
63
69
// TODO why doesn't this pass?
64
70
// it.only(`doesn't cache without ttl`, async () => {
65
- // await api.findOneById(' id1' )
66
- // await api.findOneById(' id1' )
71
+ // await api.findOneById(docs. id1._id )
72
+ // await api.findOneById(docs. id1._id )
67
73
68
74
// expect(collection.find.mock.calls.length).toBe(2)
69
75
// })
70
76
71
77
it ( `doesn't cache without ttl` , async ( ) => {
72
- await api . findOneById ( ' id1' )
78
+ await api . findOneById ( docs . id1 . _id )
73
79
74
- const value = await cache . get ( cacheKey ( ' id1' ) )
80
+ const value = await cache . get ( cacheKey ( docs . id1 . _id ) )
75
81
expect ( value ) . toBeUndefined ( )
76
82
} )
77
83
78
84
it ( `caches` , async ( ) => {
79
- await api . findOneById ( ' id1' , { ttl : 1 } )
80
- const value = await cache . get ( cacheKey ( ' id1' ) )
81
- expect ( JSON . parse ( value ) ) . toEqual ( docs . id1 )
85
+ await api . findOneById ( docs . id1 . _id , { ttl : 1 } )
86
+ const value = await cache . get ( cacheKey ( docs . id1 . _id ) )
87
+ expect ( value ) . toEqual ( EJSON . stringify ( docs . id1 ) )
82
88
83
- await api . findOneById ( ' id1' )
89
+ await api . findOneById ( docs . id1 . _id )
84
90
expect ( collection . find . mock . calls . length ) . toBe ( 1 )
85
91
} )
86
92
87
93
it ( `caches with ttl` , async ( ) => {
88
- await api . findOneById ( ' id1' , { ttl : 1 } )
94
+ await api . findOneById ( docs . id1 . _id , { ttl : 1 } )
89
95
await wait ( 1001 )
90
96
91
- const value = await cache . get ( cacheKey ( ' id1' ) )
97
+ const value = await cache . get ( cacheKey ( docs . id1 . _id ) )
92
98
expect ( value ) . toBeUndefined ( )
93
99
} )
94
100
95
101
it ( `deletes from cache` , async ( ) => {
96
- await api . findOneById ( ' id1' , { ttl : 1 } )
102
+ await api . findOneById ( docs . id1 . _id , { ttl : 1 } )
97
103
98
- const valueBefore = await cache . get ( cacheKey ( ' id1' ) )
99
- expect ( JSON . parse ( valueBefore ) ) . toEqual ( docs . id1 )
104
+ const valueBefore = await cache . get ( cacheKey ( docs . id1 . _id ) )
105
+ expect ( valueBefore ) . toEqual ( EJSON . stringify ( docs . id1 ) )
100
106
101
- await api . deleteFromCacheById ( ' id1' )
107
+ await api . deleteFromCacheById ( docs . id1 . _id )
102
108
103
- const valueAfter = await cache . get ( cacheKey ( ' id1' ) )
109
+ const valueAfter = await cache . get ( cacheKey ( docs . id1 . _id ) )
104
110
expect ( valueAfter ) . toBeUndefined ( )
105
111
} )
106
112
} )
0 commit comments