@@ -55,9 +55,10 @@ describe("redisRunner", () => {
55
55
56
56
afterEach ( async ( ) => {
57
57
await tx . rollback ( ) ;
58
+ jest . clearAllMocks ( ) ;
58
59
} ) ;
59
60
60
- it ( "redis test " , async ( ) => {
61
+ it ( "redis" , async ( ) => {
61
62
const setValueWithExpireSpy = jest . spyOn (
62
63
distributedLock ,
63
64
"setValueWithExpire"
@@ -68,6 +69,7 @@ describe("redisRunner", () => {
68
69
"checkLockExistsAndReturnValue"
69
70
) ;
70
71
getAllTenantIdsSpy
72
+ . mockResolvedValueOnce ( tenantIds )
71
73
. mockResolvedValueOnce ( tenantIds )
72
74
. mockResolvedValueOnce ( tenantIds ) ;
73
75
const p1 = runner . _ . _multiInstanceAndTenancy ( ) ;
@@ -95,5 +97,64 @@ describe("redisRunner", () => {
95
97
tenantChecks [ tenantId ] . values . push ( result ) ;
96
98
}
97
99
expect ( tenantChecks ) . toMatchSnapshot ( ) ;
100
+
101
+ // another run within 5 minutes should do nothing
102
+ await runner . _ . _multiInstanceAndTenancy ( ) ;
103
+ expect ( acquireLockSpy ) . toHaveBeenCalledTimes ( 9 ) ;
104
+ expect ( eventQueueRunnerSpy ) . toHaveBeenCalledTimes ( 3 ) ;
105
+ } ) ;
106
+
107
+ it ( "db" , async ( ) => {
108
+ jest
109
+ . spyOn ( cdsHelper , "executeInNewTransaction" )
110
+ . mockImplementation ( async ( context = { } , transactionTag , fn ) => {
111
+ await fn ( tx ) ;
112
+ } ) ;
113
+ configInstance . isOnCF = false ;
114
+ const acquireLockSpy = jest . spyOn ( distributedLock , "acquireLock" ) ;
115
+ getAllTenantIdsSpy
116
+ . mockResolvedValueOnce ( tenantIds )
117
+ . mockResolvedValueOnce ( tenantIds )
118
+ . mockResolvedValueOnce ( tenantIds )
119
+ . mockResolvedValueOnce ( tenantIds ) ;
120
+ const p1 = runner . _ . _singleInstanceAndMultiTenancy ( ) ;
121
+ const p2 = runner . _ . _singleInstanceAndMultiTenancy ( ) ;
122
+
123
+ await Promise . allSettled ( [ p1 , p2 ] ) ;
124
+
125
+ expect ( acquireLockSpy ) . toHaveBeenCalledTimes ( 6 ) ;
126
+ expect ( eventQueueRunnerSpy ) . toHaveBeenCalledTimes ( 3 ) ;
127
+
128
+ const acquireLockMock = acquireLockSpy . mock ;
129
+ const runId = acquireLockMock . calls [ 0 ] [ 1 ] ;
130
+
131
+ const tenantChecks = tenantIds . reduce ( ( result , tenantId ) => {
132
+ result [ tenantId ] = { numberOfChecks : 0 , values : [ ] } ;
133
+ return result ;
134
+ } , { } ) ;
135
+ for ( let i = 0 ; i < 6 ; i ++ ) {
136
+ const tenantId = acquireLockMock . calls [ i ] [ 0 ] . tenant ;
137
+ expect ( runId ) . toEqual ( acquireLockMock . calls [ i ] [ 1 ] ) ;
138
+ const result = await acquireLockMock . results [ i ] . value ;
139
+ tenantChecks [ tenantId ] . numberOfChecks ++ ;
140
+ tenantChecks [ tenantId ] . values . push ( result ) ;
141
+ }
142
+ expect ( tenantChecks ) . toMatchSnapshot ( ) ;
143
+
144
+ // another run within 5 minutes should do nothing
145
+ await runner . _ . _singleInstanceAndMultiTenancy ( ) ;
146
+ expect ( eventQueueRunnerSpy ) . toHaveBeenCalledTimes ( 3 ) ;
147
+ expect ( acquireLockSpy ) . toHaveBeenCalledTimes ( 9 ) ;
148
+
149
+ // 5 mins later the tenants should be processed again
150
+ await tx . run (
151
+ UPDATE . entity ( "sap.core.EventLock" ) . set ( {
152
+ createdAt : new Date ( Date . now ( ) - 5 * 60 * 1000 ) . toISOString ( ) ,
153
+ } )
154
+ ) ;
155
+
156
+ await runner . _ . _singleInstanceAndMultiTenancy ( ) ;
157
+ expect ( acquireLockSpy ) . toHaveBeenCalledTimes ( 12 ) ;
158
+ expect ( eventQueueRunnerSpy ) . toHaveBeenCalledTimes ( 6 ) ;
98
159
} ) ;
99
160
} ) ;
0 commit comments