@@ -10,13 +10,15 @@ const {
1010 mockSignalTableRowsChanged,
1111 mockTask,
1212 mockWithLockedTable,
13+ mockFireTableTrigger,
1314} = vi . hoisted ( ( ) => ( {
1415 mockDeleteExecute : vi . fn ( ) ,
1516 mockListExecute : vi . fn ( ) ,
1617 mockIsTableRowTtlEnabled : vi . fn ( ) ,
1718 mockSignalTableRowsChanged : vi . fn ( ) ,
1819 mockTask : vi . fn ( ( config : unknown ) => config ) ,
1920 mockWithLockedTable : vi . fn ( ) ,
21+ mockFireTableTrigger : vi . fn ( ) ,
2022} ) )
2123
2224vi . mock ( '@sim/db' , ( ) => ( {
@@ -29,16 +31,25 @@ vi.mock('@/lib/table/service', () => ({ withLockedTable: mockWithLockedTable }))
2931vi . mock ( '@/lib/table/ttl-availability' , ( ) => ( {
3032 isTableRowTtlEnabled : mockIsTableRowTtlEnabled ,
3133} ) )
34+ vi . mock ( '@/lib/table/trigger' , ( ) => ( { fireTableTrigger : mockFireTableTrigger } ) )
3235
3336import { cleanupTableRowTtlTask , runCleanupTableRowTtl } from '@/background/cleanup-table-row-ttl'
3437
3538const table = {
3639 id : 'table-1' ,
40+ name : 'Expiring rows' ,
3741 workspaceId : 'workspace-1' ,
3842 schema : { columns : [ { id : 'col-ttl' , name : 'expires_at' , type : 'ttl' } ] } ,
3943 locks : { insertLocked : false , updateLocked : false , deleteLocked : false , schemaLocked : false } ,
4044}
4145
46+ function deletedRows ( count : number , start = 1 ) {
47+ return Array . from ( { length : count } , ( _ , index ) => {
48+ const number = start + index
49+ return { id : `row-${ number } ` , data : { value : number } }
50+ } )
51+ }
52+
4253describe ( 'table row TTL cleanup' , ( ) => {
4354 beforeEach ( ( ) => {
4455 vi . clearAllMocks ( )
@@ -57,8 +68,8 @@ describe('table row TTL cleanup', () => {
5768
5869 it ( 'deletes expired rows in locked, keyset batches and signals the table' , async ( ) => {
5970 mockDeleteExecute
60- . mockResolvedValueOnce ( [ { count : 500 , lastId : 'row-500' } ] )
61- . mockResolvedValueOnce ( [ { count : 12 , lastId : 'row-512' } ] )
71+ . mockResolvedValueOnce ( deletedRows ( 500 ) )
72+ . mockResolvedValueOnce ( deletedRows ( 12 , 501 ) )
6273
6374 await expect ( runCleanupTableRowTtl ( ) ) . resolves . toEqual ( {
6475 batches : 2 ,
@@ -68,13 +79,24 @@ describe('table row TTL cleanup', () => {
6879 expect ( mockWithLockedTable ) . toHaveBeenCalledTimes ( 2 )
6980 expect ( mockDeleteExecute ) . toHaveBeenCalledTimes ( 2 )
7081 expect ( mockSignalTableRowsChanged ) . toHaveBeenCalledWith ( table . id )
82+ expect ( mockFireTableTrigger ) . toHaveBeenCalledTimes ( 2 )
83+ expect ( mockFireTableTrigger ) . toHaveBeenNthCalledWith (
84+ 1 ,
85+ table . id ,
86+ table . name ,
87+ 'delete' ,
88+ deletedRows ( 500 ) ,
89+ null ,
90+ table . schema ,
91+ 'ttl-cleanup'
92+ )
7193 } )
7294
7395 it ( 'compares TTL values with whole Date.now epoch seconds' , async ( ) => {
7496 const nowEpochMilliseconds = 1_700_000_000_999
7597 const nowEpochSeconds = 1_700_000_000
7698 const nowSpy = vi . spyOn ( Date , 'now' ) . mockReturnValue ( nowEpochMilliseconds )
77- mockDeleteExecute . mockResolvedValue ( [ { count : 0 , lastId : null } ] )
99+ mockDeleteExecute . mockResolvedValue ( [ ] )
78100
79101 try {
80102 await runCleanupTableRowTtl ( )
@@ -132,7 +154,7 @@ describe('table row TTL cleanup', () => {
132154 } )
133155
134156 it ( 'stops after one hundred full batches' , async ( ) => {
135- mockDeleteExecute . mockResolvedValue ( [ { count : 500 , lastId : 'row-cursor' } ] )
157+ mockDeleteExecute . mockResolvedValue ( deletedRows ( 500 ) )
136158
137159 await expect ( runCleanupTableRowTtl ( ) ) . resolves . toEqual ( {
138160 batches : 100 ,
@@ -162,12 +184,12 @@ describe('table row TTL cleanup', () => {
162184 const attempt = ( tableAttempts . get ( tableId ) ?? 0 ) + 1
163185 tableAttempts . set ( tableId , attempt )
164186 if ( tableId === table . id && attempt === 1 ) {
165- return [ { count : 500 , lastId : 'row-500' } ]
187+ return deletedRows ( 500 )
166188 }
167189 if ( tableId === secondTable . id ) {
168- return [ { count : 1 , lastId : 'row-1' } ]
190+ return deletedRows ( 1 )
169191 }
170- return [ { count : 0 , lastId : null } ]
192+ return [ ]
171193 } ) ,
172194 } )
173195 } )
0 commit comments