@@ -23,6 +23,9 @@ describe('Cache plugin (redis)', () => {
2323
2424 redis = new Redis ( process . env [ 'REDIS_URL' ] as string )
2525
26+ expire . mockClear ( )
27+ sadd . mockClear ( )
28+
2629 await db . $pushSchema ( )
2730 await redis . flushdb ( )
2831 } )
@@ -1044,4 +1047,65 @@ describe('Cache plugin (redis)', () => {
10441047
10451048 expect ( sadd . mock . lastCall ! [ 0 ] ) . toBe ( 'zenstack:cache:tag:test' )
10461049 } )
1050+
1051+ it ( 'handles tag set ttls' , async ( ) => {
1052+ const extDb = db . $use (
1053+ defineCachePlugin ( {
1054+ provider : new RedisCacheProvider ( {
1055+ url : process . env [ 'REDIS_URL' ] as string ,
1056+ } ) ,
1057+ } ) ,
1058+ )
1059+
1060+ await extDb . user . findMany ( {
1061+ cache : {
1062+ tags : [ 'test' ] ,
1063+ } ,
1064+ } )
1065+
1066+ expect ( expire ) . not . toHaveBeenCalled ( )
1067+
1068+ await extDb . user . findMany ( {
1069+ cache : {
1070+ ttl : 30 ,
1071+ tags : [ 'test' ] ,
1072+ } ,
1073+ } )
1074+
1075+ // A tag set's TTL should be the highest TTL of the keys in it.
1076+ await expect ( redis . ttl ( 'zenstack:cache:tag:test' ) ) . resolves . toBeCloseTo ( 30 , 2 )
1077+
1078+ await extDb . user . exists ( {
1079+ cache : {
1080+ ttl : 40 ,
1081+ tags : [ 'test' , 'test2' ] ,
1082+ } ,
1083+ } )
1084+
1085+ await expect ( redis . ttl ( 'zenstack:cache:tag:test' ) ) . resolves . toBeCloseTo ( 40 , 2 )
1086+ await expect ( redis . ttl ( 'zenstack:cache:tag:test2' ) ) . resolves . toBeCloseTo ( 40 , 2 )
1087+
1088+ // A lower TTL does not change them.
1089+ await extDb . user . findFirst ( {
1090+ cache : {
1091+ ttl : 10 ,
1092+ tags : [ 'test' , 'test2' ] ,
1093+ } ,
1094+ } )
1095+
1096+ await expect ( redis . ttl ( 'zenstack:cache:tag:test' ) ) . resolves . toBeCloseTo ( 40 , 2 )
1097+ await expect ( redis . ttl ( 'zenstack:cache:tag:test2' ) ) . resolves . toBeCloseTo ( 40 , 2 )
1098+
1099+ // Should work with SWR too.
1100+ await extDb . user . findFirst ( {
1101+ cache : {
1102+ swr : 80 ,
1103+ tags : [ 'test' , 'test2' , 'test3' ] ,
1104+ } ,
1105+ } )
1106+
1107+ await expect ( redis . ttl ( 'zenstack:cache:tag:test' ) ) . resolves . toBeCloseTo ( 80 , 2 )
1108+ await expect ( redis . ttl ( 'zenstack:cache:tag:test2' ) ) . resolves . toBeCloseTo ( 80 , 2 )
1109+ await expect ( redis . ttl ( 'zenstack:cache:tag:test3' ) ) . resolves . toBeCloseTo ( 80 , 2 )
1110+ } )
10471111} )
0 commit comments