From 44b8ec53d8f7171fe7182e469427bc049183a1fe Mon Sep 17 00:00:00 2001 From: Rakesh Ghosal Date: Wed, 17 Dec 2025 15:03:11 +0530 Subject: [PATCH] ACS 9871 - add additional transformation rule tests (#4927) * ACS-9871: Add transformation rule tests and supporting methods * ACS-9871: Add transformation rule tests and supporting methods (Addressed PR Comments) * ACS-9871: Fix async expect pattern in transformation tests * ACS-9871: Add readonly modifiers and clean up code formatting * ACS-9871: Simplify expect statements and reorder assertions * ACS-9871: Refactor transformation tests with helper function - Add testTransformation helper function to reduce code duplication - Refactor PDF, BMP, and JPG transformation tests to use helper - Improve test maintainability and readability - Add comprehensive JSDoc documentation * ACS-9871: Replace any types with proper Page Object types - Replace 'any' with PersonalFilesPage, NodesPage, and LoginPage - Add proper imports for page object types - Improve type safety in testTransformation helper function * ACS-9871: Add image transformation tests for GIF, TIFF, and PNG - Add new test cases for GIF, TIFF, and PNG transformations - Add MimeType enums for GIFImage, TIFFImage, and PNGImage - Add TIFF_FILE and BMP_FILE to test-files registry - Add physical test files (file-tif.tif, file-bmp.bmp) - Test multiple image format conversions (JPG, PNG, BMP, GIF, TIFF) * Fix parallel test execution by removing logout/login cycle in transformation tests * Refactor transformation tests to reduce code duplication for SonarQube * Refactor transformation tests following Single Responsibility Principle and extract TestFileConfig interface to shared models * Replace any type with Page type in triggerTransformation function --- .../src/tests/transform-rules.e2e.ts | 193 ++++++++++++++---- .../aca-playwright-shared/src/models/index.ts | 1 + .../src/models/test-file.model.ts | 28 +++ .../components/actions-dropdown.component.ts | 7 +- .../src/resources/test-files/file-bmp.bmp | Bin 0 -> 78 bytes .../src/resources/test-files/file-tif.tif | Bin 0 -> 18382 bytes .../src/resources/test-files/index.ts | 8 + 7 files changed, 197 insertions(+), 40 deletions(-) create mode 100644 projects/aca-playwright-shared/src/models/test-file.model.ts create mode 100644 projects/aca-playwright-shared/src/resources/test-files/file-bmp.bmp create mode 100644 projects/aca-playwright-shared/src/resources/test-files/file-tif.tif diff --git a/e2e/playwright/folder-rules/src/tests/transform-rules.e2e.ts b/e2e/playwright/folder-rules/src/tests/transform-rules.e2e.ts index 2c38dc1d3..7b11bc619 100644 --- a/e2e/playwright/folder-rules/src/tests/transform-rules.e2e.ts +++ b/e2e/playwright/folder-rules/src/tests/transform-rules.e2e.ts @@ -22,7 +22,7 @@ * from Hyland Software. If not, see . */ -import { expect } from '@playwright/test'; +import { expect, Page } from '@playwright/test'; import { ActionType, ApiClientFactory, @@ -32,9 +32,79 @@ import { NodesApi, MimeType, FileActionsApi, - TEST_FILES + TEST_FILES, + PersonalFilesPage, + NodesPage, + timeouts, + TestFileConfig } from '@alfresco/aca-playwright-shared'; +function generateUniqueFiles(testFiles: Array): Array { + return testFiles.map((file) => ({ path: file.path, name: `${file.name}-${Utils.random()}` })); +} + +async function setupTransformationTest( + context: { personalFiles: PersonalFilesPage; nodesPage: NodesPage }, + config: { + nodesApi: NodesApi; + testString: string; + parentFolderName: string; + destinationFolderName: string; + mimeType: MimeType; + } +): Promise { + const { personalFiles, nodesPage } = context; + const { nodesApi, testString, parentFolderName, destinationFolderName, mimeType } = config; + + const parentFolderId = (await nodesApi.createFolder(parentFolderName)).entry.id; + await nodesApi.createFolder(destinationFolderName); + + await personalFiles.navigate({ remoteUrl: `#/nodes/${parentFolderId}/rules` }); + await nodesPage.toolbar.clickCreateRuleButton(); + await nodesPage.manageRulesDialog.ruleNameInputLocator.fill(testString); + await nodesPage.manageRulesDialog.ruleDescriptionInputLocator.fill(testString); + await nodesPage.actionsDropdown.selectAction(ActionType.TransformAndCopyContent, 0); + await nodesPage.actionsDropdown.selectMimeType(mimeType, 0); + await nodesPage.actionsDropdown.selectDestinationFolderTransformAndCopyContent(0, destinationFolderName); + await nodesPage.manageRulesDialog.createRuleButton.click(); + await expect(nodesPage.manageRules.getGroupsList(testString)).toBeVisible(); + return parentFolderId; +} + +async function triggerTransformation(config: { + fileActionApi: FileActionsApi; + files: Array; + parentFolderId: string; + page: Page; +}): Promise { + const { fileActionApi, files, parentFolderId, page } = config; + for (const file of files) { + await fileActionApi.uploadFile(file.path, file.name, parentFolderId); + } + await page.waitForTimeout(timeouts.medium); +} + +async function verifyTransformation( + context: { personalFiles: PersonalFilesPage }, + config: { + destinationFolderName: string; + files: Array; + expectedExtension: string; + } +): Promise { + const { personalFiles } = context; + const { destinationFolderName, files, expectedExtension } = config; + + await personalFiles.navigate(); + await personalFiles.dataTable.performClickFolderOrFileToOpen(destinationFolderName); + await personalFiles.spinner.waitForReload(); + for (const file of files) { + const transformedFileName = `${file.name}.${expectedExtension}`; + const exists = await personalFiles.dataTable.isItemPresent(transformedFileName); + expect(exists, `Transformed file ${transformedFileName} was not present in data table`).toBe(true); + } +} + test.use({ launchOptions: { slowMo: 300 } }); test.describe('Folder Rules Actions', () => { const apiClientFactory = new ApiClientFactory(); @@ -42,17 +112,8 @@ test.describe('Folder Rules Actions', () => { let trashcanApi: TrashcanApi; let fileActionApi: FileActionsApi; const username = `user-e2e-${Utils.random()}`; - - const randomFolderName1 = `folder-name-${Utils.random()}`; - const randomDocxName = `${TEST_FILES.DOCX.name}-${Utils.random()}`; - const randomXLSXName = `${TEST_FILES.XLSX.name}-${Utils.random()}`; - const randomPPTXName = `${TEST_FILES.PPTX_FILE.name}-${Utils.random()}`; - - const copyFileName = `copy-file-${Utils.random()}`; const testString = '"!@£$%^&*()_+{}|:""?><,/.\';][=-`~"'; - let randomFolderName1Id: string; - test.beforeAll(async () => { try { await apiClientFactory.setUpAcaBackend('admin'); @@ -60,8 +121,6 @@ test.describe('Folder Rules Actions', () => { nodesApi = await NodesApi.initialize(username, username); trashcanApi = await TrashcanApi.initialize(username, username); fileActionApi = await FileActionsApi.initialize(username, username); - randomFolderName1Id = (await nodesApi.createFolder(randomFolderName1)).entry.id; - await nodesApi.createFile(copyFileName, randomFolderName1Id); } catch (error) { console.error(`beforeAll failed : ${error}`); } @@ -75,31 +134,87 @@ test.describe('Folder Rules Actions', () => { await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); - test('[XAT-8050] Supported types transformation to PDF', async ({ personalFiles, nodesPage, loginPage }) => { - const toFolderName = 'TO_PDF'; - await nodesApi.createFolder(toFolderName); - await personalFiles.navigate({ remoteUrl: `#/nodes/${randomFolderName1Id}/rules` }); - await nodesPage.toolbar.clickCreateRuleButton(); - await nodesPage.manageRulesDialog.ruleNameInputLocator.fill(testString); - await nodesPage.manageRulesDialog.ruleDescriptionInputLocator.fill(testString); - await nodesPage.actionsDropdown.selectAction(ActionType.TransformAndCopyContent, 0); - await nodesPage.actionsDropdown.selectMimeType(MimeType.AdobePDFDocument, 0); - await nodesPage.actionsDropdown.selectDestinationFolderTransformAndCopyContent(0, toFolderName); - await nodesPage.manageRulesDialog.createRuleButton.click(); - await expect(nodesPage.manageRules.getGroupsList(testString)).toBeVisible(); - await fileActionApi.uploadFile(TEST_FILES.DOCX.path, randomDocxName, randomFolderName1Id); - await fileActionApi.uploadFile(TEST_FILES.XLSX.path, randomXLSXName, randomFolderName1Id); - await fileActionApi.uploadFile(TEST_FILES.PPTX_FILE.path, randomPPTXName, randomFolderName1Id); - await loginPage.logoutUser(); - await expect(loginPage.username, 'User name was not visible').toBeVisible(); - await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); - await personalFiles.dataTable.performClickFolderOrFileToOpen(toFolderName); - await personalFiles.spinner.waitForReload(); - const docxToPDF = `${randomDocxName}.pdf`; - const xlsxToPDF = `${randomXLSXName}.pdf`; - const pptxToPDF = `${randomPPTXName}.pdf`; - expect(await personalFiles.dataTable.isItemPresent(docxToPDF), `Converted PDF from DOCX ${docxToPDF} was not present in data table`).toBe(true); - expect(await personalFiles.dataTable.isItemPresent(pptxToPDF), `Converted PDF from PPTX ${pptxToPDF} was not present in data table`).toBe(true); - expect(await personalFiles.dataTable.isItemPresent(xlsxToPDF), `Converted PDF from XLSX ${xlsxToPDF} was not present in data table`).toBe(true); + test('[XAT-8050] Supported types transformation to PDF', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-pdf-${Utils.random()}`; + const destinationFolderName = `TO_PDF-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.DOCX, TEST_FILES.XLSX, TEST_FILES.PPTX_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.AdobePDFDocument } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'pdf' }); + }); + + test('[XAT-8051] Supported types transformation to BMP', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-bmp-${Utils.random()}`; + const destinationFolderName = `TO_BMP-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.JPG_FILE, TEST_FILES.PNG_FILE, TEST_FILES.GIF_FILE, TEST_FILES.TIFF_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.BitmapImage } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'bmp' }); + }); + + test('[XAT-8052] Supported types transformation to JPG', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-jpg-${Utils.random()}`; + const destinationFolderName = `TO_JPG-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.PNG_FILE, TEST_FILES.GIF_FILE, TEST_FILES.BMP_FILE, TEST_FILES.TIFF_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.JPEGImage } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'jpg' }); + }); + + test('[XAT-8053] Supported types transformation to GIF', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-gif-${Utils.random()}`; + const destinationFolderName = `TO_GIF-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.PNG_FILE, TEST_FILES.JPG_FILE, TEST_FILES.BMP_FILE, TEST_FILES.TIFF_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.GIFImage } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'gif' }); + }); + + test('[XAT-8054] Supported types transformation to TIFF', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-tiff-${Utils.random()}`; + const destinationFolderName = `TO_TIFF-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.PNG_FILE, TEST_FILES.JPG_FILE, TEST_FILES.BMP_FILE, TEST_FILES.GIF_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.TIFFImage } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'tif' }); + }); + + test('[XAT-8055] Supported types transformation to PNG', async ({ personalFiles, nodesPage }) => { + const parentFolderName = `parent-png-${Utils.random()}`; + const destinationFolderName = `TO_PNG-${Utils.random()}`; + const files = generateUniqueFiles([TEST_FILES.JPG_FILE, TEST_FILES.BMP_FILE, TEST_FILES.GIF_FILE, TEST_FILES.TIFF_FILE]); + + const parentFolderId = await setupTransformationTest( + { personalFiles, nodesPage }, + { nodesApi, testString, parentFolderName, destinationFolderName, mimeType: MimeType.PNGImage } + ); + + await triggerTransformation({ fileActionApi, files, parentFolderId, page: personalFiles.page }); + await verifyTransformation({ personalFiles }, { destinationFolderName, files, expectedExtension: 'png' }); }); }); diff --git a/projects/aca-playwright-shared/src/models/index.ts b/projects/aca-playwright-shared/src/models/index.ts index b218c4376..5f69fd1fb 100644 --- a/projects/aca-playwright-shared/src/models/index.ts +++ b/projects/aca-playwright-shared/src/models/index.ts @@ -24,3 +24,4 @@ export * from './user-model'; export * from './custom-config'; +export * from './test-file.model'; diff --git a/projects/aca-playwright-shared/src/models/test-file.model.ts b/projects/aca-playwright-shared/src/models/test-file.model.ts new file mode 100644 index 000000000..7507e0a12 --- /dev/null +++ b/projects/aca-playwright-shared/src/models/test-file.model.ts @@ -0,0 +1,28 @@ +/*! + * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. + * + * Alfresco Example Content Application + * + * This file is part of the Alfresco Example Content Application. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * The Alfresco Example Content Application is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alfresco Example Content Application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * from Hyland Software. If not, see . + */ + +export interface TestFileConfig { + path: string; + name: string; +} diff --git a/projects/aca-playwright-shared/src/page-objects/components/actions-dropdown.component.ts b/projects/aca-playwright-shared/src/page-objects/components/actions-dropdown.component.ts index 5f902f660..6fc8a8d69 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/actions-dropdown.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/actions-dropdown.component.ts @@ -51,7 +51,12 @@ export enum ActionType { } export enum MimeType { - AdobePDFDocument = 'Adobe PDF Document [application/pdf]' + AdobePDFDocument = 'Adobe PDF Document [application/pdf]', + BitmapImage = 'Bitmap Image [image/bmp]', + JPEGImage = 'JPEG Image [image/jpeg]', + GIFImage = 'GIF Image [image/gif]', + TIFFImage = 'TIFF Image [image/tiff]', + PNGImage = 'PNG Image [image/png]' } export class ActionsDropdownComponent extends BaseComponent { diff --git a/projects/aca-playwright-shared/src/resources/test-files/file-bmp.bmp b/projects/aca-playwright-shared/src/resources/test-files/file-bmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..872e8465f263d7b9c80e4494883764d7dd6a03a1 GIT binary patch literal 78 zcmZ?r^<#hlGa#h_#4JF}1jLLC5OfOY#f! E0p%?S>i_@% literal 0 HcmV?d00001 diff --git a/projects/aca-playwright-shared/src/resources/test-files/file-tif.tif b/projects/aca-playwright-shared/src/resources/test-files/file-tif.tif new file mode 100644 index 0000000000000000000000000000000000000000..fe51399c542954e5cd837eb50626c5cd02991ebb GIT binary patch literal 18382 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 literal 0 HcmV?d00001 diff --git a/projects/aca-playwright-shared/src/resources/test-files/index.ts b/projects/aca-playwright-shared/src/resources/test-files/index.ts index cf933d6c3..e53507525 100644 --- a/projects/aca-playwright-shared/src/resources/test-files/index.ts +++ b/projects/aca-playwright-shared/src/resources/test-files/index.ts @@ -78,6 +78,14 @@ export const TEST_FILES = { path: resolve(__dirname, 'file-gif.gif'), name: 'file-gif' }, + TIFF_FILE: { + path: resolve(__dirname, 'file-tif.tif'), + name: 'file-tif' + }, + BMP_FILE: { + path: resolve(__dirname, 'file-bmp.bmp'), + name: 'file-bmp' + }, PPTX_FILE: { path: resolve(__dirname, 'file-pptx.pptx'), name: 'file-pptx'