From 1959e48f19a3727cf25204850c87a5cc7857e05a Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Nov 2023 09:01:29 +0100 Subject: [PATCH 1/2] e2e: prompt_nested_folders: added prompt nested folders tests --- .github/pr-title-checker-config.json | 2 +- e2e/config/local.playwright.config.ts | 2 +- e2e/src/testData/expectedConstants.ts | 1 + e2e/src/testData/expectedMessages.ts | 2 + e2e/src/testData/prompts/promptData.ts | 16 ++ e2e/src/tests/folderPrompts.test.ts | 203 +++++++++++++++++++------ e2e/src/tests/prompts.test.ts | 138 ++++++++++------- e2e/src/ui/domData/colors.ts | 1 + e2e/src/ui/domData/styles.ts | 5 + e2e/src/ui/webElements/promptBar.ts | 22 +++ 10 files changed, 290 insertions(+), 102 deletions(-) diff --git a/.github/pr-title-checker-config.json b/.github/pr-title-checker-config.json index bd52ea31e5..ad060a0e16 100644 --- a/.github/pr-title-checker-config.json +++ b/.github/pr-title-checker-config.json @@ -4,7 +4,7 @@ "color": "EEEEEE" }, "CHECKS": { - "prefixes": ["fix: ", "feat: ", "feature: ", "chore: ", "hotfix: "] + "prefixes": ["fix: ", "feat: ", "feature: ", "chore: ", "hotfix: ", "e2e: "] }, "MESSAGES": { "success": "All OK", diff --git a/e2e/config/local.playwright.config.ts b/e2e/config/local.playwright.config.ts index 01b83145a6..e56ee733e2 100644 --- a/e2e/config/local.playwright.config.ts +++ b/e2e/config/local.playwright.config.ts @@ -6,7 +6,7 @@ import { ReporterDescription } from '@playwright/test'; * Config used for a local run */ config.workers = 2; -config.use!.headless = true; +config.use!.headless = false; config.use!.video = 'on'; config.use!.trace = 'on'; (config.reporter as ReporterDescription[]).push([ diff --git a/e2e/src/testData/expectedConstants.ts b/e2e/src/testData/expectedConstants.ts index 2682501c37..be7a9f99d3 100644 --- a/e2e/src/testData/expectedConstants.ts +++ b/e2e/src/testData/expectedConstants.ts @@ -26,6 +26,7 @@ export const ExpectedConstants = { defaultIconUrl: 'url(images/icons/message-square-lines-alt.svg))', deleteFolderMessage: 'Are you sure that you want to remove a folder with all nested elements?', + backgroundColorPattern: /(rgba\(\d+,\s*\d+,\s*\d+),\s*\d+\.*\d+\)/, }; export enum Groups { diff --git a/e2e/src/testData/expectedMessages.ts b/e2e/src/testData/expectedMessages.ts index dde6affb06..7c3d026c37 100644 --- a/e2e/src/testData/expectedMessages.ts +++ b/e2e/src/testData/expectedMessages.ts @@ -136,4 +136,6 @@ export enum ExpectedMessages { folderNameColorIsValid = 'Folder name color is valid', confirmationMessageIsValid = 'Confirmation dialog message is valid', chronologyMessageCountIsCorrect = 'Chat bar chronology messages count is correct', + newPromptButtonIsHighlighted = 'New prompt button is highlighted', + newPromptButtonCursorIsPointer = 'New prompt button cursor is a pointer', } diff --git a/e2e/src/testData/prompts/promptData.ts b/e2e/src/testData/prompts/promptData.ts index 8c6917793e..3b1acea8c7 100644 --- a/e2e/src/testData/prompts/promptData.ts +++ b/e2e/src/testData/prompts/promptData.ts @@ -35,6 +35,22 @@ export class PromptData { .build(); } + public prepareNestedFolder(nestedLevel: number) { + const rootFolder = this.prepareFolder(); + this.resetData(); + const foldersHierarchy = [rootFolder]; + for (let i = 1; i <= nestedLevel; i++) { + const nestedFolder = this.folderBuilder + .withName(GeneratorUtil.randomString(7)) + .withType('prompt') + .withFolderId(foldersHierarchy[foldersHierarchy.length - 1].id) + .build(); + foldersHierarchy.push(nestedFolder); + this.resetData(); + } + return foldersHierarchy; + } + public prepareDefaultPromptInFolder(name?: string): FolderPrompt { const prompt = this.prepareDefaultPrompt(); const folder = this.prepareFolder(name); diff --git a/e2e/src/tests/folderPrompts.test.ts b/e2e/src/tests/folderPrompts.test.ts index 36f49ebc9b..e600ae36ff 100644 --- a/e2e/src/tests/folderPrompts.test.ts +++ b/e2e/src/tests/folderPrompts.test.ts @@ -1,9 +1,13 @@ +import { FolderInterface } from '@/src/types/folder'; +import { Prompt } from '@/src/types/prompt'; + import test from '@/e2e/src/core/fixtures'; import { ExpectedConstants, ExpectedMessages, MenuOptions, } from '@/e2e/src/testData'; +import { GeneratorUtil } from '@/e2e/src/utils'; import { expect } from '@playwright/test'; test('Create new prompt folder', async ({ @@ -56,31 +60,36 @@ test('Prompt folder can expand and collapse', async ({ expect.soft(isPromptVisible, ExpectedMessages.folderCollapsed).toBeFalsy(); }); -test('Rename prompt folder on Enter', async ({ - dialHomePage, - promptData, - folderPrompts, - localStorageManager, - folderDropdownMenu, - setTestIds, -}) => { - setTestIds('EPMRTC-948'); - const newName = 'updated folder name'; - const folder = promptData.prepareFolder(); - await localStorageManager.setFolders(folder); +test( + 'Rename prompt folder on Enter.\n' + 'Rename prompt folders on nested levels', + async ({ + dialHomePage, + promptData, + folderPrompts, + localStorageManager, + folderDropdownMenu, + setTestIds, + }) => { + setTestIds('EPMRTC-948', 'EPMRTC-1382'); + const newName = 'updated folder name'; + const nestedFolders = promptData.prepareNestedFolder(3); + const randomFolder = GeneratorUtil.randomArrayElement(nestedFolders); + await localStorageManager.setFolders(...nestedFolders); + await localStorageManager.setOpenedFolders(...nestedFolders); - await dialHomePage.openHomePage(); - await dialHomePage.waitForPageLoaded(); - await folderPrompts.openFolderDropdownMenu(folder.name); - await folderDropdownMenu.selectMenuOption(MenuOptions.rename); - await folderPrompts.editFolderNameWithEnter(folder.name, newName); - expect - .soft( - await folderPrompts.getFolderByName(newName).isVisible(), - ExpectedMessages.folderNameUpdated, - ) - .toBeTruthy(); -}); + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await folderPrompts.openFolderDropdownMenu(randomFolder.name); + await folderDropdownMenu.selectMenuOption(MenuOptions.rename); + await folderPrompts.editFolderNameWithEnter(randomFolder.name, newName); + expect + .soft( + await folderPrompts.getFolderByName(newName).isVisible(), + ExpectedMessages.folderNameUpdated, + ) + .toBeTruthy(); + }, +); test('Cancel folder renaming on "x"', async ({ dialHomePage, @@ -271,31 +280,53 @@ test('Delete folder when there are some prompts inside', async ({ expect.soft(isPromptVisible, ExpectedMessages.promptIsVisible).toBeFalsy(); }); -test('Delete folder. Cancel', async ({ - dialHomePage, - promptData, - folderPrompts, - localStorageManager, - promptDropdownMenu, - confirmationDialog, - setTestIds, -}) => { - setTestIds('EPMRTC-967'); - const folder = promptData.prepareFolder(); - await localStorageManager.setFolders(folder); +test( + 'Delete folder. Cancel.\n' + 'Delete root prompt folder with nested folders', + async ({ + dialHomePage, + promptData, + folderPrompts, + localStorageManager, + promptDropdownMenu, + confirmationDialog, + setTestIds, + }) => { + setTestIds('EPMRTC-967', 'EPMRTC-1383'); + const nestedFolders = promptData.prepareNestedFolder(3); + await localStorageManager.setFolders(...nestedFolders); + await localStorageManager.setOpenedFolders(...nestedFolders); - await dialHomePage.openHomePage(); - await dialHomePage.waitForPageLoaded(); - await folderPrompts.openFolderDropdownMenu(folder.name); - await promptDropdownMenu.selectMenuOption(MenuOptions.delete); - await confirmationDialog.cancelDialog(); - expect - .soft( - await folderPrompts.getFolderByName(folder.name).isVisible(), - ExpectedMessages.folderNotDeleted, - ) - .toBeTruthy(); -}); + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await folderPrompts.openFolderDropdownMenu(nestedFolders[0].name); + await promptDropdownMenu.selectMenuOption(MenuOptions.delete); + expect + .soft( + await confirmationDialog.getConfirmationMessage(), + ExpectedMessages.confirmationMessageIsValid, + ) + .toBe(ExpectedConstants.deleteFolderMessage); + await confirmationDialog.cancelDialog(); + expect + .soft( + await folderPrompts.getFolderByName(nestedFolders[0].name).isVisible(), + ExpectedMessages.folderNotDeleted, + ) + .toBeTruthy(); + + await folderPrompts.openFolderDropdownMenu(nestedFolders[0].name); + await promptDropdownMenu.selectMenuOption(MenuOptions.delete); + await confirmationDialog.confirm(); + for (const nestedFolder of nestedFolders) { + expect + .soft( + await folderPrompts.getFolderByName(nestedFolder.name).isVisible(), + ExpectedMessages.folderDeleted, + ) + .toBeFalsy(); + } + }, +); test('Delete prompt in the folder', async ({ dialHomePage, @@ -333,3 +364,79 @@ test('Delete prompt in the folder', async ({ ) .toBeFalsy(); }); + +test('Delete nested prompt folder with prompt', async ({ + dialHomePage, + folderPrompts, + localStorageManager, + conversationDropdownMenu, + prompts, + confirmationDialog, + promptData, + setTestIds, +}) => { + setTestIds('EPMRTC-1384'); + const levelsCount = 3; + const levelToDelete = 2; + let nestedFolders: FolderInterface[]; + const nestedPrompts: Prompt[] = []; + + await test.step('Prepare nested folders with prompts inside each one', async () => { + nestedFolders = promptData.prepareNestedFolder(levelsCount); + for (let i = 0; i <= levelsCount; i++) { + const nestedPrompt = promptData.prepareDefaultPrompt(); + nestedPrompts.push(nestedPrompt); + nestedPrompt.folderId = nestedFolders[i].id; + promptData.resetData(); + } + await localStorageManager.setFolders(...nestedFolders); + await localStorageManager.setOpenedFolders(...nestedFolders); + await localStorageManager.setPrompts(...nestedPrompts); + }); + + await test.step('Delete 2nd level folder and verify all nested content is deleted as well', async () => { + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await folderPrompts.openFolderDropdownMenu( + nestedFolders[levelToDelete].name, + ); + await conversationDropdownMenu.selectMenuOption(MenuOptions.delete); + await confirmationDialog.confirm(); + + for (let i = levelToDelete; i <= levelsCount; i++) { + expect + .soft( + await folderPrompts + .getFolderByName(nestedFolders[i].name) + .isVisible(), + ExpectedMessages.folderDeleted, + ) + .toBeFalsy(); + expect + .soft( + await prompts.getPromptByName(nestedPrompts[i].name).isVisible(), + ExpectedMessages.promptDeleted, + ) + .toBeFalsy(); + } + + for (let i = 0; i <= levelsCount - levelToDelete; i++) { + expect + .soft( + await folderPrompts + .getFolderByName(nestedFolders[i].name) + .isVisible(), + ExpectedMessages.folderNotDeleted, + ) + .toBeTruthy(); + expect + .soft( + await folderPrompts + .getFolderPrompt(nestedFolders[i].name, nestedPrompts[i].name) + .isVisible(), + ExpectedMessages.promptNotDeleted, + ) + .toBeTruthy(); + } + }); +}); diff --git a/e2e/src/tests/prompts.test.ts b/e2e/src/tests/prompts.test.ts index 8caeb55d96..577d999658 100644 --- a/e2e/src/tests/prompts.test.ts +++ b/e2e/src/tests/prompts.test.ts @@ -4,6 +4,7 @@ import { ExpectedMessages, MenuOptions, } from '@/e2e/src/testData'; +import { Colors, Cursors } from '@/e2e/src/ui/domData'; import { expect } from '@playwright/test'; const newName = 'test prompt'; @@ -21,6 +22,17 @@ test('Create new prompt', async ({ await dialHomePage.openHomePage(); await dialHomePage.waitForPageLoaded({ isNewConversationVisible: true }); await conversationSettings.waitForState(); + await promptBar.hoverOverNewPrompt(); + const newPromptCursor = await promptBar.getNewPromptCursor(); + expect + .soft(newPromptCursor[0], ExpectedMessages.newPromptButtonCursorIsPointer) + .toBe(Cursors.pointer); + + const newPromptColor = await promptBar.getNewPromptBackgroundColor(); + expect + .soft(newPromptColor, ExpectedMessages.newPromptButtonIsHighlighted) + .toBe(Colors.highlightedNewPrompt); + await promptBar.createNewPrompt(); expect .soft( @@ -137,55 +149,66 @@ test('Edit prompt. Save', async ({ .toBe(newValue); }); -test('Edit prompt on Enter', async ({ - dialHomePage, - promptData, - prompts, - localStorageManager, - promptDropdownMenu, - promptModalDialog, - setTestIds, -}) => { - setTestIds('EPMRTC-955'); - const prompt = promptData.prepareDefaultPrompt(); - await localStorageManager.setPrompts(prompt); - - await dialHomePage.openHomePage(); - await dialHomePage.waitForPageLoaded(); - await prompts.openPromptDropdownMenu(prompt.name); - await promptDropdownMenu.selectMenuOption(MenuOptions.edit); - await promptModalDialog.updatePromptDetailsWithEnter( - newName, - newDescr, - newValue, - ); +test( + 'Edit prompt on Enter.\n' + 'Special characters are allowed in prompt name', + async ({ + dialHomePage, + promptData, + prompts, + localStorageManager, + promptDropdownMenu, + promptModalDialog, + setTestIds, + }) => { + setTestIds('EPMRTC-955', 'EPMRTC-1278'); + const nameWithSpecialSymbols = '!@#$%^&*()_+{}[]:;"\',./<>?/*-+`~'; + const prompt = promptData.prepareDefaultPrompt(); + await localStorageManager.setPrompts(prompt); + + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await prompts.openPromptDropdownMenu(prompt.name); + await promptDropdownMenu.selectMenuOption(MenuOptions.edit); + await promptModalDialog.updatePromptDetailsWithEnter( + nameWithSpecialSymbols, + newDescr, + newValue, + ); - const isPromptModalVisible = await promptModalDialog.isVisible(); - await expect - .soft(isPromptModalVisible, ExpectedMessages.promptModalClosed) - .toBeFalsy(); + const isPromptModalVisible = await promptModalDialog.isVisible(); + await expect + .soft(isPromptModalVisible, ExpectedMessages.promptModalClosed) + .toBeFalsy(); - const isPromptVisible = await prompts.getPromptByName(newName).isVisible(); - expect.soft(isPromptVisible, ExpectedMessages.promptNotUpdated).toBeTruthy(); + const isPromptVisible = await prompts + .getPromptByName(nameWithSpecialSymbols) + .isVisible(); + expect + .soft(isPromptVisible, ExpectedMessages.promptNotUpdated) + .toBeTruthy(); - await prompts.openPromptDropdownMenu(newName); - await promptDropdownMenu.selectMenuOption(MenuOptions.edit); - expect - .soft(await promptModalDialog.getName(), ExpectedMessages.promptNameUpdated) - .toBe(newName); - expect - .soft( - await promptModalDialog.getDescription(), - ExpectedMessages.promptDescriptionUpdated, - ) - .toBe(newDescr); - expect - .soft( - await promptModalDialog.getPrompt(), - ExpectedMessages.promptValueUpdated, - ) - .toBe(newValue); -}); + await prompts.openPromptDropdownMenu(nameWithSpecialSymbols); + await promptDropdownMenu.selectMenuOption(MenuOptions.edit); + expect + .soft( + await promptModalDialog.getName(), + ExpectedMessages.promptNameUpdated, + ) + .toBe(nameWithSpecialSymbols); + expect + .soft( + await promptModalDialog.getDescription(), + ExpectedMessages.promptDescriptionUpdated, + ) + .toBe(newDescr); + expect + .soft( + await promptModalDialog.getPrompt(), + ExpectedMessages.promptValueUpdated, + ) + .toBe(newValue); + }, +); test('Delete prompt located in the root', async ({ dialHomePage, @@ -341,6 +364,8 @@ test('Clear prompts. Clear', async ({ const singlePrompt = promptData.prepareDefaultPrompt(); promptData.resetData(); const promptInFolder = promptData.prepareDefaultPromptInFolder(); + promptData.resetData(); + const nestedFolders = promptData.prepareNestedFolder(3); const emptyConversationFolder = conversationData.prepareFolder(); conversationData.resetData(); @@ -364,17 +389,17 @@ test('Clear prompts. Clear', async ({ emptyConversationFolder, promptInFolder.folders, conversationInFolder.folders, + ...nestedFolders, + ); + await localStorageManager.updateOpenedFolders( + promptInFolder.folders, + conversationInFolder.folders, + ...nestedFolders, ); await localStorageManager.updateSelectedConversation(singleConversation); await dialHomePage.reloadPage(); await dialHomePage.waitForPageLoaded(); - if (i > 1) { - await folderPrompts.expandCollapseFolder(promptInFolder.folders.name); - await folderConversations.expandCollapseFolder( - conversationInFolder.folders.name, - ); - } await conversations.getConversationByName(singleConversation.name).waitFor(); await promptBar.deleteAllPrompts(); @@ -416,6 +441,15 @@ test('Clear prompts. Clear', async ({ .soft(isSinglePromptVisible, ExpectedMessages.promptDeleted) .toBeFalsy(); + for (const nestedFolder of nestedFolders) { + const isNestedPromptFolderVisible = await folderPrompts + .getFolderByName(nestedFolder.name) + .isVisible(); + expect + .soft(isNestedPromptFolderVisible, ExpectedMessages.folderDeleted) + .toBeFalsy(); + } + if (i > 1) { await dialHomePage.reloadPage(); await dialHomePage.waitForPageLoaded(); diff --git a/e2e/src/ui/domData/colors.ts b/e2e/src/ui/domData/colors.ts index ccdbfad51b..0db68a8edf 100644 --- a/e2e/src/ui/domData/colors.ts +++ b/e2e/src/ui/domData/colors.ts @@ -3,4 +3,5 @@ export enum Colors { highlightedDraggableArea = 'rgba(55, 186, 188, 0.15)', notHighlightedFolderName = 'rgb(243, 244, 246)', highlightedFolderName = 'rgb(55, 186, 188)', + highlightedNewPrompt = 'rgba(148, 89, 241)', } diff --git a/e2e/src/ui/domData/styles.ts b/e2e/src/ui/domData/styles.ts index 55a362e45c..d2da209c9e 100644 --- a/e2e/src/ui/domData/styles.ts +++ b/e2e/src/ui/domData/styles.ts @@ -6,4 +6,9 @@ export enum Styles { textColor = 'text-decoration-color', backgroundColor = 'background-color', color = 'color', + cursor = 'cursor', +} + +export enum Cursors { + pointer = 'pointer', } diff --git a/e2e/src/ui/webElements/promptBar.ts b/e2e/src/ui/webElements/promptBar.ts index d916d86de8..b26cce207e 100644 --- a/e2e/src/ui/webElements/promptBar.ts +++ b/e2e/src/ui/webElements/promptBar.ts @@ -5,6 +5,8 @@ import { } from '../selectors'; import { BaseElement } from './baseElement'; +import { ExpectedConstants } from '@/e2e/src/testData'; +import { Styles } from '@/e2e/src/ui/domData'; import { FolderPrompts } from '@/e2e/src/ui/webElements/folderPrompts'; import { Prompts } from '@/e2e/src/ui/webElements/prompts'; import { Page } from '@playwright/test'; @@ -55,11 +57,31 @@ export class PromptBar extends BaseElement { await this.newFolderButton.click(); } + public async hoverOverNewPrompt() { + await this.newPromptButton.waitForState(); + await this.newPromptButton.hoverOver(); + } + public async createNewPrompt() { await this.newPromptButton.waitForState(); await this.newPromptButton.click(); } + public async getNewPromptBackgroundColor() { + const backgroundColor = await this.newPromptButton.getComputedStyleProperty( + Styles.backgroundColor, + ); + backgroundColor[0] = backgroundColor[0].replace( + ExpectedConstants.backgroundColorPattern, + '$1)', + ); + return backgroundColor[0]; + } + + public async getNewPromptCursor() { + return this.newPromptButton.getComputedStyleProperty(Styles.cursor); + } + public async deleteAllPrompts() { await this.deleteAllPromptsButton.click(); } From a3a966368705564d193563d869aaa0af76194df5 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Nov 2023 11:31:42 +0100 Subject: [PATCH 2/2] e2e: prompt_nested_folders: removed duplicated methods for data classes --- e2e/config/local.playwright.config.ts | 2 +- .../conversationHistory/conversationData.ts | 33 +++----------- .../conversationHistory/folderBuilder.ts | 4 ++ e2e/src/testData/folders/folderData.ts | 43 +++++++++++++++++++ e2e/src/testData/index.ts | 1 + e2e/src/testData/prompts/promptData.ts | 29 +++---------- 6 files changed, 59 insertions(+), 53 deletions(-) create mode 100644 e2e/src/testData/folders/folderData.ts diff --git a/e2e/config/local.playwright.config.ts b/e2e/config/local.playwright.config.ts index e56ee733e2..01b83145a6 100644 --- a/e2e/config/local.playwright.config.ts +++ b/e2e/config/local.playwright.config.ts @@ -6,7 +6,7 @@ import { ReporterDescription } from '@playwright/test'; * Config used for a local run */ config.workers = 2; -config.use!.headless = false; +config.use!.headless = true; config.use!.video = 'on'; config.use!.trace = 'on'; (config.reporter as ReporterDescription[]).push([ diff --git a/e2e/src/testData/conversationHistory/conversationData.ts b/e2e/src/testData/conversationHistory/conversationData.ts index 5cf5e5c373..77f129c910 100644 --- a/e2e/src/testData/conversationHistory/conversationData.ts +++ b/e2e/src/testData/conversationHistory/conversationData.ts @@ -10,7 +10,7 @@ import { ExpectedConstants, ModelIds, } from '@/e2e/src/testData'; -import { FolderBuilder } from '@/e2e/src/testData/conversationHistory/folderBuilder'; +import { FolderData } from '@/e2e/src/testData/folders/folderData'; import { v4 as uuidv4 } from 'uuid'; export interface FolderConversation { @@ -18,18 +18,17 @@ export interface FolderConversation { folders: FolderInterface; } -export class ConversationData { +export class ConversationData extends FolderData { private conversationBuilder: ConversationBuilder; - private folderBuilder: FolderBuilder; constructor() { + super('chat'); this.conversationBuilder = new ConversationBuilder(); - this.folderBuilder = new FolderBuilder(); } public resetData() { this.conversationBuilder = new ConversationBuilder(); - this.folderBuilder = new FolderBuilder(); + this.resetFolderData(); } public prepareDefaultConversation(model?: OpenAIEntityModel, name?: string) { @@ -203,30 +202,8 @@ export class ConversationData { return conversation; } - public prepareDefaultFolder() { - return this.folderBuilder.build(); - } - - public prepareFolder(name?: string) { - return this.folderBuilder - .withName(name ?? GeneratorUtil.randomString(7)) - .build(); - } - public prepareNestedFolder(nestedLevel: number) { - const rootFolder = this.prepareFolder(); - this.resetData(); - const foldersHierarchy = [rootFolder]; - for (let i = 1; i <= nestedLevel; i++) { - const nestedFolder = this.folderBuilder - .withName(GeneratorUtil.randomString(7)) - .withType('chat') - .withFolderId(foldersHierarchy[foldersHierarchy.length - 1].id) - .build(); - foldersHierarchy.push(nestedFolder); - this.resetData(); - } - return foldersHierarchy; + return super.prepareNestedFolder(nestedLevel, 'chat'); } public prepareFolderWithConversations(conversationsCount: number) { diff --git a/e2e/src/testData/conversationHistory/folderBuilder.ts b/e2e/src/testData/conversationHistory/folderBuilder.ts index eb3e9b1175..bf74b2ed67 100644 --- a/e2e/src/testData/conversationHistory/folderBuilder.ts +++ b/e2e/src/testData/conversationHistory/folderBuilder.ts @@ -14,6 +14,10 @@ export class FolderBuilder { }; } + getFolder() { + return this.folder; + } + withId(id: string): FolderBuilder { this.folder.id = id; return this; diff --git a/e2e/src/testData/folders/folderData.ts b/e2e/src/testData/folders/folderData.ts new file mode 100644 index 0000000000..18f18041de --- /dev/null +++ b/e2e/src/testData/folders/folderData.ts @@ -0,0 +1,43 @@ +import { FolderType } from '@/src/types/folder'; + +import { FolderBuilder } from '@/e2e/src/testData/conversationHistory/folderBuilder'; +import { GeneratorUtil } from '@/e2e/src/utils'; + +export class FolderData { + private folderBuilder: FolderBuilder; + + constructor(type: FolderType) { + this.folderBuilder = new FolderBuilder().withType(type); + } + + public resetFolderData() { + const type = this.folderBuilder.getFolder().type; + this.folderBuilder = new FolderBuilder().withType(type); + } + + public prepareDefaultFolder() { + return this.folderBuilder.build(); + } + + public prepareFolder(name?: string) { + return this.folderBuilder + .withName(name ?? GeneratorUtil.randomString(7)) + .build(); + } + + public prepareNestedFolder(nestedLevel: number, type: FolderType) { + const rootFolder = this.prepareFolder(); + this.resetFolderData(); + const foldersHierarchy = [rootFolder]; + for (let i = 1; i <= nestedLevel; i++) { + const nestedFolder = this.folderBuilder + .withName(GeneratorUtil.randomString(7)) + .withType(type) + .withFolderId(foldersHierarchy[foldersHierarchy.length - 1].id) + .build(); + foldersHierarchy.push(nestedFolder); + this.resetFolderData(); + } + return foldersHierarchy; + } +} diff --git a/e2e/src/testData/index.ts b/e2e/src/testData/index.ts index a6ea291198..92f70267d3 100644 --- a/e2e/src/testData/index.ts +++ b/e2e/src/testData/index.ts @@ -5,3 +5,4 @@ export * from './conversationHistory/conversationData'; export * from './conversationHistory/folderBuilder'; export * from './prompts/promptBuilder'; export * from './prompts/promptData'; +export * from './folders/folderData'; diff --git a/e2e/src/testData/prompts/promptData.ts b/e2e/src/testData/prompts/promptData.ts index 3b1acea8c7..f7afc3dad3 100644 --- a/e2e/src/testData/prompts/promptData.ts +++ b/e2e/src/testData/prompts/promptData.ts @@ -3,7 +3,7 @@ import { GeneratorUtil } from '@/e2e/src/utils/generatorUtil'; import { FolderInterface } from '@/src/types/folder'; import { Prompt } from '@/src/types/prompt'; -import { FolderBuilder } from '@/e2e/src/testData/conversationHistory/folderBuilder'; +import { FolderData } from '@/e2e/src/testData/folders/folderData'; import { PromptBuilder } from '@/e2e/src/testData/prompts/promptBuilder'; export interface FolderPrompt { @@ -11,44 +11,25 @@ export interface FolderPrompt { folders: FolderInterface; } -export class PromptData { +export class PromptData extends FolderData { private promptBuilder: PromptBuilder; - private folderBuilder: FolderBuilder; constructor() { + super('prompt'); this.promptBuilder = new PromptBuilder(); - this.folderBuilder = new FolderBuilder().withType('prompt'); } public resetData() { this.promptBuilder = new PromptBuilder(); - this.folderBuilder = new FolderBuilder().withType('prompt'); + this.resetFolderData(); } public prepareDefaultPrompt() { return this.promptBuilder.withName(GeneratorUtil.randomString(10)).build(); } - public prepareFolder(name?: string) { - return this.folderBuilder - .withName(name ?? GeneratorUtil.randomString(7)) - .build(); - } - public prepareNestedFolder(nestedLevel: number) { - const rootFolder = this.prepareFolder(); - this.resetData(); - const foldersHierarchy = [rootFolder]; - for (let i = 1; i <= nestedLevel; i++) { - const nestedFolder = this.folderBuilder - .withName(GeneratorUtil.randomString(7)) - .withType('prompt') - .withFolderId(foldersHierarchy[foldersHierarchy.length - 1].id) - .build(); - foldersHierarchy.push(nestedFolder); - this.resetData(); - } - return foldersHierarchy; + return super.prepareNestedFolder(nestedLevel, 'prompt'); } public prepareDefaultPromptInFolder(name?: string): FolderPrompt {