@@ -284,6 +284,43 @@ describe('AuditTrailService - IP Security and Masking', () => {
284284 } ) ;
285285 } ) ;
286286
287+ describe ( 'deleteOldLogs' , ( ) => {
288+ it ( 'should delete audit logs older than the configured cutoff date' , async ( ) => {
289+ const mockQueryBuilder = {
290+ delete : jest . fn ( ) . mockReturnThis ( ) ,
291+ where : jest . fn ( ) . mockReturnThis ( ) ,
292+ execute : jest . fn ( ) . mockResolvedValue ( { affected : 4 } ) ,
293+ } as any ;
294+
295+ ( repository . createQueryBuilder as jest . Mock ) . mockReturnValue ( mockQueryBuilder ) ;
296+
297+ const deleted = await service . deleteOldLogs ( 90 ) ;
298+
299+ expect ( repository . createQueryBuilder ) . toHaveBeenCalledWith ( 'audit' ) ;
300+ expect ( mockQueryBuilder . delete ) . toHaveBeenCalled ( ) ;
301+ expect ( mockQueryBuilder . where ) . toHaveBeenCalledWith (
302+ 'audit.createdAt < :cutoff' ,
303+ expect . objectContaining ( { cutoff : expect . any ( Date ) } ) ,
304+ ) ;
305+ expect ( mockQueryBuilder . execute ) . toHaveBeenCalled ( ) ;
306+ expect ( deleted ) . toBe ( 4 ) ;
307+ } ) ;
308+
309+ it ( 'should return zero when no old audit logs are deleted' , async ( ) => {
310+ const mockQueryBuilder = {
311+ delete : jest . fn ( ) . mockReturnThis ( ) ,
312+ where : jest . fn ( ) . mockReturnThis ( ) ,
313+ execute : jest . fn ( ) . mockResolvedValue ( { affected : 0 } ) ,
314+ } as any ;
315+
316+ ( repository . createQueryBuilder as jest . Mock ) . mockReturnValue ( mockQueryBuilder ) ;
317+
318+ const deleted = await service . deleteOldLogs ( 30 ) ;
319+
320+ expect ( deleted ) . toBe ( 0 ) ;
321+ } ) ;
322+ } ) ;
323+
287324 describe ( 'maskIp utility' , ( ) => {
288325 it ( 'should handle undefined and empty values' , ( ) => {
289326 expect ( maskIp ( undefined ) ) . toBeUndefined ( ) ;
0 commit comments