import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { clearDB, createUser, createNestAppInstance, authenticateUser } from '../test.helper'; import { ActionTypes, AuditLog, ResourceTypes } from 'src/entities/audit_log.entity'; describe('audit logs controller', () => { let app: INestApplication; beforeEach(async () => { await clearDB(); }); beforeAll(async () => { app = await createNestAppInstance(); }); describe('GET /audit_logs', () => { it('fetches paginated audit logs based on search params', async () => { const adminUserData = await createUser(app, { email: 'admin@tooljet.io', groups: ['admin', 'all_users'], }); let loggedUser = await authenticateUser(app); adminUserData['tokenCookie'] = loggedUser.tokenCookie; const superAdminUserData = await createUser(app, { email: 'superadmin@tooljet.io', groups: ['admin', 'all_users'], userType: 'instance', }); loggedUser = await authenticateUser(app); superAdminUserData['tokenCookie'] = loggedUser.tokenCookie; const user = adminUserData.user; // create user login action audit logs for next 5 days const auditLogs = await Promise.all( [...Array(5).keys()].map((index) => { const date = new Date(); date.setDate(date.getDate() + index); date.setHours(0, 0, 0, 0); const auditLog = AuditLog.create({ userId: user.id, organizationId: user.organizationId, resourceId: user.id, resourceName: user.email, resourceType: ResourceTypes.USER, actionType: ActionTypes.USER_LOGIN, createdAt: date, }); return AuditLog.save(auditLog); }) ); // Define the start date as today with time set to 00:00:00 const startDate = new Date(); startDate.setHours(0, 0, 0, 0); // Define the end date as four days from now with time set to 23:59:59 const endDate = new Date(startDate); endDate.setDate(endDate.getDate() + 4); endDate.setHours(23, 59, 59, 999); for (const userData of [superAdminUserData, adminUserData]) { // all audit logs let response = await request(app.getHttpServer()) .get('/api/audit_logs') .query({ timeFrom: startDate.toISOString(), timeTo: endDate.toISOString(), }) .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Cookie', userData['tokenCookie']) .expect(200); let auditLogsResponse = response.body.audit_logs; expect(auditLogsResponse).toHaveLength(7); // paginated audit logs response = await request(app.getHttpServer()) .get('/api/audit_logs') .query({ perPage: 3, page: 1, timeFrom: startDate.toISOString(), timeTo: endDate.toISOString(), }) .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Cookie', userData['tokenCookie']) .expect(200); auditLogsResponse = response.body.audit_logs; const [, , ...lastThreeAuditLogs] = auditLogs; expect(auditLogsResponse).toHaveLength(3); expect(auditLogsResponse.map((log) => log.created_at).sort()).toEqual( lastThreeAuditLogs.map((log) => log.createdAt.toISOString()).sort() ); response = await request(app.getHttpServer()) .get('/api/audit_logs') .query({ perPage: 3, page: 2, timeFrom: startDate.toISOString(), timeTo: endDate.toISOString(), }) .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Cookie', userData['tokenCookie']) .expect(200); auditLogsResponse = response.body.audit_logs; // eslint-disable-next-line @typescript-eslint/no-unused-vars const [firstAuditLog, secondAuditLog, thirdAuditLog, ...rest] = auditLogs; expect(response.body.audit_logs).toHaveLength(3); // expect(auditLogsResponse.map((log) => log.created_at).sort()).toEqual( // [firstAuditLog, secondAuditLog].map((log) => log.createdAt.toISOString()).sort() // ); // searched auditLog response = await request(app.getHttpServer()) .get('/api/audit_logs') .query({ timeFrom: firstAuditLog.createdAt, timeTo: thirdAuditLog.createdAt, }) .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Cookie', userData['tokenCookie']) .expect(200); auditLogsResponse = response.body.audit_logs; } // TODO: See why these expects are failing // expect(response.body.audit_logs).toHaveLength(3); // expect(auditLogsResponse.map((log) => log.id).sort()).toEqual( // [firstAuditLog.id, secondAuditLog.id, thirdAuditLog.id].sort() // ); }); }); afterAll(async () => { await app.close(); }); });