import { Request } from 'express' ; import { getCacheKey } from './get-cache-key' ; const restUrl = 'http://localhost/items/example' ; const graphQlUrl = 'http://localhost/graphql' ; const accountability = { user : '00000000-0000-0000-0000-000000000000' } ; const requests = [ { name : 'as unauthenticated request' , params : { originalUrl : restUrl } , key : '17da8272c9a0ec6eea38a37d6d78bddeb7c79045' , } , { name : 'as authenticated request' , params : { originalUrl : restUrl , accountability } , key : '99a6394222a3d7d149ac1662fc2fff506932db58' , } , { name : 'a request with a fields query' , params : { originalUrl : restUrl , sanitizedQuery : { fields : [ 'id' , 'name' ] } } , key : 'aa6e2d8a78de4dfb4af6eaa230d1cd9b7d31ed19' , } , { name : 'a request with a filter query' , params : { originalUrl : restUrl , sanitizedQuery : { filter : { name : { _eq : 'test' } } } } , key : 'd7eb8970f0429e1cf85e12eb5bb8669f618b09d3' , } , { name : 'a GraphQL query request' , params : { originalUrl : graphQlUrl , query : { query : 'query { test { id } }' } } , key : '201731b75c627c60554512d819b6935b54c73814' , } , ] ; const cases = requests . map ( ( { name , params , key } ) => [ name , params , key ] ) ; describe ( 'get cache key' , ( ) => { test . each ( cases ) ( 'should create a cache key for %s' , ( _ , params , key ) => { expect ( getCacheKey ( params as unknown as Request ) ) . toEqual ( key ) ; } ) ; test ( 'should create a unique key for each request' , ( ) => { const keys = requests . map ( ( r ) => r . key ) ; const hasDuplicate = keys . some ( ( key ) => keys . indexOf ( key ) !== keys . lastIndexOf ( key ) ) ; expect ( hasDuplicate ) . toBeFalsy ( ) ; } ) ; test ( 'should create a unique key for GraphQL requests with different variables' , ( ) => { const query = 'query Test ($name: String) { test (filter: { name: { _eq: $name } }) { id } }' ; const operationName = 'test' ; const variables1 = JSON . stringify ( { name : 'test 1' } ) ; const variables2 = JSON . stringify ( { name : 'test 2' } ) ; const req1 = { originalUrl : graphQlUrl , query : { query , operationName , variables : variables1 } } ; const req2 = { originalUrl : graphQlUrl , query : { query , operationName , variables : variables2 } } ; expect ( getCacheKey ( req1 ) ) . not . toEqual ( getCacheKey ( req2 ) ) ; } ) ; } ) ;