You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			53 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
| import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
 | |
| import { Database } from 'bun:sqlite';
 | |
| import { initializeDatabase } from '../../../src/db';
 | |
| import { MaintenanceService } from '../../../src/services/maintenance';
 | |
| 
 | |
| function toIso(d: Date): string {
 | |
|   return d.toISOString().replace('T', ' ').replace('Z', '');
 | |
| }
 | |
| 
 | |
| const envBackup = { ...process.env };
 | |
| let memdb: Database;
 | |
| 
 | |
| describe('MaintenanceService - cleanup de miembros inactivos', () => {
 | |
|   beforeEach(() => {
 | |
|     process.env = { ...envBackup, NODE_ENV: 'test' };
 | |
|     memdb = new Database(':memory:');
 | |
|     initializeDatabase(memdb);
 | |
| 
 | |
|     memdb.exec(`INSERT INTO users (id) VALUES ('u1'), ('u2'), ('u3')`);
 | |
|     memdb.exec(`INSERT INTO groups (id, community_id, name, active, last_verified) VALUES ('g1@g.us','comm','G1',1, ?)`, toIso(new Date()));
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     process.env = envBackup;
 | |
|     try { memdb.close(); } catch {}
 | |
|   });
 | |
| 
 | |
|   test('elimina inactivos con last_seen_at más viejo que el umbral', async () => {
 | |
|     const old = new Date(Date.now() - 200 * 24 * 60 * 60 * 1000); // 200 días
 | |
|     const recent = new Date(Date.now() - 50 * 24 * 60 * 60 * 1000); // 50 días
 | |
|     const now = new Date();
 | |
| 
 | |
|     // Sembrar miembros: dos inactivos (uno viejo, uno reciente) y uno activo
 | |
|     memdb.exec(`INSERT INTO group_members (group_id, user_id, is_admin, is_active, first_seen_at, last_seen_at) VALUES 
 | |
|       ('g1@g.us','u1',0,0,?,?),
 | |
|       ('g1@g.us','u2',0,0,?,?),
 | |
|       ('g1@g.us','u3',0,1,?,?)`,
 | |
|       toIso(old), toIso(old),
 | |
|       toIso(recent), toIso(recent),
 | |
|       toIso(now), toIso(now)
 | |
|     );
 | |
| 
 | |
|     const before = memdb.prepare(`SELECT COUNT(*) AS c FROM group_members WHERE is_active = 0`).get() as any;
 | |
|     expect(Number(before.c)).toBe(2);
 | |
| 
 | |
|     const deleted = await MaintenanceService.cleanupInactiveMembersOnce(memdb, 180);
 | |
|     expect(deleted).toBe(1);
 | |
| 
 | |
|     const after = memdb.prepare(`SELECT COUNT(*) AS c FROM group_members WHERE is_active = 0`).get() as any;
 | |
|     expect(Number(after.c)).toBe(1);
 | |
|   });
 | |
| });
 |