@@ -6,8 +6,12 @@ import {
66 type GitHubFetcherDependencies ,
77} from "@/lib/github" ;
88import {
9+ DEFAULT_CACHE_NAMESPACE ,
910 DEFAULT_GITHUB_CACHE_TTL_SECONDS ,
1011 getCacheConfigFromEnv ,
12+ getCacheNamespaceFromEnv ,
13+ getCacheTtlSecondsFromEnv ,
14+ MAX_CACHE_TTL_SECONDS ,
1115 type CacheStore ,
1216} from "@/lib/cache-store" ;
1317import type { GitHubUserData } from "@/types/github" ;
@@ -16,6 +20,12 @@ type ExecuteCall = {
1620 operationName : string ;
1721} ;
1822
23+ function makeProcessEnv (
24+ values : Record < string , string > = { } ,
25+ ) : NodeJS . ProcessEnv {
26+ return { NODE_ENV : "test" , ...values } ;
27+ }
28+
1929function makeExecutor (
2030 calls : ExecuteCall [ ] ,
2131 delayMs = 0 ,
@@ -496,4 +506,67 @@ describe("GitHub user data caching", () => {
496506 const config = getCacheConfigFromEnv ( { } as NodeJS . ProcessEnv ) ;
497507 expect ( config . ttlSeconds ) . toBe ( DEFAULT_GITHUB_CACHE_TTL_SECONDS ) ;
498508 } ) ;
509+
510+ test ( "reads cache TTL aliases with Redis-specific precedence" , ( ) => {
511+ expect (
512+ getCacheTtlSecondsFromEnv ( makeProcessEnv ( {
513+ REDIS_CACHE_TTL_SECONDS : "3600" ,
514+ CACHE_TTL_SECONDS : "7200" ,
515+ } ) ) ,
516+ ) . toBe ( 3600 ) ;
517+ expect (
518+ getCacheTtlSecondsFromEnv ( makeProcessEnv ( {
519+ CACHE_TTL_SECONDS : "7200" ,
520+ } ) ) ,
521+ ) . toBe ( 7200 ) ;
522+ } ) ;
523+
524+ test . each ( [ "0" , "-1" , "1.5" , "42seconds" , `${ MAX_CACHE_TTL_SECONDS + 1 } ` ] ) (
525+ "rejects invalid cache TTL %s" ,
526+ ( value ) => {
527+ expect (
528+ getCacheTtlSecondsFromEnv ( makeProcessEnv ( {
529+ REDIS_CACHE_TTL_SECONDS : value ,
530+ } ) ) ,
531+ ) . toBe ( DEFAULT_GITHUB_CACHE_TTL_SECONDS ) ;
532+ } ,
533+ ) ;
534+
535+ test ( "falls through to the TTL alias when the preferred value is invalid" , ( ) => {
536+ expect (
537+ getCacheTtlSecondsFromEnv ( makeProcessEnv ( {
538+ REDIS_CACHE_TTL_SECONDS : "invalid" ,
539+ CACHE_TTL_SECONDS : "1800" ,
540+ } ) ) ,
541+ ) . toBe ( 1800 ) ;
542+ } ) ;
543+
544+ test ( "accepts the maximum cache TTL" , ( ) => {
545+ expect (
546+ getCacheTtlSecondsFromEnv ( makeProcessEnv ( {
547+ REDIS_CACHE_TTL_SECONDS : `${ MAX_CACHE_TTL_SECONDS } ` ,
548+ } ) ) ,
549+ ) . toBe ( MAX_CACHE_TTL_SECONDS ) ;
550+ } ) ;
551+
552+ test ( "reads, trims, and validates cache namespace aliases" , ( ) => {
553+ expect (
554+ getCacheNamespaceFromEnv ( makeProcessEnv ( {
555+ REDIS_CACHE_NAMESPACE : " deployment:v2 " ,
556+ CACHE_NAMESPACE : "fallback:v1" ,
557+ } ) ) ,
558+ ) . toBe ( "deployment:v2" ) ;
559+ expect (
560+ getCacheNamespaceFromEnv ( makeProcessEnv ( {
561+ REDIS_CACHE_NAMESPACE : " " ,
562+ CACHE_NAMESPACE : " fallback:v1 " ,
563+ } ) ) ,
564+ ) . toBe ( "fallback:v1" ) ;
565+ expect (
566+ getCacheNamespaceFromEnv ( makeProcessEnv ( {
567+ REDIS_CACHE_NAMESPACE : " " ,
568+ CACHE_NAMESPACE : "" ,
569+ } ) ) ,
570+ ) . toBe ( DEFAULT_CACHE_NAMESPACE ) ;
571+ } ) ;
499572} ) ;
0 commit comments