From 8d10bb57f98924cc55b21690c739bec8cbf01911 Mon Sep 17 00:00:00 2001 From: Jessica Schelly Souza Date: Mon, 2 Mar 2026 14:30:41 -0300 Subject: [PATCH 1/3] test: add tests for image upload with rotation and EXIF --- .../api/file-upload-image-rotation.ts | 112 ++++++++++++++++++ .../tests/mocks/files/exif-orientation-6.jpg | Bin 0 -> 18282 bytes 2 files changed, 112 insertions(+) create mode 100644 apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts create mode 100644 apps/meteor/tests/mocks/files/exif-orientation-6.jpg diff --git a/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts new file mode 100644 index 0000000000000..e52ff29818267 --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts @@ -0,0 +1,112 @@ +import path from 'path'; + +import type { Credentials } from '@rocket.chat/api-client'; +import type { ImageAttachmentProps, IMessage, IRoom, IUser, SettingValue } from '@rocket.chat/core-typings'; +import { expect } from 'chai'; +import { after, before, describe, it } from 'mocha'; +import sharp from 'sharp'; + +import { getCredentials, request } from '../../data/api-data'; +import { uploadFileToRC } from '../../data/file.helper'; +import { getSettingValueById, updateSetting } from '../../data/permissions.helper'; +import { createRoom, deleteRoom } from '../../data/rooms.helper'; +import type { IRequestConfig, TestUser } from '../../data/users.helper'; +import { createUser, deleteUser, login } from '../../data/users.helper'; + +const testImagePath = path.join(__dirname, '../../mocks/files/exif-orientation-6.jpg'); +const testImageName = 'exif-orientation-6.jpg'; + +const downloadBuffer = async (url: string, auth: Credentials): Promise => { + const response = await request.get(url).set(auth).buffer(true).expect(200); + return response.body as Buffer; +}; + +describe('[File Upload - Image Rotation]', () => { + before((done) => getCredentials(done)); + + let user: TestUser; + const userPassword = `pass${Date.now()}`; + let userCredentials: Credentials; + let testRoom: IRoom; + let rotateImagesSetting: SettingValue; + let stripExifSetting: SettingValue; + let thumbnailsEnabledSetting: SettingValue; + + before(async () => { + user = await createUser({ joinDefaultChannels: false, password: userPassword }); + userCredentials = await login(user.username, userPassword); + testRoom = (await createRoom({ type: 'p', name: `rotate-upload-${Date.now()}`, members: [user.username] })).body.group; + + rotateImagesSetting = await getSettingValueById('FileUpload_RotateImages'); + stripExifSetting = await getSettingValueById('Message_Attachments_Strip_Exif'); + thumbnailsEnabledSetting = await getSettingValueById('Message_Attachments_Thumbnails_Enabled'); + + await updateSetting('FileUpload_RotateImages', true); + await updateSetting('Message_Attachments_Strip_Exif', true); + await updateSetting('Message_Attachments_Thumbnails_Enabled', true); + }); + + after(async () => { + await Promise.all([ + updateSetting('FileUpload_RotateImages', rotateImagesSetting), + updateSetting('Message_Attachments_Strip_Exif', stripExifSetting), + updateSetting('Message_Attachments_Thumbnails_Enabled', thumbnailsEnabledSetting), + deleteRoom({ type: 'p', roomId: testRoom._id }), + deleteUser(user), + ]); + }); + + it('should rotate pixels, strip EXIF orientation, and generate thumbnail from rotated image', async () => { + const fixtureMetadata = await sharp(testImagePath).metadata(); + expect(fixtureMetadata.width).to.equal(719); + expect(fixtureMetadata.height).to.equal(479); + expect(fixtureMetadata.orientation).to.equal(6); + + const requestConfig: IRequestConfig = { request, credentials: userCredentials }; + const { message } = await uploadFileToRC(testRoom._id, testImagePath, 'rotation-exif-test', requestConfig); + const uploadMessage = message as IMessage; + + expect(uploadMessage).to.have.property('attachments'); + const attachment = uploadMessage.attachments?.find((item) => item.title === testImageName); + expect(attachment).to.be.an('object'); + + const fileUrl = (attachment as { title_link?: string }).title_link; + const thumbUrl = (attachment as ImageAttachmentProps).image_url; + + expect(fileUrl).to.be.a('string'); + expect(thumbUrl).to.be.a('string'); + + const originalBuffer = await downloadBuffer(fileUrl as string, userCredentials); + const originalMetadata = await sharp(originalBuffer).metadata(); + + expect(originalMetadata.width).to.equal(479); + expect(originalMetadata.height).to.equal(719); + expect(originalMetadata.exif).to.be.undefined; + + const thumbBuffer = await downloadBuffer(thumbUrl as string, userCredentials); + const thumbMetadata = await sharp(thumbBuffer).metadata(); + + expect(thumbMetadata.width).to.be.lessThan(thumbMetadata.height as number); + }); + + it('should NOT rotate pixels when FileUpload_RotateImages is disabled', async () => { + await updateSetting('FileUpload_RotateImages', false); + + const requestConfig: IRequestConfig = { request, credentials: userCredentials }; + const { message } = await uploadFileToRC(testRoom._id, testImagePath, 'no-rotation-test', requestConfig); + const uploadMessage = message as IMessage; + + expect(uploadMessage).to.have.property('attachments'); + const attachment = uploadMessage.attachments?.find((item) => item.title === testImageName); + expect(attachment).to.be.an('object'); + + const fileUrl = (attachment as { title_link?: string }).title_link; + expect(fileUrl).to.be.a('string'); + + const originalBuffer = await downloadBuffer(fileUrl as string, userCredentials); + const originalMetadata = await sharp(originalBuffer).metadata(); + + expect(originalMetadata.width).to.equal(719); + expect(originalMetadata.height).to.equal(479); + }); +}); diff --git a/apps/meteor/tests/mocks/files/exif-orientation-6.jpg b/apps/meteor/tests/mocks/files/exif-orientation-6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af10b0c65bc6434db70c9a9d264a73ff5d537648 GIT binary patch literal 18282 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 Date: Mon, 2 Mar 2026 14:47:17 -0300 Subject: [PATCH 2/3] fix: review --- .../tests/end-to-end/api/file-upload-image-rotation.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts index e52ff29818267..8756eb01bd4eb 100644 --- a/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts +++ b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts @@ -47,12 +47,12 @@ describe('[File Upload - Image Rotation]', () => { }); after(async () => { - await Promise.all([ + await Promise.allSettled([ updateSetting('FileUpload_RotateImages', rotateImagesSetting), updateSetting('Message_Attachments_Strip_Exif', stripExifSetting), updateSetting('Message_Attachments_Thumbnails_Enabled', thumbnailsEnabledSetting), - deleteRoom({ type: 'p', roomId: testRoom._id }), - deleteUser(user), + testRoom ? deleteRoom({ type: 'p', roomId: testRoom._id }) : Promise.resolve(), + user ? deleteUser(user) : Promise.resolve(), ]); }); From bff902d386bc56c664c8ffb5a8a8b21fc90952e4 Mon Sep 17 00:00:00 2001 From: Jessica Schelly Souza Date: Mon, 2 Mar 2026 14:56:12 -0300 Subject: [PATCH 3/3] fix: update after hook to use Promise.all --- apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts index 8756eb01bd4eb..0ba394a036079 100644 --- a/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts +++ b/apps/meteor/tests/end-to-end/api/file-upload-image-rotation.ts @@ -47,7 +47,7 @@ describe('[File Upload - Image Rotation]', () => { }); after(async () => { - await Promise.allSettled([ + await Promise.all([ updateSetting('FileUpload_RotateImages', rotateImagesSetting), updateSetting('Message_Attachments_Strip_Exif', stripExifSetting), updateSetting('Message_Attachments_Thumbnails_Enabled', thumbnailsEnabledSetting),