@@ -12,6 +12,7 @@ import { EventLimits, Settings } from '../../../src/@types/settings'
1212import { IncomingEventMessage , MessageType } from '../../../src/@types/messages'
1313import { Event } from '../../../src/@types/event'
1414import { EventKinds } from '../../../src/constants/base'
15+ import { CacheAdmissionState } from '../../../src/constants/caching'
1516import { EventMessageHandler } from '../../../src/handlers/event-message-handler'
1617import { IUserRepository } from '../../../src/@types/repositories'
1718import { IWebSocketAdapter } from '../../../src/@types/adapters'
@@ -88,7 +89,8 @@ describe('EventMessageHandler', () => {
8889 ( ) => ( {
8990 info : { relay_url : 'relay_url' } ,
9091 } ) as any ,
91- ( ) => ( { hit : async ( ) => false } )
92+ ( ) => ( { hit : async ( ) => false } ) ,
93+ { hasKey : async ( ) => false , setKey : async ( ) => true } as any ,
9294 )
9395 } )
9496
@@ -262,7 +264,8 @@ describe('EventMessageHandler', () => {
262264 { hasActiveRequestToVanish : async ( ) => false } as any ,
263265 userRepository ,
264266 ( ) => settings ,
265- ( ) => ( { hit : async ( ) => false } )
267+ ( ) => ( { hit : async ( ) => false } ) ,
268+ { hasKey : async ( ) => false , setKey : async ( ) => true } as any ,
266269 )
267270 } )
268271
@@ -738,7 +741,8 @@ describe('EventMessageHandler', () => {
738741 { hasActiveRequestToVanish : async ( ) => false } as any ,
739742 userRepository ,
740743 ( ) => settings ,
741- ( ) => ( { hit : rateLimiterHitStub } )
744+ ( ) => ( { hit : rateLimiterHitStub } ) ,
745+ { hasKey : async ( ) => false , setKey : async ( ) => true } as any ,
742746 )
743747 } )
744748
@@ -953,6 +957,7 @@ describe('EventMessageHandler', () => {
953957 let webSocket : IWebSocketAdapter
954958 let getRelayPublicKeyStub : SinonStub
955959 let userRepositoryFindByPubkeyStub : SinonStub
960+ let cacheStub : any
956961
957962 beforeEach ( ( ) => {
958963 settings = {
@@ -1000,13 +1005,19 @@ describe('EventMessageHandler', () => {
10001005 userRepository = {
10011006 findByPubkey : userRepositoryFindByPubkeyStub ,
10021007 } as any
1008+ cacheStub = {
1009+ hasKey : sandbox . stub ( ) . resolves ( false ) ,
1010+ getKey : sandbox . stub ( ) . resolves ( null ) ,
1011+ setKey : sandbox . stub ( ) . resolves ( true ) ,
1012+ }
10031013 handler = new EventMessageHandler (
10041014 webSocket ,
10051015 ( ) => null ,
10061016 { hasActiveRequestToVanish : async ( ) => false } as any ,
10071017 userRepository ,
10081018 ( ) => settings ,
1009- ( ) => ( { hit : async ( ) => false } )
1019+ ( ) => ( { hit : async ( ) => false } ) ,
1020+ cacheStub ,
10101021 )
10111022 } )
10121023
@@ -1108,5 +1119,51 @@ describe('EventMessageHandler', () => {
11081119
11091120 return expect ( ( handler as any ) . isUserAdmitted ( event ) ) . to . eventually . be . undefined
11101121 } )
1122+
1123+ describe ( 'caching' , ( ) => {
1124+ it ( 'fulfills with undefined and uses cache hit for admitted user without hitting DB' , async ( ) => {
1125+ cacheStub . getKey . resolves ( CacheAdmissionState . ADMITTED )
1126+
1127+ await expect ( ( handler as any ) . isUserAdmitted ( event ) ) . to . eventually . be . undefined
1128+ expect ( userRepositoryFindByPubkeyStub ) . not . to . have . been . called
1129+ } )
1130+
1131+ it ( 'fulfills with reason and uses cache hit for blocked user without hitting DB' , async ( ) => {
1132+ cacheStub . getKey . resolves ( CacheAdmissionState . BLOCKED_NOT_ADMITTED )
1133+
1134+ await expect ( ( handler as any ) . isUserAdmitted ( event ) ) . to . eventually . equal ( 'blocked: pubkey not admitted' )
1135+ expect ( userRepositoryFindByPubkeyStub ) . not . to . have . been . called
1136+ } )
1137+
1138+ it ( 'fulfills with reason and uses cache hit for insufficient balance without hitting DB' , async ( ) => {
1139+ cacheStub . getKey . resolves ( CacheAdmissionState . BLOCKED_INSUFFICIENT_BALANCE )
1140+
1141+ await expect ( ( handler as any ) . isUserAdmitted ( event ) ) . to . eventually . equal ( 'blocked: insufficient balance' )
1142+ expect ( userRepositoryFindByPubkeyStub ) . not . to . have . been . called
1143+ } )
1144+
1145+ it ( 'caches blocked status with 60s ttl when user is not found' , async ( ) => {
1146+ userRepositoryFindByPubkeyStub . resolves ( undefined )
1147+
1148+ await ( handler as any ) . isUserAdmitted ( event )
1149+ expect ( cacheStub . setKey ) . to . have . been . calledWith ( `${ event . pubkey } :is-admitted` , CacheAdmissionState . BLOCKED_NOT_ADMITTED , 60 )
1150+ } )
1151+
1152+ it ( 'caches insufficient balance status with 60s ttl when user balance is too low' , async ( ) => {
1153+ settings . limits . event . pubkey . minBalance = 100n
1154+ userRepositoryFindByPubkeyStub . resolves ( { isAdmitted : true , balance : 50n } )
1155+
1156+ await ( handler as any ) . isUserAdmitted ( event )
1157+ expect ( cacheStub . setKey ) . to . have . been . calledWith ( `${ event . pubkey } :is-admitted` , CacheAdmissionState . BLOCKED_INSUFFICIENT_BALANCE , 60 )
1158+ } )
1159+
1160+ it ( 'caches admitted status with 300s ttl when user is admitted and has balance' , async ( ) => {
1161+ settings . limits . event . pubkey . minBalance = 100n
1162+ userRepositoryFindByPubkeyStub . resolves ( { isAdmitted : true , balance : 150n } )
1163+
1164+ await ( handler as any ) . isUserAdmitted ( event )
1165+ expect ( cacheStub . setKey ) . to . have . been . calledWith ( `${ event . pubkey } :is-admitted` , CacheAdmissionState . ADMITTED , 300 )
1166+ } )
1167+ } )
11111168 } )
11121169} )
0 commit comments