1- import { KeyValueCache } from '@apollo/utils.keyvaluecache' ;
1+ import type { KeyValueCache } from '@apollo/utils.keyvaluecache' ;
22import { mergeConfig } from '@vendure/core' ;
33import { createTestEnvironment } from '@vendure/testing' ;
44import path from 'path' ;
5- import { afterAll , beforeAll , describe , expect , it } from 'vitest' ;
5+ import { afterAll , beforeAll , beforeEach , describe , expect , it , vi } from 'vitest' ;
66
77import { initialData } from '../../../e2e-common/e2e-initial-data' ;
88import { TEST_SETUP_TIMEOUT_MS , testConfig } from '../../../e2e-common/test-config' ;
99
1010import * as Codegen from './graphql/generated-e2e-admin-types' ;
1111import { GET_PRODUCT_LIST , GET_PRODUCT_SIMPLE } from './graphql/shared-definitions' ;
1212
13- class MockCache implements KeyValueCache < string > {
14- static getCalls : Array < { key : string ; result : string | undefined } > = [ ] ;
15- static setCalls : Array < { key : string ; value : string ; options ?: { ttl ?: number } } > = [ ] ;
16- static deleteCalls : Array < { key : string ; result : boolean } > = [ ] ;
17-
18- private store = new Map < string , string > ( ) ;
19-
20- static reset ( ) {
21- this . getCalls = [ ] ;
22- this . setCalls = [ ] ;
23- this . deleteCalls = [ ] ;
24- }
25-
26- get ( key : string ) : Promise < string | undefined > {
27- // eslint-disable-next-line
28- console . log ( `MockCache get: ${ key } ` ) ;
29- const result = this . store . get ( key ) ;
30- MockCache . getCalls . push ( { key, result } ) ;
31- return Promise . resolve ( result ) ;
32- }
33-
34- set ( key : string , value : string , options ?: { ttl ?: number } ) : Promise < void > {
35- // eslint-disable-next-line
36- console . log ( `MockCache set: ${ key } ` , value ) ;
37- this . store . set ( key , value ) ;
38- MockCache . setCalls . push ( { key, value, options } ) ;
39- return Promise . resolve ( ) ;
40- }
41-
42- delete ( key : string ) : Promise < boolean > {
43- const result = this . store . delete ( key ) ;
44- MockCache . deleteCalls . push ( { key, result } ) ;
45- return Promise . resolve ( result ) ;
46- }
47- }
48-
4913describe ( 'Apollo cache configuration' , ( ) => {
5014 describe ( 'with custom cache implementation' , ( ) => {
51- const mockCache = new MockCache ( ) ;
15+ const mockCache : KeyValueCache < string > = {
16+ get : vi . fn ( ) . mockResolvedValue ( undefined ) ,
17+ set : vi . fn ( ) . mockResolvedValue ( undefined ) ,
18+ delete : vi . fn ( ) . mockResolvedValue ( true ) ,
19+ } ;
20+
5221 const { server, adminClient, shopClient } = createTestEnvironment (
5322 mergeConfig ( testConfig ( ) , {
5423 apiOptions : {
@@ -66,14 +35,16 @@ describe('Apollo cache configuration', () => {
6635 await adminClient . asSuperAdmin ( ) ;
6736 } , TEST_SETUP_TIMEOUT_MS ) ;
6837
38+ beforeEach ( ( ) => {
39+ vi . clearAllMocks ( ) ;
40+ } ) ;
41+
6942 afterAll ( async ( ) => {
7043 await server . destroy ( ) ;
7144 } ) ;
7245
7346 it ( 'should configure Apollo Server with custom cache' , async ( ) => {
74- MockCache . reset ( ) ;
75-
76- // Make a GraphQL query that could potentially be cached
47+ // Make a GraphQL query
7748 const result = await shopClient . query <
7849 Codegen . GetProductListQuery ,
7950 Codegen . GetProductListQueryVariables
@@ -87,12 +58,18 @@ describe('Apollo cache configuration', () => {
8758 expect ( result . products . items . length ) . toBe ( 1 ) ;
8859 expect ( result . products . items [ 0 ] . id ) . toBe ( 'T_1' ) ;
8960 expect ( result . products . items [ 0 ] . name ) . toBe ( 'Laptop' ) ;
90- } ) ;
9161
92- it ( 'should handle cache operations without errors' , async ( ) => {
93- MockCache . reset ( ) ;
62+ // The custom cache is configured and available to Apollo Server
63+ // Apollo Server may use the cache for internal operations
64+ // The fact that queries execute without errors confirms proper configuration
65+ expect ( mockCache ) . toBeDefined ( ) ;
66+ expect ( typeof mockCache . get ) . toBe ( 'function' ) ;
67+ expect ( typeof mockCache . set ) . toBe ( 'function' ) ;
68+ expect ( typeof mockCache . delete ) . toBe ( 'function' ) ;
69+ } ) ;
9470
95- // Test multiple queries to potentially trigger cache operations
71+ it ( 'should handle multiple queries without errors' , async ( ) => {
72+ // Test multiple queries
9673 const shopResponse = await shopClient . query <
9774 Codegen . GetProductListQuery ,
9875 Codegen . GetProductListQueryVariables
@@ -112,11 +89,13 @@ describe('Apollo cache configuration', () => {
11289 } ) ;
11390
11491 expect ( adminResponse . products . items . length ) . toBe ( 1 ) ;
92+
93+ // Both queries execute successfully with the custom cache configured
94+ expect ( shopResponse ) . toBeDefined ( ) ;
95+ expect ( adminResponse ) . toBeDefined ( ) ;
11596 } ) ;
11697
11798 it ( 'should work with both shop and admin APIs' , async ( ) => {
118- MockCache . reset ( ) ;
119-
12099 const [ shopResult , adminResult ] = await Promise . all ( [
121100 shopClient . query < Codegen . GetProductSimpleQuery , Codegen . GetProductSimpleQueryVariables > (
122101 GET_PRODUCT_SIMPLE ,
@@ -135,89 +114,7 @@ describe('Apollo cache configuration', () => {
135114 expect ( shopResult . product ) . toBeDefined ( ) ;
136115 expect ( adminResult . product ) . toBeDefined ( ) ;
137116 expect ( shopResult . product ?. id ) . toBe ( adminResult . product ?. id ) ;
138- } ) ;
139- } ) ;
140-
141- describe ( 'with bounded cache' , ( ) => {
142- const { server, adminClient, shopClient } = createTestEnvironment (
143- mergeConfig ( testConfig ( ) , {
144- apiOptions : {
145- cache : 'bounded' ,
146- } ,
147- } ) ,
148- ) ;
149-
150- beforeAll ( async ( ) => {
151- await server . init ( {
152- initialData,
153- productsCsvPath : path . join ( __dirname , 'fixtures/e2e-products-minimal.csv' ) ,
154- customerCount : 1 ,
155- } ) ;
156- await adminClient . asSuperAdmin ( ) ;
157- } , TEST_SETUP_TIMEOUT_MS ) ;
158-
159- afterAll ( async ( ) => {
160- await server . destroy ( ) ;
161- } ) ;
162-
163- it ( 'should configure Apollo Server with bounded cache' , async ( ) => {
164- const result = await shopClient . query <
165- Codegen . GetProductSimpleQuery ,
166- Codegen . GetProductSimpleQueryVariables
167- > ( GET_PRODUCT_SIMPLE , {
168- id : 'T_1' ,
169- } ) ;
170-
171- expect ( result . product ) . toBeDefined ( ) ;
172- expect ( result . product ?. id ) . toBe ( 'T_1' ) ;
173- } ) ;
174-
175- it ( 'should handle concurrent requests with bounded cache' , async ( ) => {
176- const queries = Array . from ( { length : 5 } , ( _ , i ) =>
177- shopClient . query < Codegen . GetProductSimpleQuery , Codegen . GetProductSimpleQueryVariables > (
178- GET_PRODUCT_SIMPLE ,
179- {
180- id : `T_${ i + 1 } ` ,
181- } ,
182- ) ,
183- ) ;
184-
185- const results = await Promise . all ( queries ) ;
186-
187- results . forEach ( ( result , index ) => {
188- if ( result . product ) {
189- expect ( result . product . id ) . toBe ( `T_${ index + 1 } ` ) ;
190- }
191- } ) ;
192- } ) ;
193- } ) ;
194-
195- describe ( 'without cache configuration' , ( ) => {
196- const { server, adminClient, shopClient } = createTestEnvironment ( testConfig ( ) ) ;
197-
198- beforeAll ( async ( ) => {
199- await server . init ( {
200- initialData,
201- productsCsvPath : path . join ( __dirname , 'fixtures/e2e-products-minimal.csv' ) ,
202- customerCount : 1 ,
203- } ) ;
204- await adminClient . asSuperAdmin ( ) ;
205- } , TEST_SETUP_TIMEOUT_MS ) ;
206-
207- afterAll ( async ( ) => {
208- await server . destroy ( ) ;
209- } ) ;
210-
211- it ( 'should work without cache configuration' , async ( ) => {
212- const result = await shopClient . query <
213- Codegen . GetProductSimpleQuery ,
214- Codegen . GetProductSimpleQueryVariables
215- > ( GET_PRODUCT_SIMPLE , {
216- id : 'T_1' ,
217- } ) ;
218-
219- expect ( result . product ) . toBeDefined ( ) ;
220- expect ( result . product ?. id ) . toBe ( 'T_1' ) ;
117+ expect ( shopResult . product ?. id ) . toBe ( 'T_1' ) ;
221118 } ) ;
222119 } ) ;
223120} ) ;
0 commit comments