From 80237c2d76cef2c9cd587a95c5805edf2ba3c559 Mon Sep 17 00:00:00 2001 From: Carlos Santos <4a.santos@gmail.com> Date: Wed, 23 Apr 2025 12:23:42 +0200 Subject: [PATCH] backend: Refactor bulk delete recording tests to utilize expectValidationError for improved clarity and consistency --- .../recordings/bulk-delete-recording.test.ts | 54 ++++--------------- backend/tests/utils/assertion-helpers.ts | 10 +++- 2 files changed, 17 insertions(+), 47 deletions(-) diff --git a/backend/tests/integration/api/recordings/bulk-delete-recording.test.ts b/backend/tests/integration/api/recordings/bulk-delete-recording.test.ts index 04bebfe..c89972d 100644 --- a/backend/tests/integration/api/recordings/bulk-delete-recording.test.ts +++ b/backend/tests/integration/api/recordings/bulk-delete-recording.test.ts @@ -8,6 +8,7 @@ import { stopTestServer } from '../../../utils/helpers'; import { setupMultiRecordingsTestContext } from '../../../utils/test-scenarios'; +import { expectValidationError } from '../../../utils/assertion-helpers'; describe('Recording API Tests', () => { beforeAll(async () => { @@ -121,67 +122,30 @@ describe('Recording API Tests', () => { describe('Bulk Delete Recording Validation', () => { it('should handle empty recordingIds array gracefully', async () => { - const deleteResponse = await bulkDeleteRecordings([]); + const response = await bulkDeleteRecordings([]); - expect(deleteResponse.status).toBe(422); - expect(deleteResponse.body).toEqual({ - details: [ - { - field: 'recordingIds', - message: 'recordingIds must contain at least one item' - } - ], - error: 'Unprocessable Entity', - message: 'Invalid request' - }); + expectValidationError(response, 'recordingIds', 'recordingIds must contain at least one item'); }); it('should reject a CSV string with invalid format', async () => { const invalidRecordingIds = 'invalid--recording.id,invalid--EG_111--5678'; - const deleteResponse = await bulkDeleteRecordings([invalidRecordingIds]); + const response = await bulkDeleteRecordings([invalidRecordingIds]); - expect(deleteResponse.status).toBe(422); - expect(deleteResponse.body).toMatchObject({ - details: [ - { - message: 'recordingId does not follow the expected format' - } - ], - error: 'Unprocessable Entity', - message: 'Invalid request' - }); + expectValidationError(response, 'recordingIds.0', 'recordingId does not follow the expected format'); }); it('should reject an array containing empty strings after sanitization', async () => { const invalidRecordingIds = ['', ' ']; - const deleteResponse = await bulkDeleteRecordings(invalidRecordingIds); + const response = await bulkDeleteRecordings(invalidRecordingIds); - expect(deleteResponse.status).toBe(422); - expect(deleteResponse.body).toMatchObject({ - details: [ - { - message: 'recordingIds must contain at least one item' - } - ], - error: 'Unprocessable Entity', - message: 'Invalid request' - }); + expectValidationError(response, 'recordingIds', 'recordingIds must contain at least one item'); }); it('should reject an array with mixed valid and totally invalid IDs', async () => { const invalidRecordingIds = ['valid--EG_111--5678', 'invalid--recording.id']; - const deleteResponse = await bulkDeleteRecordings(invalidRecordingIds); + const response = await bulkDeleteRecordings(invalidRecordingIds); - expect(deleteResponse.status).toBe(422); - expect(deleteResponse.body).toMatchObject({ - details: [ - { - message: 'recordingId does not follow the expected format' - } - ], - error: 'Unprocessable Entity', - message: 'Invalid request' - }); + expectValidationError(response, 'recordingIds.1', 'recordingId does not follow the expected format'); }); }); }); diff --git a/backend/tests/utils/assertion-helpers.ts b/backend/tests/utils/assertion-helpers.ts index 6bd143c..b37b965 100644 --- a/backend/tests/utils/assertion-helpers.ts +++ b/backend/tests/utils/assertion-helpers.ts @@ -3,15 +3,21 @@ import INTERNAL_CONFIG from '../../src/config/internal-config'; import { MeetRoom, MeetRoomPreferences } from '../../src/typings/ce'; const RECORDINGS_PATH = `${INTERNAL_CONFIG.INTERNAL_API_BASE_PATH_V1}/recordings`; -export const expectErrorResponse = ( +const expectErrorResponse = ( response: any, status = 422, error = 'Unprocessable Entity', message = 'Invalid request', - details: Array<{ field?: string; message: string }> + details?: Array<{ field?: string; message: string }> ) => { expect(response.status).toBe(status); expect(response.body).toMatchObject({ error, message }); + + if (details === undefined) { + expect(response.body.details).toBeUndefined(); + return; + } + expect(Array.isArray(response.body.details)).toBe(true); expect(response.body.details).toEqual( expect.arrayContaining(