From 48281c1efefd62f2ea5b0a625f2613070c030da5 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 5 Aug 2024 12:36:56 +0300 Subject: [PATCH 01/44] feat/added-gpt4o-mini-model: added 'gpt-4o-mini-2024-07-18' model to tests; changed system prompt value --- apps/chat-e2e/src/testData/expectedConstants.ts | 1 + apps/chat-e2e/src/tests/chatApi/arithmeticRequest.test.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/chat-e2e/src/testData/expectedConstants.ts b/apps/chat-e2e/src/testData/expectedConstants.ts index a74e54bf2f..01bf2dfcc0 100644 --- a/apps/chat-e2e/src/testData/expectedConstants.ts +++ b/apps/chat-e2e/src/testData/expectedConstants.ts @@ -294,6 +294,7 @@ export enum ModelIds { GPT_4_32K_0613 = 'gpt-4-32k-0613', GPT_4_VISION_PREVIEW = 'gpt-4-vision-preview', GPT_4_O_2024_05_13 = 'gpt-4o-2024-05-13', + GPT_4_O_MINI_2024_07_18 = 'gpt-4o-mini-2024-07-18', CHAT_BISON = 'chat-bison', BISON_001 = 'chat-bison@001', BISON_32k_002 = 'chat-bison-32k@002', diff --git a/apps/chat-e2e/src/tests/chatApi/arithmeticRequest.test.ts b/apps/chat-e2e/src/tests/chatApi/arithmeticRequest.test.ts index 0427afa7e4..8ccea75756 100644 --- a/apps/chat-e2e/src/tests/chatApi/arithmeticRequest.test.ts +++ b/apps/chat-e2e/src/tests/chatApi/arithmeticRequest.test.ts @@ -60,7 +60,7 @@ for (const modelToUse of modelsForArithmeticRequest) { const conversation = conversationData.prepareModelConversation( 0, modelToUse.isSysPromptAllowed - ? 'Answer arithmetic question. The answer should be number, do not use natural language' + ? 'Compute arithmetic expression. The answer should be a number, do not use natural language' : '', [], modelToUse.modelId, From 292ae2ce26245e1148ad3f958476c61ce2b83c2a Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Jan 2025 10:56:07 +0100 Subject: [PATCH 02/44] feat/overlay-settings-tests: implemented tests for overlay settings --- apps/chat-e2e/src/assertions/baseAssertion.ts | 7 +- .../assertions/overlay/overlayAssertion.ts | 15 +- apps/chat-e2e/src/core/baseFixtures.ts | 25 +- apps/chat-e2e/src/core/dialFixtures.ts | 21 - apps/chat-e2e/src/core/dialOverlayFixtures.ts | 224 ++++++- .../src/testData/api/baseApiHelper.ts | 12 + .../src/testData/api/fileApiHelper.ts | 8 +- .../src/testData/api/itemApiHelper.ts | 47 +- .../src/testData/api/publicationApiHelper.ts | 56 +- .../src/testData/api/shareApiHelper.ts | 29 +- .../conversationHistory/conversationData.ts | 3 +- .../src/testData/expectedConstants.ts | 4 + .../src/testData/injector/apiInjector.ts | 4 +- .../injector/dataInjectorInterface.ts | 2 +- .../testData/overlay/overlaySandboxUrls.ts | 26 +- .../tests/overlay/chatSettingsFeature.test.ts | 270 ++++++++ .../src/tests/overlay/headerFeature.test.ts | 627 ++++++++++++++++++ .../tests/overlay/marketplaceFeature.test.ts | 155 +++++ .../src/tests/overlay/modelIdFeature.test.ts | 121 +++- .../chat-e2e/src/tests/overlay/overlayAuth.ts | 4 + .../overlayConversationIdFeature.test.ts | 155 +++++ .../tests/overlay/topSettingsFeature.test.ts | 135 ++++ .../src/ui/pages/overlay/overlayHomePage.ts | 13 + .../src/ui/selectors/dialogSelectors.ts | 10 + .../src/ui/selectors/headerSelectors.ts | 9 +- .../src/ui/selectors/marketplaceSelectors.ts | 1 + .../src/ui/selectors/sideBarSelectors.ts | 1 + .../src/ui/webElements/accountSettings.ts | 12 +- .../src/ui/webElements/appContainer.ts | 2 +- .../src/ui/webElements/attachFilesModal.ts | 6 +- apps/chat-e2e/src/ui/webElements/chat.ts | 4 +- apps/chat-e2e/src/ui/webElements/chatBar.ts | 3 + .../chat-e2e/src/ui/webElements/chatHeader.ts | 7 +- .../src/ui/webElements/chatMessages.ts | 5 + .../src/ui/webElements/confirmationDialog.ts | 15 +- .../entityTree/sidebar/sideBarEntitiesTree.ts | 1 + apps/chat-e2e/src/ui/webElements/footer.ts | 4 +- .../webElements/footer/reportAnIssueModal.ts | 17 + .../webElements/footer/requestApiKeyModal.ts | 17 + apps/chat-e2e/src/ui/webElements/header.ts | 4 +- .../marketplace/marketplaceHeader.ts | 3 + apps/chat-e2e/src/ui/webElements/menu.ts | 4 +- .../src/ui/webElements/modelInfoTooltip.ts | 7 +- .../ui/webElements/overlay/profilePanel.ts | 24 + .../src/ui/webElements/playbackControl.ts | 6 +- apps/chat-e2e/src/ui/webElements/promptBar.ts | 6 +- .../ui/webElements/publishingRequestModal.ts | 10 +- .../src/ui/webElements/settingsModal.ts | 13 +- .../chat-e2e/src/ui/webElements/shareModal.ts | 6 +- .../src/ui/webElements/talkToAgentDialog.ts | 3 + .../Chat/ChatHeader/HeaderModelTooltip.tsx | 2 +- .../src/components/Chat/ReportIssueDialog.tsx | 2 +- apps/chat/src/components/Header/Logo.tsx | 1 + .../components/Header/User/ProfileButton.tsx | 8 +- .../components/Header/User/UserDesktop.tsx | 8 +- .../src/components/Header/User/UserMobile.tsx | 9 +- .../components/Marketplace/SearchHeader.tsx | 5 +- .../components/Settings/CustomLogoSelect.tsx | 1 + .../src/components/Settings/SettingDialog.tsx | 7 - .../disabled-all-features-sandbox/page.tsx | 23 + .../overlay/disabled-header-sandbox/page.tsx | 40 ++ .../disabled-marketplace-sandbox/page.tsx | 25 + .../disabled-top-chat-info-sandbox/page.tsx | 23 + .../page.tsx | 23 + .../overlay/enabled-header-sandbox/page.tsx | 41 ++ .../page.tsx | 19 + .../page.tsx | 23 + .../enabled-input-files-sandbox/page.tsx | 24 + .../enabled-marketplace-sandbox/page.tsx | 28 + .../page.tsx | 25 + .../page.tsx | 23 + .../page.tsx | 19 + .../page.tsx | 19 + .../enabled-only-header-sandbox/page.tsx | 19 + .../overlay/model-id-set-sandbox/page.tsx | 1 - .../page.tsx | 25 + apps/overlay-sandbox/app/global.css | 12 + apps/overlay-sandbox/app/page.tsx | 102 ++- 78 files changed, 2529 insertions(+), 191 deletions(-) create mode 100644 apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts create mode 100644 apps/chat-e2e/src/tests/overlay/headerFeature.test.ts create mode 100644 apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts create mode 100644 apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts create mode 100644 apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts create mode 100644 apps/chat-e2e/src/ui/webElements/footer/reportAnIssueModal.ts create mode 100644 apps/chat-e2e/src/ui/webElements/footer/requestApiKeyModal.ts create mode 100644 apps/chat-e2e/src/ui/webElements/overlay/profilePanel.ts create mode 100644 apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx create mode 100644 apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx diff --git a/apps/chat-e2e/src/assertions/baseAssertion.ts b/apps/chat-e2e/src/assertions/baseAssertion.ts index a8a0165adb..d6ee45ebbc 100644 --- a/apps/chat-e2e/src/assertions/baseAssertion.ts +++ b/apps/chat-e2e/src/assertions/baseAssertion.ts @@ -85,10 +85,13 @@ export class BaseAssertion { } public async assertElementActionabilityState( - element: BaseElement, + element: BaseElement | Locator, expectedState: ElementActionabilityState, ) { - const elementLocator = element.getElementLocator(); + const elementLocator = + element instanceof BaseElement + ? element.getElementLocator() + : (element as Locator); expectedState == 'enabled' ? await expect .soft(elementLocator, ExpectedMessages.elementIsEnabled) diff --git a/apps/chat-e2e/src/assertions/overlay/overlayAssertion.ts b/apps/chat-e2e/src/assertions/overlay/overlayAssertion.ts index c1be23e132..0129487a63 100644 --- a/apps/chat-e2e/src/assertions/overlay/overlayAssertion.ts +++ b/apps/chat-e2e/src/assertions/overlay/overlayAssertion.ts @@ -1,6 +1,7 @@ import { BaseAssertion } from '@/src/assertions'; -import { ExpectedMessages } from '@/src/testData'; +import { ExpectedMessages, Theme } from '@/src/testData'; import { Attributes } from '@/src/ui/domData'; +import { OverlayHomePage } from '@/src/ui/pages/overlay/overlayHomePage'; import { BaseElement } from '@/src/ui/webElements'; import { expect } from '@playwright/test'; @@ -42,4 +43,16 @@ export class OverlayAssertion extends BaseAssertion { throw new Error(propertyNotDefinedError); } } + + public async assertOverlayTheme( + overlayHomePage: OverlayHomePage, + expectedTheme: Theme, + ) { + expect + .soft( + await overlayHomePage.getTheme(), + ExpectedMessages.applicationThemeIsValid, + ) + .toBe(`${expectedTheme} ${expectedTheme}`); + } } diff --git a/apps/chat-e2e/src/core/baseFixtures.ts b/apps/chat-e2e/src/core/baseFixtures.ts index 0d119c12f1..3402e0b39f 100644 --- a/apps/chat-e2e/src/core/baseFixtures.ts +++ b/apps/chat-e2e/src/core/baseFixtures.ts @@ -1,6 +1,11 @@ import { BaseAssertion } from '@/src/assertions'; import { LocalStorageManager } from '@/src/core/localStorageManager'; -import { AuthProvider } from '@/src/testData'; +import { + AuthProvider, + ConversationData, + PromptData, + PublishRequestBuilder, +} from '@/src/testData'; import { Auth0Login } from '@/src/ui/actions/auth0Login'; import { AzureADLogin } from '@/src/ui/actions/azureADLogin'; import { KeycloakLogin } from '@/src/ui/actions/keycloakLogin'; @@ -43,6 +48,9 @@ const test = base.extend< baseAssertion: BaseAssertion; // eslint-disable-next-line @typescript-eslint/no-explicit-any incognitoProviderLogin: ProviderLogin; + conversationData: ConversationData; + promptData: PromptData; + publishRequestBuilder: PublishRequestBuilder; } >({ // eslint-disable-next-line no-empty-pattern @@ -181,6 +189,21 @@ const test = base.extend< } await use(incognitoProviderLogin); }, + // eslint-disable-next-line no-empty-pattern + conversationData: async ({}, use) => { + const conversationData = new ConversationData(); + await use(conversationData); + }, + // eslint-disable-next-line no-empty-pattern + promptData: async ({}, use) => { + const promptData = new PromptData(); + await use(promptData); + }, + // eslint-disable-next-line no-empty-pattern + publishRequestBuilder: async ({}, use) => { + const publishRequestBuilder = new PublishRequestBuilder(); + await use(publishRequestBuilder); + }, }); export default test; diff --git a/apps/chat-e2e/src/core/dialFixtures.ts b/apps/chat-e2e/src/core/dialFixtures.ts index 9864a3e792..e2595b91dc 100644 --- a/apps/chat-e2e/src/core/dialFixtures.ts +++ b/apps/chat-e2e/src/core/dialFixtures.ts @@ -61,7 +61,6 @@ import { SettingsModalAssertion } from '@/src/assertions/settingsModalAssertion' import { SideBarEntityAssertion } from '@/src/assertions/sideBarEntityAssertion'; import test from '@/src/core/baseFixtures'; import { isApiStorageType } from '@/src/hooks/global-setup'; -import { ConversationData, PublishRequestBuilder } from '@/src/testData'; import { ChatApiHelper, FileApiHelper, @@ -73,7 +72,6 @@ import { PublicationApiHelper } from '@/src/testData/api/publicationApiHelper'; import { ApiInjector } from '@/src/testData/injector/apiInjector'; import { BrowserStorageInjector } from '@/src/testData/injector/browserStorageInjector'; import { DataInjectorInterface } from '@/src/testData/injector/dataInjectorInterface'; -import { PromptData } from '@/src/testData/prompts/promptData'; import { AccountSettings } from '@/src/ui/webElements/accountSettings'; import { Addons } from '@/src/ui/webElements/addons'; import { AddonsDialog } from '@/src/ui/webElements/addonsDialog'; @@ -172,8 +170,6 @@ const dialTest = test.extend<{ addons: Addons; addonsDialog: AddonsDialog; agentInfo: AgentInfo; - conversationData: ConversationData; - promptData: PromptData; conversationDropdownMenu: DropdownMenu; folderDropdownMenu: DropdownMenu; promptDropdownMenu: DropdownMenu; @@ -187,7 +183,6 @@ const dialTest = test.extend<{ chatSettingsTooltip: ChatSettingsTooltip; compare: Compare; compareConversation: ConversationToCompare; - rightChatHeader: ChatHeader; leftChatHeader: ChatHeader; tooltip: Tooltip; @@ -233,7 +228,6 @@ const dialTest = test.extend<{ folderConversationsToPublish: FolderConversationsToPublish; publicationApiHelper: PublicationApiHelper; adminPublicationApiHelper: PublicationApiHelper; - publishRequestBuilder: PublishRequestBuilder; publishingRules: PublishingRules; conversationAssertion: ConversationAssertion; chatBarFolderAssertion: FolderAssertion; @@ -519,16 +513,6 @@ const dialTest = test.extend<{ const chatHeader = chat.getChatHeader(); await use(chatHeader); }, - // eslint-disable-next-line no-empty-pattern - conversationData: async ({}, use) => { - const conversationData = new ConversationData(); - await use(conversationData); - }, - // eslint-disable-next-line no-empty-pattern - promptData: async ({}, use) => { - const promptData = new PromptData(); - await use(promptData); - }, modelInfoTooltip: async ({ page }, use) => { const modelInfoTooltip = new ModelInfoTooltip(page); await use(modelInfoTooltip); @@ -744,11 +728,6 @@ const dialTest = test.extend<{ ); await use(adminPublicationApiHelper); }, - // eslint-disable-next-line no-empty-pattern - publishRequestBuilder: async ({}, use) => { - const publishRequestBuilder = new PublishRequestBuilder(); - await use(publishRequestBuilder); - }, publishingRules: async ({ publishingRequestModal }, use) => { const publishingRules = publishingRequestModal.getPublishingRules(); await use(publishingRules); diff --git a/apps/chat-e2e/src/core/dialOverlayFixtures.ts b/apps/chat-e2e/src/core/dialOverlayFixtures.ts index 726475c56e..3aa03bb132 100644 --- a/apps/chat-e2e/src/core/dialOverlayFixtures.ts +++ b/apps/chat-e2e/src/core/dialOverlayFixtures.ts @@ -1,34 +1,58 @@ import { + AccountSettings, AgentInfo, AgentSettings, + AttachFilesModal, Chat, ChatBar, ChatHeader, ChatMessages, + ConfirmationDialog, ConversationSettingsModal, - MarketplaceAgents, + DropdownMenu, + ModelInfoTooltip, + PromptBar, + PublishingRequestModal, + SendMessage, TalkToAgentDialog, } from '../ui/webElements'; +import config from '@/config/overlay.playwright.config'; import { AgentInfoAssertion, - AgentSettingAssertion, ApiAssertion, BaseAssertion, - ChatHeaderAssertion, ChatMessagesAssertion, + ConversationAssertion, + PromptAssertion, TalkToAgentDialogAssertion, } from '@/src/assertions'; import { OverlayAssertion } from '@/src/assertions/overlay/overlayAssertion'; import test from '@/src/core/baseFixtures'; -import { IconApiHelper, ItemApiHelper } from '@/src/testData/api'; +import { + FileApiHelper, + IconApiHelper, + ItemApiHelper, + PublicationApiHelper, +} from '@/src/testData/api'; import { ApiInjector } from '@/src/testData/injector/apiInjector'; import { DataInjectorInterface } from '@/src/testData/injector/dataInjectorInterface'; import { OverlayHomePage } from '@/src/ui/pages/overlay/overlayHomePage'; import { OverlayMarketplacePage } from '@/src/ui/pages/overlay/overlayMarketplacePage'; -import { ConversationsTree } from '@/src/ui/webElements/entityTree'; +import { + ConversationsTree, + OrganizationConversationsTree, + PromptsTree, +} from '@/src/ui/webElements/entityTree'; +import { ReportAnIssueModal } from '@/src/ui/webElements/footer/reportAnIssueModal'; +import { RequestApiKeyModal } from '@/src/ui/webElements/footer/requestApiKeyModal'; import { Header } from '@/src/ui/webElements/header'; +import { ProfilePanel } from '@/src/ui/webElements/overlay/profilePanel'; +import { PlaybackControl } from '@/src/ui/webElements/playbackControl'; +import { SettingsModal } from '@/src/ui/webElements/settingsModal'; +import { ShareModal } from '@/src/ui/webElements/shareModal'; import path from 'path'; +import { APIRequestContext } from 'playwright-core'; import * as process from 'process'; export const overlayStateFilePath = (index: number) => @@ -42,35 +66,54 @@ const dialOverlayTest = test.extend<{ overlayAgentInfo: AgentInfo; overlayHeader: Header; overlayChatBar: ChatBar; + overlaySendMessage: SendMessage; overlayConversations: ConversationsTree; - chatHeader: ChatHeader; overlayChatHeader: ChatHeader; overlayChatMessages: ChatMessages; overlayConversationSettingsModal: ConversationSettingsModal; overlayAgentSettings: AgentSettings; overlayItemApiHelper: ItemApiHelper; + overlayPublicationApiHelper: PublicationApiHelper; + overlayFileApiHelper: FileApiHelper; overlayIconApiHelper: IconApiHelper; overlayApiInjector: ApiInjector; overlayDataInjector: DataInjectorInterface; overlayBaseAssertion: BaseAssertion; overlayAgentInfoAssertion: AgentInfoAssertion; - overlayChatHeaderAssertion: ChatHeaderAssertion; overlayChatMessagesAssertion: ChatMessagesAssertion; overlayApiAssertion: ApiAssertion; - overlayAgentSettingAssertion: AgentSettingAssertion; overlayTalkToAgentDialog: TalkToAgentDialog; - overlayTalkToAgents: MarketplaceAgents; - talkToAgentDialogAssertion: TalkToAgentDialogAssertion; + overlayPromptBar: PromptBar; + overlayPrompts: PromptsTree; + overlayConversationDropdownMenu: DropdownMenu; + overlayPromptDropdownMenu: DropdownMenu; + overlayShareModal: ShareModal; + overlayPublishingRequestModal: PublishingRequestModal; + overlayAccountSettings: AccountSettings; + overlayProfilePanel: ProfilePanel; + overlaySettingsModal: SettingsModal; + overlayConfirmationDialog: ConfirmationDialog; + overlayModelInfoTooltip: ModelInfoTooltip; + overlayRequestApiKeyModal: RequestApiKeyModal; + overlayReportAnIssueModal: ReportAnIssueModal; + overlayAttachFilesModal: AttachFilesModal; + overlayPlaybackControl: PlaybackControl; + overlayOrganizationConversations: OrganizationConversationsTree; + overlayTalkToAgentDialogAssertion: TalkToAgentDialogAssertion; overlayAssertion: OverlayAssertion; + overlayConversationAssertion: ConversationAssertion; + overlayPromptAssertion: PromptAssertion; + adminUserRequestContext: APIRequestContext; + adminPublicationApiHelper: PublicationApiHelper; }>({ // eslint-disable-next-line no-empty-pattern storageState: async ({}, use) => { await use(overlayStateFilePath(+process.env.TEST_PARALLEL_INDEX!)); }, beforeTestCleanup: [ - async ({ overlayDataInjector }, use) => { - await overlayDataInjector.deleteAllData(true); - // await fileApiHelper.deleteAllFiles(); + async ({ overlayDataInjector, overlayFileApiHelper }, use) => { + await overlayDataInjector.deleteAllData(); + await overlayFileApiHelper.deleteAllFiles(); await use('beforeTestCleanup'); }, { scope: 'test', auto: true }, @@ -99,6 +142,10 @@ const dialOverlayTest = test.extend<{ const overlayChatBar = overlayHomePage.getOverlayContainer().getChatBar(); await use(overlayChatBar); }, + overlaySendMessage: async ({ overlayChat }, use) => { + const overlaySendMessage = overlayChat.getSendMessage(); + await use(overlaySendMessage); + }, overlayConversations: async ({ overlayChatBar }, use) => { const overlayConversations = overlayChatBar.getConversationsTree(); await use(overlayConversations); @@ -127,6 +174,14 @@ const dialOverlayTest = test.extend<{ const overlayItemApiHelper = new ItemApiHelper(request); await use(overlayItemApiHelper); }, + overlayPublicationApiHelper: async ({ request }, use) => { + const overlayPublicationApiHelper = new PublicationApiHelper(request); + await use(overlayPublicationApiHelper); + }, + overlayFileApiHelper: async ({ request }, use) => { + const overlayFileApiHelper = new FileApiHelper(request); + await use(overlayFileApiHelper); + }, overlayIconApiHelper: async ({ request }, use) => { const overlayIconApiHelper = new IconApiHelper(request); await use(overlayIconApiHelper); @@ -147,10 +202,6 @@ const dialOverlayTest = test.extend<{ const overlayAgentInfoAssertion = new AgentInfoAssertion(overlayAgentInfo); await use(overlayAgentInfoAssertion); }, - overlayChatHeaderAssertion: async ({ overlayChatHeader }, use) => { - const chatHeaderAssertion = new ChatHeaderAssertion(overlayChatHeader); - await use(chatHeaderAssertion); - }, overlayChatMessagesAssertion: async ({ overlayChatMessages }, use) => { const overlayChatMessagesAssertion = new ChatMessagesAssertion( overlayChatMessages, @@ -162,12 +213,6 @@ const dialOverlayTest = test.extend<{ const overlayApiAssertion = new ApiAssertion(); await use(overlayApiAssertion); }, - overlayAgentSettingAssertion: async ({ overlayAgentSettings }, use) => { - const overlayAgentSettingAssertion = new AgentSettingAssertion( - overlayAgentSettings, - ); - await use(overlayAgentSettingAssertion); - }, overlayTalkToAgentDialog: async ({ page, overlayHomePage }, use) => { const overlayTalkToAgentDialog = new TalkToAgentDialog( page, @@ -175,21 +220,142 @@ const dialOverlayTest = test.extend<{ ); await use(overlayTalkToAgentDialog); }, - overlayTalkToAgents: async ({ overlayTalkToAgentDialog }, use) => { - const talkToAgents = overlayTalkToAgentDialog.getAgents(); - await use(talkToAgents); + overlayPromptBar: async ({ overlayHomePage }, use) => { + const overlayPromptBar = overlayHomePage + .getOverlayContainer() + .getPromptBar(); + await use(overlayPromptBar); + }, + overlayPrompts: async ({ overlayPromptBar }, use) => { + const overlayPrompts = overlayPromptBar.getPromptsTree(); + await use(overlayPrompts); + }, + overlayConversationDropdownMenu: async ({ page, overlayHomePage }, use) => { + const overlayConversationDropdownMenu = new DropdownMenu( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayConversationDropdownMenu); + }, + overlayPromptDropdownMenu: async ({ page, overlayHomePage }, use) => { + const overlayPromptDropdownMenu = new DropdownMenu( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayPromptDropdownMenu); + }, + overlayShareModal: async ({ page, overlayHomePage }, use) => { + const overlayShareModal = new ShareModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayShareModal); + }, + overlayPublishingRequestModal: async ({ page, overlayHomePage }, use) => { + const publishingModal = new PublishingRequestModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(publishingModal); + }, + overlayAccountSettings: async ({ overlayHeader }, use) => { + const overlayAccountSettings = overlayHeader.getAccountSettings(); + await use(overlayAccountSettings); + }, + overlayProfilePanel: async ({ page, overlayHomePage }, use) => { + const overlayProfilePanel = new ProfilePanel( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayProfilePanel); + }, + overlaySettingsModal: async ({ page, overlayHomePage }, use) => { + const overlaySettingsModal = new SettingsModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlaySettingsModal); + }, + overlayConfirmationDialog: async ({ page, overlayHomePage }, use) => { + const overlayConfirmationDialog = new ConfirmationDialog( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayConfirmationDialog); + }, + overlayModelInfoTooltip: async ({ page, overlayHomePage }, use) => { + const overlayModelInfoTooltip = new ModelInfoTooltip( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayModelInfoTooltip); + }, + overlayRequestApiKeyModal: async ({ page, overlayHomePage }, use) => { + const overlayRequestApiKeyModal = new RequestApiKeyModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayRequestApiKeyModal); }, - talkToAgentDialogAssertion: async ({ overlayTalkToAgentDialog }, use) => { - const talkToAgentDialogAssertion = new TalkToAgentDialogAssertion( + overlayReportAnIssueModal: async ({ page, overlayHomePage }, use) => { + const overlayReportAnIssueModal = new ReportAnIssueModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayReportAnIssueModal); + }, + overlayAttachFilesModal: async ({ page, overlayHomePage }, use) => { + const overlayAttachFilesModal = new AttachFilesModal( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayAttachFilesModal); + }, + overlayPlaybackControl: async ({ overlayChat }, use) => { + const overlayPlaybackControl = overlayChat.getPlaybackControl(); + await use(overlayPlaybackControl); + }, + overlayOrganizationConversations: async ({ overlayChatBar }, use) => { + const overlayOrganizationConversations = + overlayChatBar.getOrganizationConversationsTree(); + await use(overlayOrganizationConversations); + }, + overlayTalkToAgentDialogAssertion: async ( + { overlayTalkToAgentDialog }, + use, + ) => { + const overlayTalkToAgentDialogAssertion = new TalkToAgentDialogAssertion( overlayTalkToAgentDialog, ); - await use(talkToAgentDialogAssertion); + await use(overlayTalkToAgentDialogAssertion); }, // eslint-disable-next-line no-empty-pattern overlayAssertion: async ({}, use) => { const overlayAssertion = new OverlayAssertion(); await use(overlayAssertion); }, + overlayConversationAssertion: async ({ overlayConversations }, use) => { + const overlayConversationAssertion = new ConversationAssertion( + overlayConversations, + ); + await use(overlayConversationAssertion); + }, + overlayPromptAssertion: async ({ overlayPrompts }, use) => { + const promptAssertion = new PromptAssertion(overlayPrompts); + await use(promptAssertion); + }, + adminUserRequestContext: async ({ playwright }, use) => { + const adminUserRequestContext = await playwright.request.newContext({ + storageState: overlayStateFilePath(+config.workers!), + }); + await use(adminUserRequestContext); + }, + adminPublicationApiHelper: async ({ adminUserRequestContext }, use) => { + const adminPublicationApiHelper = new PublicationApiHelper( + adminUserRequestContext, + ); + await use(adminPublicationApiHelper); + }, }); export default dialOverlayTest; diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index 7f4cc1658a..1ece78425d 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -1,3 +1,4 @@ +import config from '@/config/overlay.playwright.config'; import { APIRequestContext } from '@playwright/test'; export class BaseApiHelper { @@ -6,4 +7,15 @@ export class BaseApiHelper { constructor(request: APIRequestContext) { this.request = request; } + + //function to override the API host if overlay sandbox is running + public getHost(endpoint: string) { + if ( + process.env.NEXT_PUBLIC_OVERLAY_HOST && + config.use!.baseURL !== process.env.NEXT_PUBLIC_OVERLAY_HOST + ) { + endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; + } + return endpoint; + } } diff --git a/apps/chat-e2e/src/testData/api/fileApiHelper.ts b/apps/chat-e2e/src/testData/api/fileApiHelper.ts index ec649df0a1..0f8bf984ee 100644 --- a/apps/chat-e2e/src/testData/api/fileApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/fileApiHelper.ts @@ -27,7 +27,7 @@ export class FileApiHelper extends BaseApiHelper { const url = parentPath ? `${baseUrl}/${encodedParentPath}/${encodedFilename}` : `${baseUrl}/${encodedFilename}`; - const response = await this.request.put(url, { + const response = await this.request.put(this.getHost(url), { headers: { Accept: '*/*', ContentType: 'multipart/form-data', @@ -51,7 +51,7 @@ export class FileApiHelper extends BaseApiHelper { public async deleteFromAllFiles(path: string) { const url = `/api/${path}`; - const response = await this.request.delete(url); + const response = await this.request.delete(this.getHost(url)); expect(response.status(), `File by path: ${path} was deleted`).toBe(200); } @@ -61,7 +61,7 @@ export class FileApiHelper extends BaseApiHelper { const requestData = { resources: [{ url: encodedPath }], }; - const response = await this.request.post(url, { + const response = await this.request.post(this.getHost(url), { data: requestData, }); expect( @@ -74,7 +74,7 @@ export class FileApiHelper extends BaseApiHelper { const host = url ? `${API.listingHost}/${url.substring(0, url.length - 1)}` : `${API.filesListingHost()}/${this.userBucket ?? BucketUtil.getBucket()}`; - const response = await this.request.get(host, { + const response = await this.request.get(this.getHost(host), { params: { filter: nodeType, }, diff --git a/apps/chat-e2e/src/testData/api/itemApiHelper.ts b/apps/chat-e2e/src/testData/api/itemApiHelper.ts index 3d676bf8e9..22cd86e18a 100644 --- a/apps/chat-e2e/src/testData/api/itemApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/itemApiHelper.ts @@ -16,43 +16,32 @@ export class ItemApiHelper extends BaseApiHelper { this.userBucket = userBucket; } - public async deleteAllData(bucket?: string, isOverlay = false) { + public async deleteAllData(bucket?: string) { const bucketToUse = this.userBucket ?? bucket; const conversations = await this.listItems( API.conversationsHost(), bucketToUse, - isOverlay, ); - const prompts = await this.listItems( - API.promptsHost(), - bucketToUse, - isOverlay, - ); - await this.deleteBackendItem(isOverlay, ...conversations, ...prompts); + const prompts = await this.listItems(API.promptsHost(), bucketToUse); + await this.deleteBackendItem(...conversations, ...prompts); } - public async listItems(url: string, bucket?: string, isOverlay?: boolean) { + public async listItems(url: string, bucket?: string) { const bucketToUse = this.userBucket ?? bucket; - return this.getItems( - `${url}/${bucketToUse ?? BucketUtil.getBucket()}`, - isOverlay, - ); + return this.getItems(`${url}/${bucketToUse ?? BucketUtil.getBucket()}`); } public async listItem(itemUrl: string) { return this.getItems(`${API.listingHost}/${itemUrl}`); } - public async getItems(url: string, isOverlay?: boolean) { - const response = await this.request.get( - isOverlay ? process.env.NEXT_PUBLIC_OVERLAY_HOST + url : url, - { - params: { - filter: BackendDataNodeType.ITEM, - recursive: true, - }, + public async getItems(url: string) { + const response = await this.request.get(this.getHost(url), { + params: { + filter: BackendDataNodeType.ITEM, + recursive: true, }, - ); + }); const statusCode = response.status(); expect( statusCode, @@ -61,16 +50,10 @@ export class ItemApiHelper extends BaseApiHelper { return (await response.json()) as BackendDataEntity[]; } - public async deleteBackendItem( - isOverlay?: boolean, - ...items: BackendDataEntity[] - ) { + public async deleteBackendItem(...items: BackendDataEntity[]) { for (const item of items) { const path = `/api/${item.url}`; - const url = isOverlay - ? process.env.NEXT_PUBLIC_OVERLAY_HOST + path - : path; - const response = await this.request.delete(url); + const response = await this.request.delete(this.getHost(path)); expect( response.status(), `Backend item with id: ${item.name} was successfully deleted`, @@ -80,7 +63,7 @@ export class ItemApiHelper extends BaseApiHelper { public async deleteEntity(entity: Entity) { const url = `/api/${entity.id}`; - const response = await this.request.delete(url); + const response = await this.request.delete(this.getHost(url)); expect( response.status(), `Entity with id: ${entity.name} was successfully deleted`, @@ -115,7 +98,7 @@ export class ItemApiHelper extends BaseApiHelper { public async createItem(item: Prompt | Conversation) { const url = `/api/${ItemUtil.getEncodedItemId(item.id)}`; - const response = await this.request.put(url, { + const response = await this.request.put(this.getHost(url), { data: item, }); expect( diff --git a/apps/chat-e2e/src/testData/api/publicationApiHelper.ts b/apps/chat-e2e/src/testData/api/publicationApiHelper.ts index 0cff397e4a..9145514a4b 100644 --- a/apps/chat-e2e/src/testData/api/publicationApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/publicationApiHelper.ts @@ -15,9 +15,14 @@ export type PublicationProps = PublicationInfo & Partial; export class PublicationApiHelper extends BaseApiHelper { public async listPublicationRequests() { - const response = await this.request.post(API.pendingPublicationsListing, { - data: { url: `publications/${ExpectedConstants.rootPublicationFolder}` }, - }); + const response = await this.request.post( + this.getHost(API.pendingPublicationsListing), + { + data: { + url: `publications/${ExpectedConstants.rootPublicationFolder}`, + }, + }, + ); const statusCode = response.status(); expect( statusCode, @@ -27,9 +32,12 @@ export class PublicationApiHelper extends BaseApiHelper { } public async getPublicationRequestDetails(publicationUrl: string) { - const response = await this.request.post(API.publicationRequestDetails, { - data: { url: publicationUrl }, - }); + const response = await this.request.post( + this.getHost(API.publicationRequestDetails), + { + data: { url: publicationUrl }, + }, + ); const statusCode = response.status(); expect( statusCode, @@ -41,9 +49,12 @@ export class PublicationApiHelper extends BaseApiHelper { public async approveRequest( publicationRequest: Publication | PublicationInfo, ) { - const response = await this.request.post(API.publicationRequestApproval, { - data: { url: publicationRequest.url }, - }); + const response = await this.request.post( + this.getHost(API.publicationRequestApproval), + { + data: { url: publicationRequest.url }, + }, + ); expect(response.status(), `Successfully approved publication request`).toBe( 200, ); @@ -52,9 +63,12 @@ export class PublicationApiHelper extends BaseApiHelper { public async rejectRequest( publicationRequest: Publication | PublicationInfo, ) { - const response = await this.request.post(API.publicationRequestRejection, { - data: { url: publicationRequest.url }, - }); + const response = await this.request.post( + this.getHost(API.publicationRequestRejection), + { + data: { url: publicationRequest.url }, + }, + ); expect(response.status(), `Successfully rejected publication request`).toBe( 200, ); @@ -71,9 +85,12 @@ export class PublicationApiHelper extends BaseApiHelper { requestModel.targetFolder, ); - const response = await this.request.post(API.publicationRequestCreate, { - data: requestModel, - }); + const response = await this.request.post( + this.getHost(API.publicationRequestCreate), + { + data: requestModel, + }, + ); expect(response.status(), `Successfully created publication request`).toBe( 200, ); @@ -97,9 +114,12 @@ export class PublicationApiHelper extends BaseApiHelper { resources: unpublishResources, rules: publicationRequest.rules, }; - const response = await this.request.post(API.publicationRequestCreate, { - data: data, - }); + const response = await this.request.post( + this.getHost(API.publicationRequestCreate), + { + data: data, + }, + ); expect(response.status(), `Successfully created unpublish request`).toBe( 200, ); diff --git a/apps/chat-e2e/src/testData/api/shareApiHelper.ts b/apps/chat-e2e/src/testData/api/shareApiHelper.ts index 2b3cb244c8..9e018a533f 100644 --- a/apps/chat-e2e/src/testData/api/shareApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/shareApiHelper.ts @@ -65,9 +65,12 @@ export class ShareApiHelper extends BaseApiHelper { invitationType: ShareRequestType.link, resources: resources, }; - const response = await this.request.post(API.shareConversationHost, { - data: requestData, - }); + const response = await this.request.post( + this.getHost(API.shareConversationHost), + { + data: requestData, + }, + ); expect( response.status(), `Successfully created share invitation link`, @@ -85,9 +88,12 @@ export class ShareApiHelper extends BaseApiHelper { shareLinkResponse.invitationLink, ), }; - const response = await this.request.post(API.shareInviteAcceptanceHost, { - data: requestData, - }); + const response = await this.request.post( + this.getHost(API.shareInviteAcceptanceHost), + { + data: requestData, + }, + ); expect( response.status(), `Successfully accepted share invitation link`, @@ -112,7 +118,7 @@ export class ShareApiHelper extends BaseApiHelper { with: ShareRelations.me, order: 'popular_asc', }; - const response = await this.request.post(API.shareListing, { + const response = await this.request.post(this.getHost(API.shareListing), { data: requestData, }); const statusCode = response.status(); @@ -138,9 +144,12 @@ export class ShareApiHelper extends BaseApiHelper { const requestData: ShareRevokeRequestModel = { resources: entityUrls, }; - const response = await this.request.post(API.discardShareWithMeItem, { - data: requestData, - }); + const response = await this.request.post( + this.getHost(API.discardShareWithMeItem), + { + data: requestData, + }, + ); expect(response.status(), `Shared items successfully deleted`).toBe(200); } } diff --git a/apps/chat-e2e/src/testData/conversationHistory/conversationData.ts b/apps/chat-e2e/src/testData/conversationHistory/conversationData.ts index 623e7069c8..ab6c8d5c4f 100644 --- a/apps/chat-e2e/src/testData/conversationHistory/conversationData.ts +++ b/apps/chat-e2e/src/testData/conversationHistory/conversationData.ts @@ -580,6 +580,7 @@ export class ConversationData extends FolderData { attachmentUrl: string, model: DialAIEntityModel | string, folderName?: string, + name?: string, ) { const modelToUse = { id: typeof model === 'string' ? model : model.id }; const conversation = this.conversationBuilder.getConversation(); @@ -603,7 +604,7 @@ export class ConversationData extends FolderData { }, settings: settings, }; - const name = GeneratorUtil.randomString(10); + name = name ?? GeneratorUtil.randomString(10); let conversationBuilder = this.conversationBuilder .withName(name) diff --git a/apps/chat-e2e/src/testData/expectedConstants.ts b/apps/chat-e2e/src/testData/expectedConstants.ts index 429cb45769..b92c4c8c9b 100644 --- a/apps/chat-e2e/src/testData/expectedConstants.ts +++ b/apps/chat-e2e/src/testData/expectedConstants.ts @@ -210,6 +210,10 @@ export const ExpectedConstants = { 'Template must have at least one variable', messageTemplateRequiredField: 'Please fill in this required field', messageTemplateMismatchTextErrorMessage: `Template doesn't match the message text`, + modelInfoTooltipTitle: 'Current agent:', + modelInfoTooltipChangeTitle: 'Change current agent:', + requestApiKeyLink: 'this form', + reportAnIssueLink: 'report an issue', }; export enum Types { diff --git a/apps/chat-e2e/src/testData/injector/apiInjector.ts b/apps/chat-e2e/src/testData/injector/apiInjector.ts index c05bd954ad..c87af256e6 100644 --- a/apps/chat-e2e/src/testData/injector/apiInjector.ts +++ b/apps/chat-e2e/src/testData/injector/apiInjector.ts @@ -28,7 +28,7 @@ export class ApiInjector implements DataInjectorInterface { await this.itemApiHelper.createConversations(conversations); } - async deleteAllData(isOverlay = false) { - await this.itemApiHelper.deleteAllData(undefined, isOverlay); + async deleteAllData() { + await this.itemApiHelper.deleteAllData(); } } diff --git a/apps/chat-e2e/src/testData/injector/dataInjectorInterface.ts b/apps/chat-e2e/src/testData/injector/dataInjectorInterface.ts index 7c1f6c06d7..be419ed46a 100644 --- a/apps/chat-e2e/src/testData/injector/dataInjectorInterface.ts +++ b/apps/chat-e2e/src/testData/injector/dataInjectorInterface.ts @@ -19,5 +19,5 @@ export interface DataInjectorInterface { prompts: Prompt[], ...folders: FolderInterface[] ): Promise; - deleteAllData(isOverlay?: boolean): Promise; + deleteAllData(): Promise; } diff --git a/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts b/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts index 1ded1a6308..e943be679b 100644 --- a/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts +++ b/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts @@ -1,4 +1,28 @@ export const OverlaySandboxUrls = { - modelIdSetSandboxUrl: '/cases/overlay/model-id-set-sandbox', //sandbox to test 'EPMRTC-3781', 'EPMRTC-4693' + modelIdSetSandboxUrl: '/cases/overlay/model-id-set-sandbox', //sandbox to test 'EPMRTC-3781', 'EPMRTC-4693', 'EPMRTC-3770', 'EPMRTC-4438', 'EPMRTC-3782', 'EPMRTC-3762', 'EPMRTC-3763', 'EPMRTC-3764', 'EPMRTC-4873' overlayManagerUrl: '/cases/overlay-manager', //sandbox to test 'EPMRTC-1404' + disabledHeaderSandboxUrl: '/cases/overlay/disabled-header-sandbox', //sandbox to test 'EPMRTC-3759', 'EPMRTC-3760', 'EPMRTC-3769', 'EPMRTC-3768','EPMRTC-3771','EPMRTC-3772','EPMRTC-3775','EPMRTC-3776','EPMRTC-3777','EPMRTC-3778','EPMRTC-3779','EPMRTC-3767' + enabledHeaderSandboxUrl: '/cases/overlay/enabled-header-sandbox', //sandbox to test 'EPMRTC-3759', 'EPMRTC-3760', 'EPMRTC-3771', 'EPMRTC-3772', 'EPMRTC-3775', 'EPMRTC-3776', 'EPMRTC-3777', 'EPMRTC-3778', 'EPMRTC-3779', 'EPMRTC-4438', 'EPMRTC-3767' + enabledOnlyHeaderSandboxUrl: '/cases/overlay/enabled-only-header-sandbox', //sandbox to test 'EPMRTC-3766', 'EPMRTC-3767', 'EPMRTC-3778' + enabledOnlyHeaderFooterSandboxUrl: + '/cases/overlay/enabled-only-header-footer-sandbox', //sandbox to test 'EPMRTC-3768', 'EPMRTC-3769' + enabledOnlyFooterLinksAttachmentsUrl: + '/cases/overlay/enabled-only-footer-links-attachments-sandbox', //sandbox to test 'EPMRTC-3768', 'EPMRTC-3769', 'EPMRTC-3775' + enabledOnlyHeaderConversationsSectionSandboxUrl: + '/cases/overlay/enabled-only-header-conversations-section-sandbox', //sandbox to test 'EPMRTC-3775' + disableTopChatInfoUrl: '/cases/overlay/disabled-top-chat-info-sandbox', //sandbox to test 'EPMRTC-3762', 'EPMRTC-3763', 'EPMRTC-3764' + enableDisallowChangeAgentUrl: + '/cases/overlay/enabled-disallow-change-agent-sandbox', //sandbox to test 'EPMRTC-4872' + enableHideTopContextMenuUrl: + '/cases/overlay/enabled-hide-top-context-menu-sandbox', //sandbox to test 'EPMRTC-4873' + enableOnlyEmptyChatSettingsOverlayUrl: + '/cases/overlay/enabled-only-empty-chat-settings-sandbox', //sandbox to test 'EPMRTC-3773', 'EPMRTC-3765' + enableInputFilesUrl: '/cases/overlay/enabled-input-files-sandbox', //sandbox to test 'EPMRTC-3773' + enableHideEmptyChangeAgentUrl: + '/cases/overlay/enabled-hide-empty-change-agent-sandbox', //sandbox to test 'EPMRTC-4868' + disableAllFeaturesUrl: '/cases/overlay/disabled-all-features-sandbox', //sandbox to test 'EPMRTC-3780', 'EPMRTC-3765' + enableMarketplaceUrl: '/cases/overlay/enabled-marketplace-sandbox', //sandbox to test 'EPMRTC-4447', 'EPMRTC-4712' + disableMarketplaceUrl: '/cases/overlay/disabled-marketplace-sandbox', //sandbox to test 'EPMRTC-4867' + overlayConversationIdSetUrl: + '/cases/overlay/overlay-conversation-id-set-sandbox', //sandbox to test 'EPMRTC-4835' }; diff --git a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts new file mode 100644 index 0000000000..9000ce6dc2 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts @@ -0,0 +1,270 @@ +import { Conversation } from '@/chat/types/chat'; +import { DialAIEntityModel } from '@/chat/types/models'; +import dialTest from '@/src/core/dialFixtures'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { + MockedChatApiResponseBodies, + OverlaySandboxUrls, +} from '@/src/testData'; +import { GeneratorUtil, ModelsUtil } from '@/src/utils'; + +let modelWithAttachment: DialAIEntityModel; + +dialOverlayTest.beforeAll(async () => { + modelWithAttachment = GeneratorUtil.randomArrayElement( + ModelsUtil.getLatestModelsWithAttachment(), + ); +}); + +dialOverlayTest( + '[Overlay] Allow attach files to conversation - Feature.InputFiles. p1\n' + + '[Overlay] Display configure settings for empty chat - Feature.EmptyChatSettings. p2\n' + + '[Overlay] Display change agent for empty chat - Feature.HideEmptyChatChangeAgent. p1', + async ({ + overlayHomePage, + overlayChat, + overlayDataInjector, + overlayBaseAssertion, + conversationData, + overlaySendMessage, + overlayHeader, + overlayChatHeader, + overlayConfirmationDialog, + overlayConversations, + overlayConversationSettingsModal, + setTestIds, + }) => { + setTestIds('EPMRTC-3773', 'EPMRTC-3765', 'EPMRTC-4868'); + + let attachmentConversation: Conversation; + + await dialTest.step( + 'Create conversation with attachment in the request', + async () => { + attachmentConversation = + conversationData.prepareConversationWithAttachmentsInRequest( + modelWithAttachment, + true, + ); + await overlayDataInjector.createConversations([attachmentConversation]); + }, + ); + + await dialTest.step( + 'Open conversation with attachment and verify clip icon is not available in the Send field', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableOnlyEmptyChatSettingsOverlayUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHeader.leftPanelToggle.click(); + await overlayConversations.selectConversation( + attachmentConversation.name, + ); + await overlayChat.addModelToWorkspace(); + await overlayBaseAssertion.assertElementState( + overlaySendMessage.attachmentMenuTrigger, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Verify gear icon is not available in the header', + async () => { + await overlayBaseAssertion.assertElementState( + overlayChatHeader.openConversationSettings, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Clear all conversation messages and verify "Configure settings" link is available', + async () => { + await overlayChatHeader.clearConversation.click(); + await overlayConfirmationDialog.confirm({ triggeredHttpMethod: 'PUT' }); + await overlayBaseAssertion.assertElementState( + overlayChat.configureSettingsButton, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Create a new conversation and verify "Configure settings", "Change agent" links are available', + async () => { + await overlayHeader.createNewConversation(); + await overlayBaseAssertion.assertElementState( + overlayChat.configureSettingsButton, + 'visible', + ); + + await overlayBaseAssertion.assertElementState( + overlayChat.changeAgentButton, + 'visible', + ); + await overlayChat.configureSettingsButton.click(); + await overlayBaseAssertion.assertElementState( + overlayConversationSettingsModal, + 'visible', + ); + await overlayConversationSettingsModal.cancelButton.click(); + }, + ); + }, +); + +dialOverlayTest( + '[Overlay] Allow attach files to conversation - Feature.InputFiles. p2', + async ({ + overlayHomePage, + overlayChat, + overlayDataInjector, + overlayBaseAssertion, + conversationData, + overlaySendMessage, + overlayHeader, + overlayConversations, + setTestIds, + }) => { + setTestIds('EPMRTC-3773'); + + let attachmentConversation: Conversation; + + await dialTest.step( + 'Create conversation with attachment in the request', + async () => { + attachmentConversation = + conversationData.prepareConversationWithAttachmentsInRequest( + modelWithAttachment, + true, + ); + await overlayDataInjector.createConversations([attachmentConversation]); + }, + ); + + await dialTest.step( + 'Open conversation with attachment and verify clip icon is available in the Send field', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableInputFilesUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHeader.leftPanelToggle.click(); + await overlayConversations.selectConversation( + attachmentConversation.name, + ); + await overlayChat.addModelToWorkspace(); + await overlayBaseAssertion.assertElementState( + overlaySendMessage.attachmentMenuTrigger, + 'visible', + ); + }, + ); + }, +); + +dialOverlayTest( + `[Overlay] Display change agent for empty chat - Feature.HideEmptyChatChangeAgent. p2`, + async ({ + overlayHomePage, + overlayChat, + overlayBaseAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-4868'); + + await dialTest.step( + 'Open sandbox and verify "Change agent" link is not displayed for a new conversation', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableHideEmptyChangeAgentUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayBaseAssertion.assertElementState( + overlayChat.changeAgentButton, + 'hidden', + ); + }, + ); + }, +); + +dialOverlayTest( + `[Overlay] When no any feature is enabled in the code.\n` + + '[Overlay] Display configure settings for empty chat - Feature.EmptyChatSettings. p1', + async ({ + overlayHomePage, + overlayChat, + overlayChatMessages, + overlayChatMessagesAssertion, + overlayBaseAssertion, + overlayAgentInfo, + overlaySendMessage, + setTestIds, + }) => { + setTestIds('EPMRTC-3780', 'EPMRTC-3765'); + + await dialTest.step( + 'Open sandbox and verify model information, send request field and "Change agent" link are available', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.disableAllFeaturesUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlaySendMessage, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo.agentName, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo.agentDescription, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChat.changeAgentButton, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChat.configureSettingsButton, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Send the request and verify Edit, Delete, Copy and Regenerate buttons are available for the response', + async () => { + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton('test'); + await overlayChatMessagesAssertion.assertMessageDeleteIconState( + 1, + 'visible', + ); + await overlayChatMessagesAssertion.assertMessageEditIconState( + 1, + 'visible', + ); + await overlayChatMessagesAssertion.assertElementState( + overlayChatMessages.messageCopyIcon(2), + 'visible', + ); + await overlayChatMessagesAssertion.assertElementState( + overlayChatMessages.messageRegenerateIcon(2), + 'visible', + ); + }, + ); + }, +); diff --git a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts new file mode 100644 index 0000000000..2ccab84ac4 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts @@ -0,0 +1,627 @@ +import { Conversation } from '@/chat/types/chat'; +import { Prompt } from '@/chat/types/prompt'; +import dialTest from '@/src/core/dialFixtures'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { + ExpectedConstants, + MenuOptions, + MockedChatApiResponseBodies, + Theme, +} from '@/src/testData'; +import { OverlaySandboxUrls } from '@/src/testData/overlay/overlaySandboxUrls'; +import { keys } from '@/src/ui/keyboard'; +import { GeneratorUtil } from '@/src/utils'; +import { Locator } from '@playwright/test'; + +dialOverlayTest( + '[Overlay] Defaults set in the code: theme.\n' + + '[Overlay] Display conversations panel - Feature.ConversationsSection.\n' + + '[Overlay] Display prompts panel - Feature.PromptsSection.\n' + + '[Overlay] Display Report an issue modal - Feature.ReportAnIssue.\n' + + '[Overlay] Display Request API Key modal - Feature.RequestApiKey.\n' + + '[Overlay] Display conversation sharing - ConversationsSharing.\n' + + '[Overlay] Display prompts sharing - PromptsSharing.\n' + + '[Overlay] Display attachments manager in conversation panel - Feature.AttachmentsManager.\n' + + '[Overlay] Display conversation publishing - Feature.ConversationsPublishing.\n' + + '[Overlay] Display prompts publishing - Feature.PromptsPublishing.\n' + + '[Overlay] Enable setting for custom logo feature - Feature.CustomLogo.\n' + + '[Overlay] Display DIAL footer - Feature.Footer', + async ({ + overlayHomePage, + overlayAgentInfo, + overlayChat, + overlayHeader, + overlaySendMessage, + overlayAccountSettings, + overlayBaseAssertion, + overlayAssertion, + setTestIds, + }) => { + setTestIds( + 'EPMRTC-3782', + 'EPMRTC-3759', + 'EPMRTC-3760', + 'EPMRTC-3769', + 'EPMRTC-3768', + 'EPMRTC-3771', + 'EPMRTC-3772', + 'EPMRTC-3775', + 'EPMRTC-3776', + 'EPMRTC-3777', + 'EPMRTC-3778', + 'EPMRTC-3767', + ); + + await dialTest.step('Verify header is not visible', async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.disabledHeaderSandboxUrl, + ); + await overlayBaseAssertion.assertElementState(overlayHeader, 'hidden'); + }); + + await dialTest.step( + 'Verify new conversation with possibility to change agent, configure and send request are available', + async () => { + await overlayBaseAssertion.assertElementState( + overlayAgentInfo, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChat.changeAgentButton, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChat.configureSettingsButton, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChat.getSendMessage(), + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlaySendMessage, + 'visible', + ); + }, + ); + + await dialTest.step('Verify Light theme is set', async () => { + await overlayAssertion.assertOverlayTheme(overlayHomePage, Theme.light); + }); + + await dialTest.step( + 'Verify side bar toggles and account settings are not available', + async () => { + await overlayBaseAssertion.assertElementState( + overlayHeader.leftPanelToggle, + 'hidden', + ); + await overlayBaseAssertion.assertElementState( + overlayHeader.rightPanelToggle, + 'hidden', + ); + await overlayBaseAssertion.assertElementState( + overlayAccountSettings, + 'hidden', + ); + }, + ); + }, +); + +dialOverlayTest( + '[Overlay] Display conversations panel - Feature.ConversationsSection.\n' + + '[Overlay] Display prompts panel - Feature.PromptsSection.\n' + + '[Overlay] Display conversation sharing - ConversationsSharing.\n' + + '[Overlay] Display prompts sharing - PromptsSharing.\n' + + '[Overlay] Display attachments manager in conversation panel - Feature.AttachmentsManager.\n' + + '[Overlay] Display conversation publishing - Feature.ConversationsPublishing.\n' + + '[Overlay] Display prompts publishing - Feature.PromptsPublishing.\n' + + '[Overlay] Enable setting for custom logo feature - Feature.CustomLogo.\n' + + '[Overlay] Hide "New conversation" button in DIAL header - Feature.HideNewConversation.\n' + + '[Overlay] Message template feature toggle - Feature.MessageTemplates.\n' + + '[Overlay] Display DIAL footer - Feature.Footer', + async ({ + page, + overlayHomePage, + overlayHeader, + overlayChatBar, + overlayConversations, + overlayConversationDropdownMenu, + overlayPublishingRequestModal, + overlayPrompts, + overlayPromptDropdownMenu, + overlaySettingsModal, + overlayAgentInfo, + overlayShareModal, + overlayAccountSettings, + overlayProfilePanel, + overlayRequestApiKeyModal, + overlayReportAnIssueModal, + overlayAttachFilesModal, + overlayChatMessages, + overlayBaseAssertion, + overlayConversationAssertion, + overlayPromptAssertion, + conversationData, + promptData, + overlayDataInjector, + setTestIds, + }) => { + setTestIds( + 'EPMRTC-3759', + 'EPMRTC-3760', + 'EPMRTC-3771', + 'EPMRTC-3772', + 'EPMRTC-3775', + 'EPMRTC-3776', + 'EPMRTC-3777', + 'EPMRTC-3778', + 'EPMRTC-3779', + 'EPMRTC-4438', + 'EPMRTC-3767', + ); + let conversation: Conversation; + let prompt: Prompt; + let conversationEntity: Locator; + let promptEntity: Locator; + + await dialTest.step('Create simple conversation and prompt', async () => { + conversation = conversationData.prepareDefaultConversation(); + prompt = promptData.preparePrompt('test'); + await overlayDataInjector.createConversations([conversation]); + await overlayDataInjector.createPrompts([prompt]); + }); + + await dialTest.step('Verify header is visible', async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledHeaderSandboxUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayBaseAssertion.assertElementState(overlayHeader, 'visible'); + }); + + await dialTest.step('Verify side bar toggles are available', async () => { + await overlayBaseAssertion.assertElementState( + overlayHeader.leftPanelToggle, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayHeader.rightPanelToggle, + 'visible', + ); + }); + + await dialTest.step( + 'Verify "New Conversation button" is not available', + async () => { + await overlayBaseAssertion.assertElementState( + overlayHeader.newEntityButton, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Open left side panel and verify created conversation is visible', + async () => { + await overlayHeader.leftPanelToggle.click(); + await overlayConversationAssertion.assertEntityState( + { name: conversation.name }, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Verify "Manage attachments" modal is opened on click "Clip" in the bottom menu', + async () => { + await overlayBaseAssertion.assertElementState( + overlayChatBar.attachments, + 'visible', + ); + await overlayChatBar.openManageAttachmentsModal(); + await overlayBaseAssertion.assertElementState( + overlayAttachFilesModal, + 'visible', + ); + await overlayAttachFilesModal.closeButton.click(); + }, + ); + + await dialTest.step( + 'Verify Share option is available for conversation', + async () => { + conversationEntity = overlayConversations.getTreeEntity( + conversation.name, + ); + await conversationEntity.hover(); + await overlayConversations.entityDotsMenu(conversation.name).click(); + await overlayConversationDropdownMenu.selectShareMenuOption(); + await overlayBaseAssertion.assertElementState( + overlayShareModal, + 'visible', + ); + await overlayShareModal.closeButton.click(); + }, + ); + + await dialTest.step( + 'Verify Publish option is available for conversation', + async () => { + await conversationEntity.hover(); + await overlayConversations.entityDotsMenu(conversation.name).click(); + await overlayConversationDropdownMenu.selectMenuOption( + MenuOptions.publish, + ); + await overlayBaseAssertion.assertElementState( + overlayPublishingRequestModal, + 'visible', + ); + await overlayPublishingRequestModal.cancelButton.click(); + }, + ); + + await dialTest.step( + 'Verify new conversation is not create if to click on app logo', + async () => { + await overlayConversations.selectConversation( + conversation.name, + { exactMatch: true }, + { isHttpMethodTriggered: false }, + ); + await overlayHeader.logo.click(); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Verify "Set message template" button is available for the request', + async () => { + const request = await overlayChatMessages.hoverOverMessage(1); + await overlayBaseAssertion.assertElementState( + overlayChatMessages.setMessageTemplateIcon(request), + 'visible', + ); + }, + ); + + await dialTest.step( + 'Open right side panel and verify created prompt is visible', + async () => { + await overlayHeader.rightPanelToggle.click(); + await overlayPromptAssertion.assertEntityState( + { name: prompt.name }, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Verify Share option is available for prompt', + async () => { + promptEntity = overlayPrompts.getTreeEntity(prompt.name); + await promptEntity.hover(); + await overlayPrompts.entityDotsMenu(prompt.name).click(); + await overlayPromptDropdownMenu.selectShareMenuOption(); + await overlayBaseAssertion.assertElementState( + overlayShareModal, + 'visible', + ); + await overlayShareModal.closeButton.click(); + }, + ); + + await dialTest.step( + 'Verify Publish option is available for prompt', + async () => { + await promptEntity.hover(); + await overlayPrompts.entityDotsMenu(prompt.name).click(); + await overlayPromptDropdownMenu.selectMenuOption(MenuOptions.publish); + await overlayBaseAssertion.assertElementState( + overlayPublishingRequestModal, + 'visible', + ); + await overlayPublishingRequestModal.cancelButton.click(); + }, + ); + + await dialTest.step( + 'Verify custom logo can be set, footer is displayed', + async () => { + await overlayAccountSettings.click(); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.getFooter(), + 'visible', + ); + await overlayProfilePanel.settings.click(); + await overlayBaseAssertion.assertElementState( + overlaySettingsModal.customLogo, + 'visible', + ); + await overlaySettingsModal.cancelButton.click(); + }, + ); + + await dialTest.step('Verify API key can be requested', async () => { + await overlayProfilePanel + .getFooter() + .openFooterLink(ExpectedConstants.requestApiKeyLink); + //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 + const overlayRequestApiKeyModalFirst = + overlayRequestApiKeyModal.getNthElement(0); + await overlayBaseAssertion.assertElementState( + overlayRequestApiKeyModalFirst, + 'visible', + ); + for (let i = 1; i <= 2; i++) { + await page.keyboard.press(keys.escape); + } + }); + + await dialTest.step('Verify a new issue can be reported', async () => { + await overlayProfilePanel + .getFooter() + .openFooterLink(ExpectedConstants.reportAnIssueLink); + //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 + const overlayRequestApiKeyModalFirst = + overlayReportAnIssueModal.getNthElement(0); + await overlayBaseAssertion.assertElementState( + overlayRequestApiKeyModalFirst, + 'visible', + ); + }); + }, +); + +dialOverlayTest( + '[Overlay] Display DIAL header - Feature.Header.\n' + + '[Overlay] Display DIAL footer - Feature.Footer.\n' + + '[Overlay] Enable setting for custom logo feature - Feature.CustomLogo', + async ({ + overlayHomePage, + overlayAgentInfo, + overlayChat, + overlayHeader, + overlayAccountSettings, + overlayBaseAssertion, + overlayProfilePanel, + overlayConfirmationDialog, + overlaySettingsModal, + setTestIds, + }) => { + setTestIds('EPMRTC-3766', 'EPMRTC-3767', 'EPMRTC-3778'); + + await dialTest.step( + 'Verify "New Conversation", logo and profile setting buttons are available in the header', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledOnlyHeaderSandboxUrl, + ); + await overlayBaseAssertion.assertElementState( + overlayHeader.newEntityButton, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayHeader.logo, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayAccountSettings, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Verify new conversation is create on click "Plus" button', + async () => { + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + await overlayHeader.createNewConversation(); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Verify new conversation is create on click logo button', + async () => { + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + await overlayHeader.logo.click(); + await overlayBaseAssertion.assertElementState( + overlayAgentInfo, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Open profile settings and verify user info, "Settings", "Logout" options are displayed', + async () => { + await overlayAccountSettings.click(); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.settings, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.logout, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.username, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.avatar, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayAccountSettings.avatarIcon, + 'hidden', + ); + await overlayBaseAssertion.assertElementState( + overlayAccountSettings.closeButton, + 'visible', + ); + }, + ); + + await dialTest.step('Verify footer is not visible', async () => { + await overlayBaseAssertion.assertElementState( + overlayProfilePanel.getFooter(), + 'hidden', + ); + }); + + await dialTest.step( + 'Click on "Log out" and verify confirmation dialog appears', + async () => { + await overlayProfilePanel.logout.click(); + await overlayBaseAssertion.assertElementState( + overlayConfirmationDialog, + 'visible', + ); + await overlayConfirmationDialog.cancelDialog(); + }, + ); + + await dialTest.step( + 'Open profile settings and verify "Custom logo" cannot be set', + async () => { + await overlayProfilePanel.settings.click(); + await overlayBaseAssertion.assertElementState( + overlaySettingsModal.customLogo, + 'hidden', + ); + await overlaySettingsModal.cancelButton.click(); + }, + ); + + await dialTest.step( + 'Click on "X" and verify profile panel is closed', + async () => { + await overlayAccountSettings.closeButton.click(); + await overlayBaseAssertion.assertElementState( + overlayProfilePanel, + 'hidden', + ); + await overlayBaseAssertion.assertElementState( + overlayAccountSettings.avatarIcon, + 'visible', + ); + }, + ); + }, +); + +dialOverlayTest( + '[Overlay] Display Request API Key modal - Feature.RequestApiKey.\n' + + '[Overlay] Display Report an issue modal - Feature.ReportAnIssue', + async ({ + overlayHomePage, + page, + overlayRequestApiKeyModal, + overlayAccountSettings, + overlayBaseAssertion, + overlayProfilePanel, + overlayReportAnIssueModal, + setTestIds, + }) => { + setTestIds('EPMRTC-3768', 'EPMRTC-3769'); + + await dialTest.step( + 'Open profile panel and verify API key cannot be requested', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledOnlyHeaderFooterSandboxUrl, + ); + await overlayAccountSettings.click(); + await overlayProfilePanel + .getFooter() + .openFooterLink(ExpectedConstants.requestApiKeyLink); + await overlayBaseAssertion.assertElementState( + overlayRequestApiKeyModal, + 'hidden', + ); + //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 + for (let i = 1; i <= 2; i++) { + await page.keyboard.press(keys.escape); + } + }, + ); + + await dialTest.step('Verify new issue0 cannot be reported', async () => { + await overlayProfilePanel + .getFooter() + .openFooterLink(ExpectedConstants.reportAnIssueLink); + //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 + await overlayBaseAssertion.assertElementState( + overlayReportAnIssueModal, + 'hidden', + ); + }); + }, +); + +dialOverlayTest( + '[Overlay] Display Request API Key modal - Feature.RequestApiKey.\n' + + '[Overlay] Display Report an issue modal - Feature.ReportAnIssue.\n' + + '[Overlay] Display attachments manager in conversation panel - Feature.AttachmentsManager', + async ({ + overlayHomePage, + overlayHeader, + overlayBaseAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-3768', 'EPMRTC-3769', 'EPMRTC-3775'); + + await dialTest.step('Verify header is not available', async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledOnlyFooterLinksAttachmentsUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayBaseAssertion.assertElementState(overlayHeader, 'hidden'); + }); + }, +); + +dialOverlayTest( + '[Overlay] Display attachments manager in conversation panel - Feature.AttachmentsManager', + async ({ + overlayHomePage, + overlayHeader, + overlayBaseAssertion, + overlayChatBar, + setTestIds, + }) => { + setTestIds('EPMRTC-3775'); + + await dialTest.step( + 'Open conversations side panel and verify "Clip" icon is not visible at the bottom panel', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledOnlyHeaderConversationsSectionSandboxUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayChatBar.attachments, + 'hidden', + ); + }, + ); + }, +); diff --git a/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts b/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts new file mode 100644 index 0000000000..f55ca88633 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts @@ -0,0 +1,155 @@ +import { Conversation } from '@/chat/types/chat'; +import dialTest from '@/src/core/dialFixtures'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { OverlaySandboxUrls } from '@/src/testData'; + +dialOverlayTest( + '[Overlay] DIAL Marketplace feature is enabled - Feature.Marketplace.\n' + + '[Overlay] Add app button is not available in Overlay (Mobile view)', + async ({ + overlayHomePage, + overlayChat, + overlayChatHeader, + overlayTalkToAgentDialog, + overlayHeader, + overlayConversations, + overlayMarketplacePage, + conversationData, + overlayBaseAssertion, + overlayTalkToAgentDialogAssertion, + overlayDataInjector, + overlayChatBar, + setTestIds, + }) => { + setTestIds('EPMRTC-4447', 'EPMRTC-4712'); + + let conversation: Conversation; + + await dialTest.step('Create simple conversation', async () => { + conversation = conversationData.prepareDefaultConversation(); + await overlayDataInjector.createConversations([conversation]); + }); + + await dialTest.step( + 'Verify "Dial Marketplace" button is available on the right side panel', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableMarketplaceUrl, + ); + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayChatBar.dialMarketplaceLink, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Click on "Change agent" and verify there is "Search" field available', + async () => { + await overlayHeader.leftPanelToggle.click(); + await overlayChat.changeAgentButton.click(); + await overlayTalkToAgentDialogAssertion.assertElementState( + overlayTalkToAgentDialog.searchAgentInput, + 'visible', + ); + await overlayTalkToAgentDialog.cancelButton.click(); + }, + ); + + await dialTest.step( + 'Select created conversation, click on model icon in the header and verify there is "Search" field available', + async () => { + await overlayHeader.leftPanelToggle.click(); + await overlayConversations.selectConversation(conversation.name); + await overlayChatHeader.chatModelIcon.click(); + await overlayTalkToAgentDialogAssertion.assertElementState( + overlayTalkToAgentDialog.searchAgentInput, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Click on "Go to my workspace" link and verify workspace page is opened, "Add app" button is not visible', + async () => { + await overlayTalkToAgentDialog.goToMyWorkspace(); + const marketplace = overlayMarketplacePage + .getMarketplaceContainer() + .getMarketplace(); + await overlayBaseAssertion.assertElementState(marketplace, 'visible'); + await overlayBaseAssertion.assertElementState( + marketplace.getMarketplaceHeader().addAppButton, + 'hidden', + ); + }, + ); + }, +); + +dialOverlayTest( + '[Overlay] DIAL Marketplace feature is disabled - Feature.Marketplace', + async ({ + overlayHomePage, + overlayChat, + overlayChatHeader, + overlayTalkToAgentDialog, + overlayHeader, + overlayConversations, + conversationData, + overlayBaseAssertion, + overlayTalkToAgentDialogAssertion, + overlayDataInjector, + overlayChatBar, + setTestIds, + }) => { + setTestIds('EPMRTC-4867'); + + let conversation: Conversation; + + await dialTest.step('Create simple conversation', async () => { + conversation = conversationData.prepareDefaultConversation(); + await overlayDataInjector.createConversations([conversation]); + }); + + await dialTest.step( + 'Verify "Dial Marketplace" button is not available on the right side panel', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.disableMarketplaceUrl, + ); + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayChatBar.dialMarketplaceLink, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Click on "Change agent" and verify there is no "Go to My workspace" button', + async () => { + await overlayHeader.leftPanelToggle.click(); + await overlayChat.changeAgentButton.click(); + await overlayTalkToAgentDialogAssertion.assertElementState( + overlayTalkToAgentDialog.goToMyWorkspaceButton, + 'hidden', + ); + await overlayTalkToAgentDialog.cancelButton.click(); + }, + ); + + await dialTest.step( + 'Select created conversation, click on model icon in the header and verify there is "Search" field available', + async () => { + await overlayHeader.leftPanelToggle.click(); + await overlayConversations.selectConversation(conversation.name); + await overlayChatHeader.chatModelIcon.click(); + await overlayTalkToAgentDialogAssertion.assertElementState( + overlayTalkToAgentDialog.goToMyWorkspaceButton, + 'hidden', + ); + }, + ); + }, +); diff --git a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts index 6f080e03d1..99a5ff3f3f 100644 --- a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts @@ -1,6 +1,12 @@ import dialTest from '@/src/core/dialFixtures'; import dialOverlayTest from '@/src/core/dialOverlayFixtures'; -import { ExpectedMessages, MockedChatApiResponseBodies } from '@/src/testData'; +import { + ExpectedConstants, + ExpectedMessages, + MockedChatApiResponseBodies, + Rate, + Theme, +} from '@/src/testData'; import { OverlaySandboxUrls } from '@/src/testData/overlay/overlaySandboxUrls'; import { GeneratorUtil, ModelsUtil } from '@/src/utils'; import { expect } from '@playwright/test'; @@ -9,12 +15,21 @@ const expectedModelId = 'gpt-4'; dialOverlayTest( `[Overlay] Defaults set in the code: modelID is used for new conversation.\n` + - '[Overlay] Defaults set in the code: modelID is NOT used for old conversation. Used model is used in the chat with history', + '[Overlay] Defaults set in the code: modelID is NOT used for old conversation. Used model is used in the chat with history.\n' + + '[Overlay] Display likes in model response - Feature.Likes.\n' + + '[Overlay] Message template feature toggle - Feature.MessageTemplates.\n' + + '[Overlay] Defaults set in the code: theme' + + '[Overlay] Display clear conversations button in chat header - Feature.TopClearConversation.\n' + + '[Overlay] Display conversation info in chat header - Feature.TopChatInfo.\n' + + '[Overlay] Display change model settings button in chat header - Feature.TopChatModelSettings.\n' + + '[Overlay] Display chat menu in chat header - Feature.HideTopContextMenu', async ({ overlayHomePage, overlayAgentInfo, overlayChat, + overlayChatMessages, overlayChatHeader, + overlayModelInfoTooltip, overlayTalkToAgentDialog, overlayHeader, overlayConversations, @@ -23,10 +38,21 @@ dialOverlayTest( overlayBaseAssertion, overlayApiAssertion, overlayAgentInfoAssertion, - talkToAgentDialogAssertion, + overlayTalkToAgentDialogAssertion, + overlayAssertion, setTestIds, }) => { - setTestIds('EPMRTC-3781', 'EPMRTC-4693'); + setTestIds( + 'EPMRTC-3781', + 'EPMRTC-4693', + 'EPMRTC-3770', + 'EPMRTC-4438', + 'EPMRTC-3782', + 'EPMRTC-3762', + 'EPMRTC-3763', + 'EPMRTC-3764', + 'EPMRTC-4873', + ); const randomAgentRequest = 'test'; const randomModelId = GeneratorUtil.randomArrayElement( ModelsUtil.getRecentModelIds().filter((m) => m !== expectedModelId), @@ -77,6 +103,60 @@ dialOverlayTest( }, ); + await dialTest.step( + 'Verify dots menu, "Clear conversation messages", model name, model and gear icons are available in the chat header', + async () => { + await overlayBaseAssertion.assertElementState( + overlayChatHeader.dotsMenu, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatTitle, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatModelIcon, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.openConversationSettings, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.clearConversation, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Hover over model icon and verify tooltip content', + async () => { + await overlayChatHeader.chatModelIcon.hoverOver(); + await overlayBaseAssertion.assertElementText( + overlayModelInfoTooltip.title, + ExpectedConstants.modelInfoTooltipChangeTitle, + ); + + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatTitle, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatModelIcon, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.openConversationSettings, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.clearConversation, + 'visible', + ); + }, + ); + await dialTest.step( 'Create new conversation and verify configured model is pre-set', async () => { @@ -92,7 +172,9 @@ dialOverlayTest( 'Open "Select an agent" modal and verify configured model is selected and is on top', async () => { await overlayChat.changeAgentButton.click(); - await talkToAgentDialogAssertion.assertAgentIsSelected(expectedModel); + await overlayTalkToAgentDialogAssertion.assertAgentIsSelected( + expectedModel, + ); const agents = await overlayTalkToAgentDialog .getAgents() .getAgentNames(); @@ -112,16 +194,43 @@ dialOverlayTest( }, ); + await dialTest.step( + 'Verify like/dislike button is available for the response', + async () => { + for (const rate of Object.values(Rate)) { + await overlayBaseAssertion.assertElementActionabilityState( + overlayChatMessages.getChatMessageRate(2, rate), + 'enabled', + ); + } + }, + ); + + await dialTest.step( + 'Verify "Set message template" button is not available for the request', + async () => { + const request = await overlayChatMessages.hoverOverMessage(1); + await overlayBaseAssertion.assertElementState( + overlayChatMessages.setMessageTemplateIcon(request), + 'hidden', + ); + }, + ); + await dialTest.step( 'Open "Select an agent" modal for the previous conversation and verify random model is selected', async () => { await overlayHeader.leftPanelToggle.click(); await overlayConversations.selectConversation(randomAgentRequest); await overlayChatHeader.chatModelIcon.click(); - await talkToAgentDialogAssertion.assertAgentIsSelected( + await overlayTalkToAgentDialogAssertion.assertAgentIsSelected( randomModel.name, ); }, ); + + await dialTest.step('Verify Dark theme is set', async () => { + await overlayAssertion.assertOverlayTheme(overlayHomePage, Theme.dark); + }); }, ); diff --git a/apps/chat-e2e/src/tests/overlay/overlayAuth.ts b/apps/chat-e2e/src/tests/overlay/overlayAuth.ts index 9173097194..b876767b70 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayAuth.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayAuth.ts @@ -10,6 +10,10 @@ const overlayUsernames = process.env .E2E_OVERLAY_USERNAME!.split(',') .slice(0, +config.workers!); +if (process.env.E2E_ADMIN) { + overlayUsernames.push(process.env.E2E_ADMIN); +} + for (let i = 0; i < overlayUsernames.length; i++) { // eslint-disable-next-line playwright/expect-expect test(`[Overlay] Login: ${overlayUsernames[i]}`, async ({ diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts new file mode 100644 index 0000000000..da3a690e03 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -0,0 +1,155 @@ +import { Conversation } from '@/chat/types/chat'; +import { Publication } from '@/chat/types/publication'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { + API, + Attachment, + ExpectedConstants, + ExpectedMessages, + OverlaySandboxUrls, +} from '@/src/testData'; +import { keys } from '@/src/ui/keyboard'; +import { GeneratorUtil, ModelsUtil } from '@/src/utils'; +import { PublishActions } from '@epam/ai-dial-shared'; +import { expect } from '@playwright/test'; + +const publicationsToUnpublish: Publication[] = []; +const conversationName = 'overlayConversationName'; + +dialOverlayTest( + '[Overlay] Exact conversation is set in Overlay. Playback chat with Plotly graph', + async ({ + overlayHomePage, + page, + overlayPlaybackControl, + overlayChatMessages, + overlayHeader, + conversationData, + overlayBaseAssertion, + overlayOrganizationConversations, + overlayDataInjector, + setTestIds, + overlayFileApiHelper, + overlayPublicationApiHelper, + adminPublicationApiHelper, + publishRequestBuilder, + }) => { + setTestIds('EPMRTC-4835'); + let plotlyConversation: Conversation; + let playbackConversation: Conversation; + let plotlyImageUrl: string; + + await dialOverlayTest.step( + 'Prepare playback conversation with plotly graph in the response', + async () => { + const defaultModel = ModelsUtil.getDefaultModel()!; + plotlyImageUrl = await overlayFileApiHelper.putFile( + Attachment.plotlyName, + API.modelFilePath(defaultModel.id), + ); + plotlyConversation = + conversationData.prepareConversationWithAttachmentInResponse( + plotlyImageUrl, + defaultModel, + undefined, + conversationName, + ); + playbackConversation = + conversationData.prepareDefaultPlaybackConversation( + plotlyConversation, + ); + await overlayDataInjector.createConversations([ + plotlyConversation, + playbackConversation, + ]); + }, + ); + + await dialOverlayTest.step('Publish playback conversation', async () => { + const assistantMessage = plotlyConversation.messages.find( + (m) => m.role === 'assistant', + ); + let attachment; + if (assistantMessage !== undefined) { + attachment = assistantMessage.custom_content!.attachments![0]; + } + const publishRequest = publishRequestBuilder + .withName(GeneratorUtil.randomPublicationRequestName()) + .withConversationResource(playbackConversation, PublishActions.ADD) + .withFileResource(attachment!) + .build(); + const publication = + await overlayPublicationApiHelper.createPublishRequest(publishRequest); + await adminPublicationApiHelper.approveRequest(publication); + publicationsToUnpublish.push(publication); + }); + + await dialOverlayTest.step( + 'Open overlay sandbox and verify playback conversation is preselected', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.overlayConversationIdSetUrl, + ); + await overlayBaseAssertion.assertElementState( + overlayPlaybackControl, + 'visible', + ); + }, + ); + + await dialOverlayTest.step( + 'Play the conversation forward and verify the graph is displayed', + async () => { + await overlayPlaybackControl.playbackNextButton.click(); + await page.keyboard.press(keys.arrowRight); + await overlayChatMessages + .getChatMessageAttachment(2, Attachment.plotlyName) + .waitForState(); + const expandAttachmentResponse = + await overlayChatMessages.expandChatMessageAttachment( + 2, + Attachment.plotlyName, + ); + expect + .soft( + expandAttachmentResponse?.status(), + ExpectedMessages.attachmentIsExpanded, + ) + .toBe(200); + await overlayBaseAssertion.assertElementState( + overlayChatMessages.getMessagePlotlyAttachment(2), + 'visible', + ); + }, + ); + + await dialOverlayTest.step( + 'Create a new conversation, refresh the page and verify playback conversation is preselected', + async () => { + await overlayHeader.createNewConversation(); + await overlayHomePage.reloadPage(); + await overlayBaseAssertion.assertElementState( + overlayPlaybackControl, + 'visible', + ); + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayOrganizationConversations.selectedConversation( + ExpectedConstants.playbackConversation.concat(conversationName), + ), + 'visible', + ); + }, + ); + }, +); + +dialOverlayTest.afterAll( + async ({ overlayPublicationApiHelper, adminPublicationApiHelper }) => { + for (const publication of publicationsToUnpublish) { + const unpublishResponse = + await overlayPublicationApiHelper.createUnpublishRequest(publication); + await adminPublicationApiHelper.approveRequest(unpublishResponse); + } + }, +); diff --git a/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts new file mode 100644 index 0000000000..2afe1b9277 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts @@ -0,0 +1,135 @@ +import dialTest from '@/src/core/dialFixtures'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { + ExpectedConstants, + MockedChatApiResponseBodies, + OverlaySandboxUrls, +} from '@/src/testData'; +import { GeneratorUtil } from '@/src/utils'; + +dialOverlayTest( + '[Overlay] Display clear conversations button in chat header - Feature.TopClearConversation.\n' + + '[Overlay] Display conversation info in chat header - Feature.TopChatInfo.\n' + + '[Overlay] Display change model settings button in chat header - Feature.TopChatModelSettings', + async ({ + overlayHomePage, + overlayChat, + overlayChatHeader, + overlayBaseAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-3762', 'EPMRTC-3763', 'EPMRTC-3764'); + + await dialTest.step( + 'Send the request and verify chat header is not visible', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.disableTopChatInfoUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + await overlayBaseAssertion.assertElementState( + overlayChatHeader, + 'hidden', + ); + }, + ); + }, +); + +dialOverlayTest( + `[Overlay] Don't allow to click on model icon - Feature.DisallowChangeAgent`, + async ({ + overlayHomePage, + overlayChat, + overlayChatHeader, + overlayModelInfoTooltip, + overlayTalkToAgentDialog, + overlayBaseAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-4872'); + + await dialTest.step( + 'Send the request and verify chat name and icon are displayed in the header', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableDisallowChangeAgentUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatTitle, + 'visible', + ); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.chatModelIcon, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Click on model icon and verify "Select an agent" modal is not opened', + async () => { + // eslint-disable-next-line playwright/no-force-option + await overlayChatHeader.chatModelIcon.click({ force: true }); + await overlayBaseAssertion.assertElementState( + overlayTalkToAgentDialog, + 'hidden', + ); + }, + ); + + await dialTest.step( + 'Hover over model icon and verify tooltip content', + async () => { + await overlayChatHeader.chatModelIcon.hoverOver(); + await overlayBaseAssertion.assertElementText( + overlayModelInfoTooltip.title, + ExpectedConstants.modelInfoTooltipTitle, + ); + }, + ); + }, +); + +dialOverlayTest( + `[Overlay] Display chat menu in chat header - Feature.HideTopContextMenu`, + async ({ + overlayHomePage, + overlayChat, + overlayChatHeader, + overlayBaseAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-4873'); + + await dialTest.step( + 'Send the request and verify dots menu is not displayed in the header', + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enableHideTopContextMenuUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + await overlayBaseAssertion.assertElementState( + overlayChatHeader.dotsMenu, + 'hidden', + ); + }, + ); + }, +); diff --git a/apps/chat-e2e/src/ui/pages/overlay/overlayHomePage.ts b/apps/chat-e2e/src/ui/pages/overlay/overlayHomePage.ts index 0f95530e1b..e8b9cecda7 100644 --- a/apps/chat-e2e/src/ui/pages/overlay/overlayHomePage.ts +++ b/apps/chat-e2e/src/ui/pages/overlay/overlayHomePage.ts @@ -1,3 +1,4 @@ +import { loadingTimeout } from '@/src/ui/pages'; import { OverlayBasePage } from '@/src/ui/pages/overlay/overlayBasePage'; import { AppContainer } from '@/src/ui/webElements'; import { Page } from '@playwright/test'; @@ -6,4 +7,16 @@ export class OverlayHomePage extends OverlayBasePage { constructor(page: Page) { super(page, new AppContainer(page)); } + + public async waitForPageLoaded() { + const overlayAppContainer = this.getOverlayContainer(); + await overlayAppContainer + .getChatLoader() + .waitForState({ state: 'hidden', timeout: loadingTimeout }); + const overlayChat = overlayAppContainer.getChat(); + await overlayChat.waitForState({ state: 'attached' }); + await overlayChat.waitForChatLoaded(); + await overlayChat.getSendMessage().waitForMessageInputLoaded(); + await overlayChat.getAgentInfo().waitForState({ state: 'attached' }); + } } diff --git a/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts b/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts index 22aed06b6f..20455856bd 100644 --- a/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts @@ -65,6 +65,7 @@ export const ModelTooltip = { modelTooltip: '[data-qa="chat-model-tooltip"]', modelInfo: '[data-qa="agent-info"]', versionInfo: '[data-qa="version-info"]', + title: '[data-qa="tooltip-title"]', }; export const SettingsTooltip = { @@ -132,6 +133,7 @@ export const SelectFolderModalSelectors = { export const AccountSettingsModalSelector = { settingsModal: '[data-qa="settings-modal"]', theme: '[data-qa="theme"]', + customLogo: '[data-qa="custom-logo"]', fullWidthChatToggle: '[data-qa="toggle-switch"]', save: '[data-qa="save"]', }; @@ -215,3 +217,11 @@ export const MessageTemplateModalSelectors = { showMoreButton: '[data-qa="show-more"]', showLessButton: '[data-qa="show-less"]', }; + +export const RequestApiKeyModalSelectors = { + requestApiKeyContainer: '[data-qa="request-api-key-dialog"]', +}; + +export const ReportAnIssueModalSelectors = { + reportAnIssueContainer: '[data-qa="report-issue-dialog"]', +}; diff --git a/apps/chat-e2e/src/ui/selectors/headerSelectors.ts b/apps/chat-e2e/src/ui/selectors/headerSelectors.ts index afe98b44d3..69153a5cc1 100644 --- a/apps/chat-e2e/src/ui/selectors/headerSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/headerSelectors.ts @@ -3,7 +3,14 @@ export const HeaderSelectors = { leftPanelToggle: '[data-qa="left-panel-toggle"]:visible', rightPanelToggle: '[data-qa="right-panel-toggle"]:visible', banner: '[data-qa="banner"]', - accountSettings: '[data-qa="account-settings"]', + accountSettings: '[data-qa="account-settings"]:visible', newEntity: '[data-qa="new-entity"]', backToChatButton: '[data-qa="back-to-chat"]', + profilePanel: '[data-qa="profile-panel"]', + settings: '#user-settings-menu-item', + overlayLogout: '#logout-menu-item', + logo: '[data-qa="logo"]', + username: '[data-qa="username"]:visible', + avatar: '[alt="User avatar"]', + closeButton: '#close-icon', }; diff --git a/apps/chat-e2e/src/ui/selectors/marketplaceSelectors.ts b/apps/chat-e2e/src/ui/selectors/marketplaceSelectors.ts index c9ca486673..6e772936d3 100644 --- a/apps/chat-e2e/src/ui/selectors/marketplaceSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/marketplaceSelectors.ts @@ -2,6 +2,7 @@ export const marketplaceContainer = '[data-qa="marketplace"]'; export const MarketplaceSelectors = { header: '[data-qa="marketplace-header"]', + addApp: '[data-qa="add-app"]', }; export const MarketplaceAgentSelectors = { diff --git a/apps/chat-e2e/src/ui/selectors/sideBarSelectors.ts b/apps/chat-e2e/src/ui/selectors/sideBarSelectors.ts index 1ca6855617..0045187f25 100644 --- a/apps/chat-e2e/src/ui/selectors/sideBarSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/sideBarSelectors.ts @@ -25,6 +25,7 @@ export const ChatBarSelectors = { deleteConversations: '[data-qa="delete-conversations"]', compare: '[data-qa="compare"]', attachments: '[data-qa="attachments"]', + dialMarketplaceLink: '[data-qa="link-to-marketplace"]', conversations: '[data-qa="conversations"]', selectedEntity: '[data-qa="selected"]', chatFolders: '[data-qa="chat-folders"]', diff --git a/apps/chat-e2e/src/ui/webElements/accountSettings.ts b/apps/chat-e2e/src/ui/webElements/accountSettings.ts index e0f2d2e3a0..26216001fd 100644 --- a/apps/chat-e2e/src/ui/webElements/accountSettings.ts +++ b/apps/chat-e2e/src/ui/webElements/accountSettings.ts @@ -2,11 +2,11 @@ import { Attributes } from '@/src/ui/domData'; import { HeaderSelectors } from '@/src/ui/selectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; import { DropdownMenu } from '@/src/ui/webElements/dropdownMenu'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class AccountSettings extends BaseElement { - constructor(page: Page) { - super(page, HeaderSelectors.accountSettings); + constructor(page: Page, parentLocator?: Locator) { + super(page, HeaderSelectors.accountSettings, parentLocator); } private dropdownMenu!: DropdownMenu; @@ -22,6 +22,12 @@ export class AccountSettings extends BaseElement { `.${Attributes.rotated180}`, ); + public avatarIcon = this.getChildElementBySelector(HeaderSelectors.avatar); + + public closeButton = this.getChildElementBySelector( + HeaderSelectors.closeButton, + ); + public async openAccountDropdownMenu() { await this.click(); await this.getDropdownMenu().waitForState(); diff --git a/apps/chat-e2e/src/ui/webElements/appContainer.ts b/apps/chat-e2e/src/ui/webElements/appContainer.ts index 81e286218a..d8eff291f1 100644 --- a/apps/chat-e2e/src/ui/webElements/appContainer.ts +++ b/apps/chat-e2e/src/ui/webElements/appContainer.ts @@ -39,7 +39,7 @@ export class AppContainer extends BaseLayoutContainer { getPromptBar(): PromptBar { if (!this.promptBar) { - this.promptBar = new PromptBar(this.page); + this.promptBar = new PromptBar(this.page, this.rootLocator); } return this.promptBar; } diff --git a/apps/chat-e2e/src/ui/webElements/attachFilesModal.ts b/apps/chat-e2e/src/ui/webElements/attachFilesModal.ts index d0472b2335..8243481fed 100644 --- a/apps/chat-e2e/src/ui/webElements/attachFilesModal.ts +++ b/apps/chat-e2e/src/ui/webElements/attachFilesModal.ts @@ -12,7 +12,7 @@ import { DropdownMenu } from '@/src/ui/webElements/dropdownMenu'; import { AttachFilesTree, Folders } from '@/src/ui/webElements/entityTree'; import { FilesModalHeader } from '@/src/ui/webElements/filesModalHeader'; import { Search } from '@/src/ui/webElements/search'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export enum FileModalSection { AllFiles = 'All files', @@ -20,8 +20,8 @@ export enum FileModalSection { Organization = 'Organization', } export class AttachFilesModal extends BaseElement { - constructor(page: Page) { - super(page, AttachFilesModalSelectors.modalContainer); + constructor(page: Page, parentLocator?: Locator) { + super(page, AttachFilesModalSelectors.modalContainer, parentLocator); } private fileDropdownMenu!: DropdownMenu; diff --git a/apps/chat-e2e/src/ui/webElements/chat.ts b/apps/chat-e2e/src/ui/webElements/chat.ts index c43df21d74..d94a7cd96d 100644 --- a/apps/chat-e2e/src/ui/webElements/chat.ts +++ b/apps/chat-e2e/src/ui/webElements/chat.ts @@ -83,7 +83,7 @@ export class Chat extends BaseElement { getPlaybackControl(): PlaybackControl { if (!this.playbackControl) { - this.playbackControl = new PlaybackControl(this.page); + this.playbackControl = new PlaybackControl(this.page, this.rootLocator); } return this.playbackControl; } @@ -224,7 +224,7 @@ export class Chat extends BaseElement { await this.chatSpinner.waitForState({ state: 'detached' }); } - private async addModelToWorkspace() { + public async addModelToWorkspace() { if (await this.addModelButton.isVisible()) { await this.addModelButton.click(); } diff --git a/apps/chat-e2e/src/ui/webElements/chatBar.ts b/apps/chat-e2e/src/ui/webElements/chatBar.ts index 201f00cbfb..456f20751a 100644 --- a/apps/chat-e2e/src/ui/webElements/chatBar.ts +++ b/apps/chat-e2e/src/ui/webElements/chatBar.ts @@ -41,6 +41,9 @@ export class ChatBar extends SideBar { public bottomDotsMenuIcon = this.bottomPanel.getChildElementBySelector( MenuSelectors.dotsMenu, ); + public dialMarketplaceLink = this.getChildElementBySelector( + ChatBarSelectors.dialMarketplaceLink, + ); getConversationsTree(): ConversationsTree { if (!this.conversationsTree) { diff --git a/apps/chat-e2e/src/ui/webElements/chatHeader.ts b/apps/chat-e2e/src/ui/webElements/chatHeader.ts index 6297402c09..b03c14d854 100644 --- a/apps/chat-e2e/src/ui/webElements/chatHeader.ts +++ b/apps/chat-e2e/src/ui/webElements/chatHeader.ts @@ -1,4 +1,8 @@ -import { ChatHeaderSelectors, SideBarSelectors } from '../selectors'; +import { + ChatHeaderSelectors, + MenuSelectors, + SideBarSelectors, +} from '../selectors'; import { BaseElement } from './baseElement'; import { API } from '@/src/testData'; @@ -40,6 +44,7 @@ export class ChatHeader extends BaseElement { ChatHeaderSelectors.leavePlayback, ); public version = this.getChildElementBySelector(ChatHeaderSelectors.version); + public dotsMenu = this.getChildElementBySelector(MenuSelectors.dotsMenu); public async isArrowIconVisible() { return this.chatAgent diff --git a/apps/chat-e2e/src/ui/webElements/chatMessages.ts b/apps/chat-e2e/src/ui/webElements/chatMessages.ts index 329d206229..9803c68a80 100644 --- a/apps/chat-e2e/src/ui/webElements/chatMessages.ts +++ b/apps/chat-e2e/src/ui/webElements/chatMessages.ts @@ -515,6 +515,11 @@ export class ChatMessages extends BaseElement { public messageDeleteIcon = (message: string | number) => this.getChatMessage(message).locator(IconSelectors.deleteIcon); + public messageCopyIcon = (message: string | number) => + this.getChatMessage(message).locator(IconSelectors.copyIcon); + public messageRegenerateIcon = (message: string | number) => + this.getChatMessage(message).locator(ChatSelectors.regenerate); + public async openEditMessageMode(message: string | number) { const editIcon = await this.waitForEditMessageIcon(message); await editIcon.click(); diff --git a/apps/chat-e2e/src/ui/webElements/confirmationDialog.ts b/apps/chat-e2e/src/ui/webElements/confirmationDialog.ts index fee4f8b2d1..56855dd9d4 100644 --- a/apps/chat-e2e/src/ui/webElements/confirmationDialog.ts +++ b/apps/chat-e2e/src/ui/webElements/confirmationDialog.ts @@ -2,23 +2,20 @@ import { isApiStorageType } from '@/src/hooks/global-setup'; import { ShareModalSelectors } from '@/src/ui/selectors'; import { ConfirmationDialogSelectors } from '@/src/ui/selectors/dialogSelectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class ConfirmationDialog extends BaseElement { - constructor(page: Page) { - super(page, ConfirmationDialogSelectors.container); + constructor(page: Page, parentLocator?: Locator) { + super(page, ConfirmationDialogSelectors.container, parentLocator); } - public cancelButton = new BaseElement( - this.page, + public cancelButton = this.getChildElementBySelector( ConfirmationDialogSelectors.cancelDialog, ); - public confirmButton = new BaseElement( - this.page, + public confirmButton = this.getChildElementBySelector( ConfirmationDialogSelectors.confirm, ); - public confirmMessage = new BaseElement( - this.page, + public confirmMessage = this.getChildElementBySelector( ConfirmationDialogSelectors.confirmationMessage, ); public entityName = this.getChildElementBySelector( diff --git a/apps/chat-e2e/src/ui/webElements/entityTree/sidebar/sideBarEntitiesTree.ts b/apps/chat-e2e/src/ui/webElements/entityTree/sidebar/sideBarEntitiesTree.ts index e91545a878..4db878ae26 100644 --- a/apps/chat-e2e/src/ui/webElements/entityTree/sidebar/sideBarEntitiesTree.ts +++ b/apps/chat-e2e/src/ui/webElements/entityTree/sidebar/sideBarEntitiesTree.ts @@ -67,6 +67,7 @@ export class SideBarEntitiesTree extends EntitiesTree { await this.entityDotsMenu(name, indexOrOptions).click({ force: true }); await this.getDropdownMenu().waitForState(); } + async openEditEntityNameMode(newName: string) { const input = this.getEditEntityInput(); await input.editValue(newName); diff --git a/apps/chat-e2e/src/ui/webElements/footer.ts b/apps/chat-e2e/src/ui/webElements/footer.ts index 88944fcf7c..e05ad8363e 100644 --- a/apps/chat-e2e/src/ui/webElements/footer.ts +++ b/apps/chat-e2e/src/ui/webElements/footer.ts @@ -10,7 +10,9 @@ export class Footer extends BaseElement { public async openFooterLink(linkText?: string) { linkText - ? await this.getElementLocatorByText(linkText).click() + ? await this.getChildElementBySelector(Tags.a) + .getElementLocatorByText(linkText) + .click() : await this.getChildElementBySelector(Tags.a).getNthElement(1).click(); } } diff --git a/apps/chat-e2e/src/ui/webElements/footer/reportAnIssueModal.ts b/apps/chat-e2e/src/ui/webElements/footer/reportAnIssueModal.ts new file mode 100644 index 0000000000..4fe2a1e34f --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/footer/reportAnIssueModal.ts @@ -0,0 +1,17 @@ +import { IconSelectors, ReportAnIssueModalSelectors } from '@/src/ui/selectors'; +import { BaseElement } from '@/src/ui/webElements'; +import { Locator, Page } from '@playwright/test'; + +export class ReportAnIssueModal extends BaseElement { + constructor(page: Page, parentLocator?: Locator) { + super( + page, + ReportAnIssueModalSelectors.reportAnIssueContainer, + parentLocator, + ); + } + + public cancelButton = this.getChildElementBySelector( + IconSelectors.cancelIcon, + ); +} diff --git a/apps/chat-e2e/src/ui/webElements/footer/requestApiKeyModal.ts b/apps/chat-e2e/src/ui/webElements/footer/requestApiKeyModal.ts new file mode 100644 index 0000000000..8fcb3ac2c3 --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/footer/requestApiKeyModal.ts @@ -0,0 +1,17 @@ +import { IconSelectors, RequestApiKeyModalSelectors } from '@/src/ui/selectors'; +import { BaseElement } from '@/src/ui/webElements'; +import { Locator, Page } from '@playwright/test'; + +export class RequestApiKeyModal extends BaseElement { + constructor(page: Page, parentLocator?: Locator) { + super( + page, + RequestApiKeyModalSelectors.requestApiKeyContainer, + parentLocator, + ); + } + + public cancelButton = this.getChildElementBySelector( + IconSelectors.cancelIcon, + ); +} diff --git a/apps/chat-e2e/src/ui/webElements/header.ts b/apps/chat-e2e/src/ui/webElements/header.ts index a7119a9edf..bb11006360 100644 --- a/apps/chat-e2e/src/ui/webElements/header.ts +++ b/apps/chat-e2e/src/ui/webElements/header.ts @@ -12,7 +12,7 @@ export class Header extends BaseElement { public getAccountSettings() { if (!this.accountSettings) { - this.accountSettings = new AccountSettings(this.page); + this.accountSettings = new AccountSettings(this.page, this.rootLocator); } return this.accountSettings; } @@ -32,6 +32,8 @@ export class Header extends BaseElement { HeaderSelectors.backToChatButton, ); + public logo = this.getChildElementBySelector(HeaderSelectors.logo); + public async createNewConversation() { await this.newEntityButton.click(); } diff --git a/apps/chat-e2e/src/ui/webElements/marketplace/marketplaceHeader.ts b/apps/chat-e2e/src/ui/webElements/marketplace/marketplaceHeader.ts index 816085e968..15d4bf85c7 100644 --- a/apps/chat-e2e/src/ui/webElements/marketplace/marketplaceHeader.ts +++ b/apps/chat-e2e/src/ui/webElements/marketplace/marketplaceHeader.ts @@ -13,4 +13,7 @@ export class MarketplaceHeader extends BaseElement { public searchInput = this.getChildElementBySelector( MarketplaceSideBarSelectors.searchInput, ); + public addAppButton = this.getChildElementBySelector( + MarketplaceSelectors.addApp, + ); } diff --git a/apps/chat-e2e/src/ui/webElements/menu.ts b/apps/chat-e2e/src/ui/webElements/menu.ts index 5024fb9d2b..e2249d399c 100644 --- a/apps/chat-e2e/src/ui/webElements/menu.ts +++ b/apps/chat-e2e/src/ui/webElements/menu.ts @@ -4,8 +4,8 @@ import { Locator, Page } from '@playwright/test'; import { Response } from 'playwright-core'; export abstract class Menu extends BaseElement { - constructor(page: Page) { - super(page, MenuSelectors.dropdownMenu); + constructor(page: Page, parentLocator?: Locator) { + super(page, MenuSelectors.dropdownMenu, parentLocator); } abstract menuOptions(): BaseElement; diff --git a/apps/chat-e2e/src/ui/webElements/modelInfoTooltip.ts b/apps/chat-e2e/src/ui/webElements/modelInfoTooltip.ts index 9e8d0ec7fd..af80ab4137 100644 --- a/apps/chat-e2e/src/ui/webElements/modelInfoTooltip.ts +++ b/apps/chat-e2e/src/ui/webElements/modelInfoTooltip.ts @@ -1,12 +1,13 @@ import { ModelTooltip } from '@/src/ui/selectors/dialogSelectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class ModelInfoTooltip extends BaseElement { - constructor(page: Page) { - super(page, ModelTooltip.modelTooltip); + constructor(page: Page, parentLocator?: Locator) { + super(page, ModelTooltip.modelTooltip, parentLocator); } + public title = this.getChildElementBySelector(ModelTooltip.title); public modelInfo = this.getChildElementBySelector(ModelTooltip.modelInfo); public versionInfo = this.getChildElementBySelector(ModelTooltip.versionInfo); diff --git a/apps/chat-e2e/src/ui/webElements/overlay/profilePanel.ts b/apps/chat-e2e/src/ui/webElements/overlay/profilePanel.ts new file mode 100644 index 0000000000..1ae52e9ff9 --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/overlay/profilePanel.ts @@ -0,0 +1,24 @@ +import { HeaderSelectors } from '@/src/ui/selectors'; +import { BaseElement } from '@/src/ui/webElements'; +import { Footer } from '@/src/ui/webElements/footer'; +import { Locator, Page } from '@playwright/test'; + +export class ProfilePanel extends BaseElement { + constructor(page: Page, parentLocator?: Locator) { + super(page, HeaderSelectors.profilePanel, parentLocator); + } + + public settings = this.getChildElementBySelector(HeaderSelectors.settings); + public logout = this.getChildElementBySelector(HeaderSelectors.overlayLogout); + public username = this.getChildElementBySelector(HeaderSelectors.username); + public avatar = this.getChildElementBySelector(HeaderSelectors.avatar); + + private footer!: Footer; + + getFooter(): Footer { + if (!this.footer) { + this.footer = new Footer(this.page, this.rootLocator); + } + return this.footer; + } +} diff --git a/apps/chat-e2e/src/ui/webElements/playbackControl.ts b/apps/chat-e2e/src/ui/webElements/playbackControl.ts index ca8c6db27e..b46567b7eb 100644 --- a/apps/chat-e2e/src/ui/webElements/playbackControl.ts +++ b/apps/chat-e2e/src/ui/webElements/playbackControl.ts @@ -1,11 +1,11 @@ import { PlaybackSelectors } from '@/src/ui/selectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; import { PlaybackMessage } from '@/src/ui/webElements/playbackMessage'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class PlaybackControl extends BaseElement { - constructor(page: Page) { - super(page, PlaybackSelectors.playbackControl); + constructor(page: Page, parentLocator: Locator) { + super(page, PlaybackSelectors.playbackControl, parentLocator); } private playbackMessage!: PlaybackMessage; diff --git a/apps/chat-e2e/src/ui/webElements/promptBar.ts b/apps/chat-e2e/src/ui/webElements/promptBar.ts index 874a33174d..c160c2e10a 100644 --- a/apps/chat-e2e/src/ui/webElements/promptBar.ts +++ b/apps/chat-e2e/src/ui/webElements/promptBar.ts @@ -10,11 +10,11 @@ import { } from '@/src/ui/webElements/entityTree'; import { OrganizationPromptsTree } from '@/src/ui/webElements/entityTree/sidebar/organizationPromptsTree'; import { SideBar } from '@/src/ui/webElements/sideBar'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class PromptBar extends SideBar { - constructor(page: Page) { - super(page, SideBarSelectors.promptBar); + constructor(page: Page, parentLocator: Locator) { + super(page, SideBarSelectors.promptBar, parentLocator); } private promptsTree!: PromptsTree; diff --git a/apps/chat-e2e/src/ui/webElements/publishingRequestModal.ts b/apps/chat-e2e/src/ui/webElements/publishingRequestModal.ts index ce44542709..4b1605c654 100644 --- a/apps/chat-e2e/src/ui/webElements/publishingRequestModal.ts +++ b/apps/chat-e2e/src/ui/webElements/publishingRequestModal.ts @@ -1,6 +1,7 @@ import { Publication, PublicationRequestModel } from '@/chat/types/publication'; import { API } from '@/src/testData'; import { + IconSelectors, PublishingApprovalModalSelectors, PublishingModalSelectors, } from '@/src/ui/selectors'; @@ -15,11 +16,11 @@ import { PromptsToPublishTree, } from '@/src/ui/webElements/entityTree'; import { PublishingRules } from '@/src/ui/webElements/publishingRules'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class PublishingRequestModal extends BaseElement { - constructor(page: Page) { - super(page, PublishingModalSelectors.modalContainer); + constructor(page: Page, parentLocator?: Locator) { + super(page, PublishingModalSelectors.modalContainer, parentLocator); } public allowAccessLabel = this.getChildElementBySelector( @@ -28,6 +29,9 @@ export class PublishingRequestModal extends BaseElement { public availabilityLabel = this.getChildElementBySelector( PublishingApprovalModalSelectors.availabilityLabel, ); + public cancelButton = this.getChildElementBySelector( + IconSelectors.cancelIcon, + ); //conversations to publish trees private conversationsToPublishTree!: ConversationsToPublishTree; diff --git a/apps/chat-e2e/src/ui/webElements/settingsModal.ts b/apps/chat-e2e/src/ui/webElements/settingsModal.ts index 57c86eea5a..7056037cd6 100644 --- a/apps/chat-e2e/src/ui/webElements/settingsModal.ts +++ b/apps/chat-e2e/src/ui/webElements/settingsModal.ts @@ -1,12 +1,13 @@ import { Styles, Tags } from '@/src/ui/domData'; +import { IconSelectors } from '@/src/ui/selectors'; import { AccountSettingsModalSelector } from '@/src/ui/selectors/dialogSelectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; import { DropdownButtonMenu } from '@/src/ui/webElements/dropdownButtonMenu'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class SettingsModal extends BaseElement { - constructor(page: Page) { - super(page, AccountSettingsModalSelector.settingsModal); + constructor(page: Page, parentLocator?: Locator) { + super(page, AccountSettingsModalSelector.settingsModal, parentLocator); } private themeDropdownMenu!: DropdownButtonMenu; @@ -21,6 +22,9 @@ export class SettingsModal extends BaseElement { public theme = this.getChildElementBySelector( AccountSettingsModalSelector.theme, ); + public customLogo = this.getChildElementBySelector( + AccountSettingsModalSelector.customLogo, + ); public fullWidthChatToggle = this.getChildElementBySelector( AccountSettingsModalSelector.fullWidthChatToggle, @@ -29,6 +33,9 @@ export class SettingsModal extends BaseElement { public saveButton = this.getChildElementBySelector( AccountSettingsModalSelector.save, ); + public cancelButton = this.getChildElementBySelector( + IconSelectors.cancelIcon, + ); public async getFullWidthChatToggleColor() { const toggleColor = await this.fullWidthChatToggle diff --git a/apps/chat-e2e/src/ui/webElements/shareModal.ts b/apps/chat-e2e/src/ui/webElements/shareModal.ts index 212545b566..a3f4b41e5b 100644 --- a/apps/chat-e2e/src/ui/webElements/shareModal.ts +++ b/apps/chat-e2e/src/ui/webElements/shareModal.ts @@ -3,11 +3,11 @@ import { BaseElement } from './baseElement'; import { Tags } from '@/src/ui/domData'; import { ChatSelectors, ShareModalSelectors } from '@/src/ui/selectors'; import { IconSelectors } from '@/src/ui/selectors/iconSelectors'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class ShareModal extends BaseElement { - constructor(page: Page) { - super(page, ShareModalSelectors.modalContainer); + constructor(page: Page, parentLocator?: Locator) { + super(page, ShareModalSelectors.modalContainer, parentLocator); } public closeButton = this.getChildElementBySelector(IconSelectors.cancelIcon); diff --git a/apps/chat-e2e/src/ui/webElements/talkToAgentDialog.ts b/apps/chat-e2e/src/ui/webElements/talkToAgentDialog.ts index 2054f1df71..c67b8eebc3 100644 --- a/apps/chat-e2e/src/ui/webElements/talkToAgentDialog.ts +++ b/apps/chat-e2e/src/ui/webElements/talkToAgentDialog.ts @@ -23,6 +23,9 @@ export class TalkToAgentDialog extends BaseElement { public goToMyWorkspaceButton = this.getChildElementBySelector( TalkToAgentDialogSelectors.goToMyWorkspaceButton, ); + public searchAgentInput = this.getChildElementBySelector( + TalkToAgentDialogSelectors.searchAgent, + ); public cancelButton = this.getChildElementBySelector( IconSelectors.cancelIcon, ); diff --git a/apps/chat/src/components/Chat/ChatHeader/HeaderModelTooltip.tsx b/apps/chat/src/components/Chat/ChatHeader/HeaderModelTooltip.tsx index cc4f80928f..15bbbb66ed 100644 --- a/apps/chat/src/components/Chat/ChatHeader/HeaderModelTooltip.tsx +++ b/apps/chat/src/components/Chat/ChatHeader/HeaderModelTooltip.tsx @@ -23,7 +23,7 @@ export const HeaderModelTooltip = ({ className="grid max-w-[880px] grid-cols-1 p-2" data-qa="chat-model-tooltip" > -
+
{t(disallowChangeAgent ? 'Current agent' : 'Change current agent')}:
diff --git a/apps/chat/src/components/Chat/ReportIssueDialog.tsx b/apps/chat/src/components/Chat/ReportIssueDialog.tsx index 08ea2a014c..27364dd815 100644 --- a/apps/chat/src/components/Chat/ReportIssueDialog.tsx +++ b/apps/chat/src/components/Chat/ReportIssueDialog.tsx @@ -104,7 +104,7 @@ export const ReportIssueDialog: FC = ({ isOpen, onClose }) => { portalId="theme-main" state={isOpen ? ModalState.OPENED : ModalState.CLOSED} onClose={handleClose} - dataQa="request-api-key-dialog" + dataQa="report-issue-dialog" overlayClassName="fixed inset-0" containerClassName="inline-block w-full overflow-y-auto px-3 py-4 align-bottom transition-all md:p-6 xl:max-h-[800px] xl:max-w-[720px] 2xl:max-w-[780px]" form={{ diff --git a/apps/chat/src/components/Header/Logo.tsx b/apps/chat/src/components/Header/Logo.tsx index cb316b8346..ec18605e54 100644 --- a/apps/chat/src/components/Header/Logo.tsx +++ b/apps/chat/src/components/Header/Logo.tsx @@ -78,6 +78,7 @@ export const Logo = () => { ? `url(${cssEscape(customLogoUrl)})` : `var(--app-logo)`, }} + data-qa="logo" > ); }; diff --git a/apps/chat/src/components/Header/User/ProfileButton.tsx b/apps/chat/src/components/Header/User/ProfileButton.tsx index 3321e3f905..fa3359fe8f 100644 --- a/apps/chat/src/components/Header/User/ProfileButton.tsx +++ b/apps/chat/src/components/Header/User/ProfileButton.tsx @@ -39,9 +39,15 @@ export const ProfileButton = () => {
{ } > @@ -81,7 +83,7 @@ export const UserDesktop = Inversify.register('UserDesktop', () => { }} /> diff --git a/apps/chat/src/components/Header/User/UserMobile.tsx b/apps/chat/src/components/Header/User/UserMobile.tsx index 4191cfe1c3..cf15b03d22 100644 --- a/apps/chat/src/components/Header/User/UserMobile.tsx +++ b/apps/chat/src/components/Header/User/UserMobile.tsx @@ -43,7 +43,9 @@ const UserInfo = () => { )} - {session?.user?.name ?? ''} + + {session?.user?.name ?? ''} +
); @@ -59,7 +61,7 @@ const UserSettings = () => { return (
@@ -81,7 +83,7 @@ const Logout = () => { return ( <>
{ if (!session) { @@ -128,6 +130,7 @@ export const UserMobile = Inversify.register('UserMobile', () => { 'fixed right-0 z-40 flex w-[260px] flex-col overflow-y-auto border-tertiary bg-layer-3 md:hidden', isOverlay ? 'top-9 h-[calc(100%-36px)]' : 'top-12 h-[calc(100%-48px)]', )} + data-qa="profile-panel" > diff --git a/apps/chat/src/components/Marketplace/SearchHeader.tsx b/apps/chat/src/components/Marketplace/SearchHeader.tsx index 1852fa8e5c..631dbe8e22 100644 --- a/apps/chat/src/components/Marketplace/SearchHeader.tsx +++ b/apps/chat/src/components/Marketplace/SearchHeader.tsx @@ -61,7 +61,10 @@ const AddAppButton = ({ menuItems }: AddAppButtonProps) => { onOpenChange={setIsOpen} placement="bottom" TriggerCustomRenderer={ -
{t('Settings')}
; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx new file mode 100644 index 0000000000..eacdee3d53 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + theme: 'light', + enabledFeatures: [ + Feature.ConversationsSection, + Feature.PromptsSection, + Feature.TopSettings, + Feature.TopClearConversation, + Feature.TopChatInfo, + Feature.TopChatModelSettings, + Feature.EmptyChatSettings, + Feature.RequestApiKey, + Feature.ReportAnIssue, + Feature.Likes, + Feature.Marketplace, + Feature.HideNewConversation, + Feature.ConversationsSharing, + Feature.PromptsSharing, + Feature.AttachmentsManager, + Feature.ConversationsPublishing, + Feature.PromptsPublishing, + Feature.CustomLogo, + Feature.Footer, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx new file mode 100644 index 0000000000..2e8252f6ef --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + modelId: 'gpt-4', + enabledFeatures: [ + Feature.ConversationsSection, + Feature.Header, + Feature.TopSettings, + Feature.TopChatInfo, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx new file mode 100644 index 0000000000..4fec27f3fb --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.TopClearConversation, + Feature.TopChatInfo, + Feature.TopChatModelSettings, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx new file mode 100644 index 0000000000..77df2af726 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.TopSettings, + Feature.TopChatInfo, + Feature.DisallowChangeAgent, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx new file mode 100644 index 0000000000..5653e92184 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.Header, + Feature.Footer, + Feature.ConversationsSection, + Feature.PromptsSection, + Feature.TopSettings, + Feature.TopClearConversation, + Feature.TopChatInfo, + Feature.TopChatModelSettings, + Feature.EmptyChatSettings, + Feature.RequestApiKey, + Feature.ReportAnIssue, + Feature.Likes, + Feature.Marketplace, + Feature.HideNewConversation, + Feature.ConversationsSharing, + Feature.PromptsSharing, + Feature.AttachmentsManager, + Feature.ConversationsPublishing, + Feature.PromptsPublishing, + Feature.CustomLogo, + Feature.MessageTemplates, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx new file mode 100644 index 0000000000..d7fc1030b7 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [Feature.HideEmptyChatChangeAgent], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx new file mode 100644 index 0000000000..0251949c0e --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.TopSettings, + Feature.ConversationsSection, + Feature.HideTopContextMenu, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx new file mode 100644 index 0000000000..23f628f0d3 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx @@ -0,0 +1,24 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.EmptyChatSettings, + Feature.Header, + Feature.ConversationsSection, + Feature.InputFiles, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx new file mode 100644 index 0000000000..f91cff0526 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + modelId: 'gpt-4', + enabledFeatures: [ + Feature.ConversationsSection, + Feature.Header, + Feature.TopSettings, + Feature.TopChatInfo, + Feature.Marketplace, + Feature.CodeApps, + Feature.QuickApps, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx new file mode 100644 index 0000000000..b9df959761 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.EmptyChatSettings, + Feature.Header, + Feature.ConversationsSection, + Feature.TopSettings, + Feature.TopClearConversation, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx new file mode 100644 index 0000000000..ae58ebd48b --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [ + Feature.ReportAnIssue, + Feature.RequestApiKey, + Feature.AttachmentsManager, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx new file mode 100644 index 0000000000..9e6eae61b5 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [Feature.Header, Feature.ConversationsSection], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx new file mode 100644 index 0000000000..2f30b1c530 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [Feature.Header, Feature.Footer], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx new file mode 100644 index 0000000000..5f28ab7daa --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + enabledFeatures: [Feature.Header], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx index f1eb734079..4bf4a5e396 100644 --- a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx @@ -6,7 +6,6 @@ import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, - theme: 'light', modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, diff --git a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx new file mode 100644 index 0000000000..5d49db22c3 --- /dev/null +++ b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; + +import { Feature } from '@epam/ai-dial-shared'; + +const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + overlayConversationId: + 'conversations/public/playback__[Playback] overlayConversationName__0.0.1', + enabledFeatures: [ + Feature.ConversationsSection, + Feature.ConversationsPublishing, + Feature.Header, + ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +export default function Index() { + return ; +} diff --git a/apps/overlay-sandbox/app/global.css b/apps/overlay-sandbox/app/global.css index b5c61c9567..dbeeb253f5 100644 --- a/apps/overlay-sandbox/app/global.css +++ b/apps/overlay-sandbox/app/global.css @@ -1,3 +1,15 @@ @tailwind base; @tailwind components; @tailwind utilities; + +.link-container { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +@media (max-width: 768px) { + .link-container { + flex-direction: column; + } +} diff --git a/apps/overlay-sandbox/app/page.tsx b/apps/overlay-sandbox/app/page.tsx index c7ef2254c7..ed80eef113 100644 --- a/apps/overlay-sandbox/app/page.tsx +++ b/apps/overlay-sandbox/app/page.tsx @@ -3,8 +3,106 @@ import Link from 'next/link'; export default async function Index() { return (
- Overlay - Overlay Manager +
+ + + modelIdSetSandboxOverlay + + + + OverlayManager + + + + disabledHeaderOverlay + + + + + enabledHeaderOverlay + + + + + enabledOnlyHeaderOverlay + + + + + enabledOnlyHeaderFooterOverlay + + + + + enabledOnlyFooterLinksAttachmentsOverlay + + + + + enabledOnlyHeaderConversationsSectionOverlay + + + + + disableTopChatInfoOverlay + + + + + enableDisallowChangeAgentOverlay + + + + + enableHideTopContextMenuOverlay + + + + + enableOnlyEmptyChatSettingsOverlay + + + + + enableInputFilesOverlay + + + + + enableHideEmptyChangeAgentOverlay + + + + + disableAllFeaturesOverlay + + + + + enableMarketplaceOverlay + + + + + disableMarketplaceOverlay + + + + + conversationIdSetOverlay + + +
); } From d72b37e906da0d893688893ced8e9a7336cf3f1a Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Jan 2025 11:42:20 +0100 Subject: [PATCH 03/44] feat/overlay-settings-tests: fixed config import --- apps/chat-e2e/src/testData/api/baseApiHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index 1ece78425d..0c88485c62 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -1,4 +1,4 @@ -import config from '@/config/overlay.playwright.config'; +import config from '@/config/chat.playwright.config'; import { APIRequestContext } from '@playwright/test'; export class BaseApiHelper { From 94aaa5652574f0ed7e9775a87f5bd3a6c8481ee9 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Jan 2025 13:54:41 +0100 Subject: [PATCH 04/44] feat/overlay-settings-tests: fixed api host retrieval --- .../src/testData/api/baseApiHelper.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index 0c88485c62..0455514176 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -10,11 +10,20 @@ export class BaseApiHelper { //function to override the API host if overlay sandbox is running public getHost(endpoint: string) { - if ( - process.env.NEXT_PUBLIC_OVERLAY_HOST && - config.use!.baseURL !== process.env.NEXT_PUBLIC_OVERLAY_HOST - ) { - endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; + const baseUrl = config.use!.baseURL; + //overlay sandbox host includes 'overlay' prefix on CI env + if (process.env.E2E_HOST) { + if (baseUrl?.includes('overlay')) { + endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; + } + } else { + //overlay sandbox has different port on local env + if ( + process.env.NEXT_PUBLIC_OVERLAY_HOST && + baseUrl !== process.env.NEXT_PUBLIC_OVERLAY_HOST + ) { + endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; + } } return endpoint; } From 81aba2ca7fee3d88189c508612d046fe64d676ee Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Jan 2025 15:48:37 +0100 Subject: [PATCH 05/44] feat/overlay-settings-tests: fixed api host retrieval --- apps/chat-e2e/config/chat.playwright.config.ts | 2 ++ .../config/local.overlay.playwright.config.ts | 3 ++- .../config/overlay.playwright.config.ts | 6 +++--- apps/chat-e2e/src/testData/api/baseApiHelper.ts | 17 +++-------------- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/apps/chat-e2e/config/chat.playwright.config.ts b/apps/chat-e2e/config/chat.playwright.config.ts index e373f767f9..962ca0b31a 100644 --- a/apps/chat-e2e/config/chat.playwright.config.ts +++ b/apps/chat-e2e/config/chat.playwright.config.ts @@ -1,6 +1,8 @@ import { ResultFolder } from '@/src/testData'; import { defineConfig, devices } from '@playwright/test'; +export const overlayHost = 'http://localhost:4200'; + /** * See https://playwright.dev/docs/test-configuration. */ diff --git a/apps/chat-e2e/config/local.overlay.playwright.config.ts b/apps/chat-e2e/config/local.overlay.playwright.config.ts index 8bd3886faf..56c065e981 100644 --- a/apps/chat-e2e/config/local.overlay.playwright.config.ts +++ b/apps/chat-e2e/config/local.overlay.playwright.config.ts @@ -1,5 +1,6 @@ import config from './overlay.playwright.config'; +import { overlayHost } from '@/config/chat.playwright.config'; import { ResultFolder } from '@/src/testData'; import { workspaceRoot } from '@nx/devkit'; import { ReporterDescription } from '@playwright/test'; @@ -35,7 +36,7 @@ config.webServer = [ { cwd: workspaceRoot, command: 'npx nx serve:sandbox overlay-sandbox', - url: 'http://localhost:4200', + url: overlayHost, timeout: 180000, reuseExistingServer: true, env: { diff --git a/apps/chat-e2e/config/overlay.playwright.config.ts b/apps/chat-e2e/config/overlay.playwright.config.ts index bce7d6c01e..dbec95e332 100644 --- a/apps/chat-e2e/config/overlay.playwright.config.ts +++ b/apps/chat-e2e/config/overlay.playwright.config.ts @@ -1,4 +1,4 @@ -import config from './chat.playwright.config'; +import config, { overlayHost } from './chat.playwright.config'; import { ResultFolder } from '@/src/testData'; import { workspaceRoot } from '@nx/devkit'; @@ -21,14 +21,14 @@ config.reporter = [ }, ], ]; -config.use!.baseURL = 'http://localhost:4200'; +config.use!.baseURL = overlayHost; config.use!.navigationTimeout = 60000; config.use!.actionTimeout = 60000; config.webServer = { cwd: workspaceRoot, command: 'npx nx serve:sandbox:production overlay-sandbox', - url: 'http://localhost:4200', + url: overlayHost, timeout: 300000, reuseExistingServer: true, stdout: 'pipe', diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index 0455514176..cec9bb9ff3 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -1,4 +1,4 @@ -import config from '@/config/chat.playwright.config'; +import config, { overlayHost } from '@/config/chat.playwright.config'; import { APIRequestContext } from '@playwright/test'; export class BaseApiHelper { @@ -11,19 +11,8 @@ export class BaseApiHelper { //function to override the API host if overlay sandbox is running public getHost(endpoint: string) { const baseUrl = config.use!.baseURL; - //overlay sandbox host includes 'overlay' prefix on CI env - if (process.env.E2E_HOST) { - if (baseUrl?.includes('overlay')) { - endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; - } - } else { - //overlay sandbox has different port on local env - if ( - process.env.NEXT_PUBLIC_OVERLAY_HOST && - baseUrl !== process.env.NEXT_PUBLIC_OVERLAY_HOST - ) { - endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; - } + if (baseUrl === overlayHost) { + endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; } return endpoint; } From 3a8d6353a8b31d5518770f404e527aee332a5fc2 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 10 Jan 2025 17:56:16 +0100 Subject: [PATCH 06/44] feat/overlay-settings-tests: added more verifications to test --- apps/chat-e2e/src/testData/api/fileApiHelper.ts | 1 + .../tests/overlay/overlayConversationIdFeature.test.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/apps/chat-e2e/src/testData/api/fileApiHelper.ts b/apps/chat-e2e/src/testData/api/fileApiHelper.ts index 0f8bf984ee..44baa33fb1 100644 --- a/apps/chat-e2e/src/testData/api/fileApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/fileApiHelper.ts @@ -122,6 +122,7 @@ export class FileApiHelper extends BaseApiHelper { return 'application/octet-stream'; // Default to generic binary type } } + public static extractFilename(filePath: string) { const lastSlashIndex = filePath.lastIndexOf('/'); return lastSlashIndex !== -1 diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index da3a690e03..3564fd3fb6 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -94,6 +94,15 @@ dialOverlayTest( overlayPlaybackControl, 'visible', ); + + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayOrganizationConversations.selectedConversation( + ExpectedConstants.playbackConversation.concat(conversationName), + ), + 'visible', + ); + await overlayHeader.leftPanelToggle.click(); }, ); From 6741213f34b0ed4b028522db8e76cfc4a78def38 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 09:08:26 +0100 Subject: [PATCH 07/44] feat/overlay-settings-tests: added valid action for published attachment --- apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts b/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts index 16734e0cd0..5729938a48 100644 --- a/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts +++ b/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts @@ -72,7 +72,7 @@ export class PublishRequestBuilder { withFileResource(attachment: Attachment): PublishRequestBuilder { const resource = { - action: PublishActions.ADD, + action: PublishActions.ADD_IF_ABSENT, sourceUrl: attachment.url, targetUrl: `files/${this.getPublishRequest().targetFolder}${attachment.title}`, }; From b5b2c367df4c33d75318f0ce27f83b2313f640b3 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 09:44:54 +0100 Subject: [PATCH 08/44] feat/overlay-settings-tests: debug changes --- .../src/tests/accountSettings.test.ts | 2 +- .../overlayConversationIdFeature.test.ts | 96 ++++++++++--------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/apps/chat-e2e/src/tests/accountSettings.test.ts b/apps/chat-e2e/src/tests/accountSettings.test.ts index a05b4d4708..e528f3badd 100644 --- a/apps/chat-e2e/src/tests/accountSettings.test.ts +++ b/apps/chat-e2e/src/tests/accountSettings.test.ts @@ -9,7 +9,7 @@ import { import { Colors, Styles } from '@/src/ui/domData'; import { GeneratorUtil, ModelsUtil } from '@/src/utils'; -dialTest( +dialTest.only( 'Menu on user name', async ({ dialHomePage, diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index 3564fd3fb6..3492c806cf 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -16,7 +16,7 @@ import { expect } from '@playwright/test'; const publicationsToUnpublish: Publication[] = []; const conversationName = 'overlayConversationName'; -dialOverlayTest( +dialOverlayTest.only( '[Overlay] Exact conversation is set in Overlay. Playback chat with Plotly graph', async ({ overlayHomePage, @@ -106,50 +106,58 @@ dialOverlayTest( }, ); - await dialOverlayTest.step( - 'Play the conversation forward and verify the graph is displayed', - async () => { - await overlayPlaybackControl.playbackNextButton.click(); - await page.keyboard.press(keys.arrowRight); - await overlayChatMessages - .getChatMessageAttachment(2, Attachment.plotlyName) - .waitForState(); - const expandAttachmentResponse = - await overlayChatMessages.expandChatMessageAttachment( - 2, - Attachment.plotlyName, - ); - expect - .soft( - expandAttachmentResponse?.status(), - ExpectedMessages.attachmentIsExpanded, - ) - .toBe(200); - await overlayBaseAssertion.assertElementState( - overlayChatMessages.getMessagePlotlyAttachment(2), - 'visible', - ); - }, - ); + await dialOverlayTest.step('For debug', async () => { + await overlayHomePage.navigateToUrl( + process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ); + await page.locator('[data-qa="left-panel-toggle"]:visible').click() + await page.locator('[data-qa="chat-folders"]>[data-qa="published-with-me-container"]').waitFor(); + }); - await dialOverlayTest.step( - 'Create a new conversation, refresh the page and verify playback conversation is preselected', - async () => { - await overlayHeader.createNewConversation(); - await overlayHomePage.reloadPage(); - await overlayBaseAssertion.assertElementState( - overlayPlaybackControl, - 'visible', - ); - await overlayHeader.leftPanelToggle.click(); - await overlayBaseAssertion.assertElementState( - overlayOrganizationConversations.selectedConversation( - ExpectedConstants.playbackConversation.concat(conversationName), - ), - 'visible', - ); - }, - ); + // await dialOverlayTest.step( + // 'Play the conversation forward and verify the graph is displayed', + // async () => { + // await overlayPlaybackControl.playbackNextButton.click(); + // await page.keyboard.press(keys.arrowRight); + // await overlayChatMessages + // .getChatMessageAttachment(2, Attachment.plotlyName) + // .waitForState(); + // const expandAttachmentResponse = + // await overlayChatMessages.expandChatMessageAttachment( + // 2, + // Attachment.plotlyName, + // ); + // expect + // .soft( + // expandAttachmentResponse?.status(), + // ExpectedMessages.attachmentIsExpanded, + // ) + // .toBe(200); + // await overlayBaseAssertion.assertElementState( + // overlayChatMessages.getMessagePlotlyAttachment(2), + // 'visible', + // ); + // }, + // ); + // + // await dialOverlayTest.step( + // 'Create a new conversation, refresh the page and verify playback conversation is preselected', + // async () => { + // await overlayHeader.createNewConversation(); + // await overlayHomePage.reloadPage(); + // await overlayBaseAssertion.assertElementState( + // overlayPlaybackControl, + // 'visible', + // ); + // await overlayHeader.leftPanelToggle.click(); + // await overlayBaseAssertion.assertElementState( + // overlayOrganizationConversations.selectedConversation( + // ExpectedConstants.playbackConversation.concat(conversationName), + // ), + // 'visible', + // ); + // }, + // ); }, ); From 6bab457311d71400299d32c6a73eac8793310ec2 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 09:46:43 +0100 Subject: [PATCH 09/44] feat/overlay-settings-tests: debug changes --- apps/chat-e2e/config/overlay.playwright.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/chat-e2e/config/overlay.playwright.config.ts b/apps/chat-e2e/config/overlay.playwright.config.ts index dbec95e332..8d9d1eb160 100644 --- a/apps/chat-e2e/config/overlay.playwright.config.ts +++ b/apps/chat-e2e/config/overlay.playwright.config.ts @@ -24,6 +24,8 @@ config.reporter = [ config.use!.baseURL = overlayHost; config.use!.navigationTimeout = 60000; config.use!.actionTimeout = 60000; +config.use!.video = 'on'; +config.use!.trace = 'on'; config.webServer = { cwd: workspaceRoot, From 16e4f65b576da1424047e252d280f402f86b7da0 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 12:18:00 +0100 Subject: [PATCH 10/44] Revert "feat/overlay-settings-tests: debug changes" This reverts commit 6bab457311d71400299d32c6a73eac8793310ec2. --- apps/chat-e2e/config/overlay.playwright.config.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/chat-e2e/config/overlay.playwright.config.ts b/apps/chat-e2e/config/overlay.playwright.config.ts index 8d9d1eb160..dbec95e332 100644 --- a/apps/chat-e2e/config/overlay.playwright.config.ts +++ b/apps/chat-e2e/config/overlay.playwright.config.ts @@ -24,8 +24,6 @@ config.reporter = [ config.use!.baseURL = overlayHost; config.use!.navigationTimeout = 60000; config.use!.actionTimeout = 60000; -config.use!.video = 'on'; -config.use!.trace = 'on'; config.webServer = { cwd: workspaceRoot, From 74ba27f78cbb77807b30c9d0e9169cd0502f07fc Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 12:18:16 +0100 Subject: [PATCH 11/44] Revert "feat/overlay-settings-tests: debug changes" This reverts commit b5b2c367df4c33d75318f0ce27f83b2313f640b3. --- .../src/tests/accountSettings.test.ts | 2 +- .../overlayConversationIdFeature.test.ts | 96 +++++++++---------- 2 files changed, 45 insertions(+), 53 deletions(-) diff --git a/apps/chat-e2e/src/tests/accountSettings.test.ts b/apps/chat-e2e/src/tests/accountSettings.test.ts index e528f3badd..a05b4d4708 100644 --- a/apps/chat-e2e/src/tests/accountSettings.test.ts +++ b/apps/chat-e2e/src/tests/accountSettings.test.ts @@ -9,7 +9,7 @@ import { import { Colors, Styles } from '@/src/ui/domData'; import { GeneratorUtil, ModelsUtil } from '@/src/utils'; -dialTest.only( +dialTest( 'Menu on user name', async ({ dialHomePage, diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index 3492c806cf..3564fd3fb6 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -16,7 +16,7 @@ import { expect } from '@playwright/test'; const publicationsToUnpublish: Publication[] = []; const conversationName = 'overlayConversationName'; -dialOverlayTest.only( +dialOverlayTest( '[Overlay] Exact conversation is set in Overlay. Playback chat with Plotly graph', async ({ overlayHomePage, @@ -106,58 +106,50 @@ dialOverlayTest.only( }, ); - await dialOverlayTest.step('For debug', async () => { - await overlayHomePage.navigateToUrl( - process.env.NEXT_PUBLIC_OVERLAY_HOST!, - ); - await page.locator('[data-qa="left-panel-toggle"]:visible').click() - await page.locator('[data-qa="chat-folders"]>[data-qa="published-with-me-container"]').waitFor(); - }); + await dialOverlayTest.step( + 'Play the conversation forward and verify the graph is displayed', + async () => { + await overlayPlaybackControl.playbackNextButton.click(); + await page.keyboard.press(keys.arrowRight); + await overlayChatMessages + .getChatMessageAttachment(2, Attachment.plotlyName) + .waitForState(); + const expandAttachmentResponse = + await overlayChatMessages.expandChatMessageAttachment( + 2, + Attachment.plotlyName, + ); + expect + .soft( + expandAttachmentResponse?.status(), + ExpectedMessages.attachmentIsExpanded, + ) + .toBe(200); + await overlayBaseAssertion.assertElementState( + overlayChatMessages.getMessagePlotlyAttachment(2), + 'visible', + ); + }, + ); - // await dialOverlayTest.step( - // 'Play the conversation forward and verify the graph is displayed', - // async () => { - // await overlayPlaybackControl.playbackNextButton.click(); - // await page.keyboard.press(keys.arrowRight); - // await overlayChatMessages - // .getChatMessageAttachment(2, Attachment.plotlyName) - // .waitForState(); - // const expandAttachmentResponse = - // await overlayChatMessages.expandChatMessageAttachment( - // 2, - // Attachment.plotlyName, - // ); - // expect - // .soft( - // expandAttachmentResponse?.status(), - // ExpectedMessages.attachmentIsExpanded, - // ) - // .toBe(200); - // await overlayBaseAssertion.assertElementState( - // overlayChatMessages.getMessagePlotlyAttachment(2), - // 'visible', - // ); - // }, - // ); - // - // await dialOverlayTest.step( - // 'Create a new conversation, refresh the page and verify playback conversation is preselected', - // async () => { - // await overlayHeader.createNewConversation(); - // await overlayHomePage.reloadPage(); - // await overlayBaseAssertion.assertElementState( - // overlayPlaybackControl, - // 'visible', - // ); - // await overlayHeader.leftPanelToggle.click(); - // await overlayBaseAssertion.assertElementState( - // overlayOrganizationConversations.selectedConversation( - // ExpectedConstants.playbackConversation.concat(conversationName), - // ), - // 'visible', - // ); - // }, - // ); + await dialOverlayTest.step( + 'Create a new conversation, refresh the page and verify playback conversation is preselected', + async () => { + await overlayHeader.createNewConversation(); + await overlayHomePage.reloadPage(); + await overlayBaseAssertion.assertElementState( + overlayPlaybackControl, + 'visible', + ); + await overlayHeader.leftPanelToggle.click(); + await overlayBaseAssertion.assertElementState( + overlayOrganizationConversations.selectedConversation( + ExpectedConstants.playbackConversation.concat(conversationName), + ), + 'visible', + ); + }, + ); }, ); From 7e5fe2bd41fe83030b5c14501cebfc7fc1f185f3 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 16:34:07 +0100 Subject: [PATCH 12/44] feat/overlay-settings-tests: fixed test, added issue link --- apps/chat-e2e/src/core/localStorageManager.ts | 17 ++++++ .../overlayConversationIdFeature.test.ts | 56 +++++++++++++------ 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/apps/chat-e2e/src/core/localStorageManager.ts b/apps/chat-e2e/src/core/localStorageManager.ts index a929bbc0f0..e21b475053 100644 --- a/apps/chat-e2e/src/core/localStorageManager.ts +++ b/apps/chat-e2e/src/core/localStorageManager.ts @@ -151,4 +151,21 @@ export class LocalStorageManager { async setChatbarWidth(width: string) { await this.page.addInitScript(this.setChatbarWidthKey(), width); } + + async getSelectedConversationIds(originHost?: string) { + let selectedConversationIds; + const storage = await this.page.context().storageState(); + let origin; + if (originHost) { + origin = storage.origins.find((o) => o.origin === originHost); + } else { + origin = storage.origins[0]; + } + if (origin) { + selectedConversationIds = origin.localStorage.find( + (s) => s.name === 'selectedConversationIds', + )?.value; + } + return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; + } } diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index 3564fd3fb6..58baae4f92 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -15,6 +15,7 @@ import { expect } from '@playwright/test'; const publicationsToUnpublish: Publication[] = []; const conversationName = 'overlayConversationName'; +const expectedConversationId = `conversations/public/playback__${ExpectedConstants.playbackConversation}${conversationName}__${ExpectedConstants.defaultAppVersion}`; dialOverlayTest( '[Overlay] Exact conversation is set in Overlay. Playback chat with Plotly graph', @@ -26,7 +27,7 @@ dialOverlayTest( overlayHeader, conversationData, overlayBaseAssertion, - overlayOrganizationConversations, + localStorageManager, overlayDataInjector, setTestIds, overlayFileApiHelper, @@ -94,15 +95,26 @@ dialOverlayTest( overlayPlaybackControl, 'visible', ); + const selectedConversationIds = + await localStorageManager.getSelectedConversationIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ); + expect + .soft( + selectedConversationIds[0], + ExpectedMessages.conversationIsSelected, + ) + .toBe(expectedConversationId); - await overlayHeader.leftPanelToggle.click(); - await overlayBaseAssertion.assertElementState( - overlayOrganizationConversations.selectedConversation( - ExpectedConstants.playbackConversation.concat(conversationName), - ), - 'visible', - ); - await overlayHeader.leftPanelToggle.click(); + //TODO: enable when fixed https://github.com/epam/ai-dial-chat/issues/2929 + // await overlayHeader.leftPanelToggle.click(); + // await overlayBaseAssertion.assertElementState( + // overlayOrganizationConversations.selectedConversation( + // ExpectedConstants.playbackConversation.concat(conversationName), + // ), + // 'visible', + // ); + // await overlayHeader.leftPanelToggle.click(); }, ); @@ -141,13 +153,25 @@ dialOverlayTest( overlayPlaybackControl, 'visible', ); - await overlayHeader.leftPanelToggle.click(); - await overlayBaseAssertion.assertElementState( - overlayOrganizationConversations.selectedConversation( - ExpectedConstants.playbackConversation.concat(conversationName), - ), - 'visible', - ); + const selectedConversationIds = + await localStorageManager.getSelectedConversationIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ); + expect + .soft( + selectedConversationIds[0], + ExpectedMessages.conversationIsSelected, + ) + .toBe(expectedConversationId); + + //TODO: enable when fixed https://github.com/epam/ai-dial-chat/issues/2929 + // await overlayHeader.leftPanelToggle.click(); + // await overlayBaseAssertion.assertElementState( + // overlayOrganizationConversations.selectedConversation( + // ExpectedConstants.playbackConversation.concat(conversationName), + // ), + // 'visible', + // ); }, ); }, From 6fe6d000cddf85aa8e674613a87617f84726507a Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 13 Jan 2025 18:57:58 +0100 Subject: [PATCH 13/44] feat/overlay-settings-tests: fixed file publishing request builder --- .../testData/publishing/publishRequestBuilder.ts | 16 ++++++++++++---- .../overlay/overlayConversationIdFeature.test.ts | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts b/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts index 5729938a48..975ebcbcd3 100644 --- a/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts +++ b/apps/chat-e2e/src/testData/publishing/publishRequestBuilder.ts @@ -70,12 +70,20 @@ export class PublishRequestBuilder { return this; } - withFileResource(attachment: Attachment): PublishRequestBuilder { - const resource = { - action: PublishActions.ADD_IF_ABSENT, - sourceUrl: attachment.url, + withFileResource( + attachment: Attachment, + action: PublishActions, + ): PublishRequestBuilder { + let resource: PublicationResource = { + action: action, targetUrl: `files/${this.getPublishRequest().targetFolder}${attachment.title}`, }; + if (action === 'ADD' || action === 'ADD_IF_ABSENT') { + resource = { + ...resource, + sourceUrl: attachment.url, + }; + } this.publishRequest.resources.push(resource); return this; } diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index 58baae4f92..5771e30d27 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -77,7 +77,7 @@ dialOverlayTest( const publishRequest = publishRequestBuilder .withName(GeneratorUtil.randomPublicationRequestName()) .withConversationResource(playbackConversation, PublishActions.ADD) - .withFileResource(attachment!) + .withFileResource(attachment!, PublishActions.ADD_IF_ABSENT) .build(); const publication = await overlayPublicationApiHelper.createPublishRequest(publishRequest); From 6324862b0c842bdb0033f4be29c0d06c55637dab Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 14 Jan 2025 10:51:00 +0100 Subject: [PATCH 14/44] feat/overlay-settings-tests: added dynamic component for overlay sandbox --- .../components/dynamicChatOverlayWrapper.tsx | 18 ++++++++++++++++++ .../disabled-all-features-sandbox/page.tsx | 13 +++++-------- .../overlay/disabled-header-sandbox/page.tsx | 13 +++++-------- .../disabled-marketplace-sandbox/page.tsx | 13 +++++-------- .../disabled-top-chat-info-sandbox/page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../overlay/enabled-header-sandbox/page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../enabled-input-files-sandbox/page.tsx | 13 +++++-------- .../enabled-marketplace-sandbox/page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- .../enabled-only-header-sandbox/page.tsx | 13 +++++-------- .../overlay/model-id-set-sandbox/page.tsx | 13 +++++-------- .../page.tsx | 13 +++++-------- 18 files changed, 103 insertions(+), 136 deletions(-) create mode 100644 apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx diff --git a/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx b/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx new file mode 100644 index 0000000000..9ba3f9f5bf --- /dev/null +++ b/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx @@ -0,0 +1,18 @@ +import dynamic from 'next/dynamic'; + +export const commonOverlayProps = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + +const DynamicChatOverlayWrapper = dynamic(() => + import('../components/chatOverlayWrapper').then( + (mod) => mod.ChatOverlayWrapper, + ), +); + +export default DynamicChatOverlayWrapper; diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx index 4fec27f3fb..d31dda2e33 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx @@ -1,23 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx index eacdee3d53..9a418db86e 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx @@ -1,11 +1,13 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, theme: 'light', enabledFeatures: [ Feature.ConversationsSection, @@ -28,13 +30,8 @@ const overlayOptions = { Feature.CustomLogo, Feature.Footer, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx index 2e8252f6ef..466e5e0102 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx @@ -1,11 +1,12 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -13,13 +14,9 @@ const overlayOptions = { Feature.TopSettings, Feature.TopChatInfo, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx index 4fec27f3fb..b973af39d7 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx @@ -1,23 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx index 77df2af726..8b7a043816 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx @@ -1,23 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopSettings, Feature.TopChatInfo, Feature.DisallowChangeAgent, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx index 5653e92184..31aed17d28 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx @@ -1,11 +1,12 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.Header, Feature.Footer, @@ -29,13 +30,9 @@ const overlayOptions = { Feature.CustomLogo, Feature.MessageTemplates, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx index d7fc1030b7..8274dacb8c 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx @@ -1,19 +1,16 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.HideEmptyChatChangeAgent], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx index 0251949c0e..419ebd284a 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx @@ -1,23 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopSettings, Feature.ConversationsSection, Feature.HideTopContextMenu, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx index 23f628f0d3..15c8754034 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx @@ -1,24 +1,21 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, Feature.ConversationsSection, Feature.InputFiles, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx index f91cff0526..38e9bb8c02 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx @@ -1,11 +1,12 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -16,13 +17,9 @@ const overlayOptions = { Feature.CodeApps, Feature.QuickApps, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx index b9df959761..33aa844c7f 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx @@ -1,11 +1,12 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, @@ -13,13 +14,9 @@ const overlayOptions = { Feature.TopSettings, Feature.TopClearConversation, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx index ae58ebd48b..8f71570bf5 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx @@ -1,23 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.ReportAnIssue, Feature.RequestApiKey, Feature.AttachmentsManager, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx index 9e6eae61b5..139511d730 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx @@ -1,19 +1,16 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.Header, Feature.ConversationsSection], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx index 2f30b1c530..1d1640fe15 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx @@ -1,19 +1,16 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.Header, Feature.Footer], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx index 5f28ab7daa..a3c0a14aaa 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx @@ -1,19 +1,16 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [Feature.Header], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx index 4bf4a5e396..34f2510d1c 100644 --- a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx @@ -1,11 +1,12 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -22,13 +23,9 @@ const overlayOptions = { Feature.Likes, Feature.Marketplace, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, + ...commonOverlayProps, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx index 5d49db22c3..ce7e84f777 100644 --- a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx @@ -1,11 +1,13 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import DynamicChatOverlayWrapper, { + commonOverlayProps, +} from '../../components/dynamicChatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, overlayConversationId: 'conversations/public/playback__[Playback] overlayConversationName__0.0.1', enabledFeatures: [ @@ -13,13 +15,8 @@ const overlayOptions = { Feature.ConversationsPublishing, Feature.Header, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { - return ; + return ; } From 4bbf43339416cc29ccd0c4326f451edfb4fb2349 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 14 Jan 2025 11:41:19 +0100 Subject: [PATCH 15/44] Revert "feat/overlay-settings-tests: added dynamic component for overlay sandbox" This reverts commit 6324862b0c842bdb0033f4be29c0d06c55637dab. --- .../components/dynamicChatOverlayWrapper.tsx | 18 ------------------ .../disabled-all-features-sandbox/page.tsx | 13 ++++++++----- .../overlay/disabled-header-sandbox/page.tsx | 13 ++++++++----- .../disabled-marketplace-sandbox/page.tsx | 13 ++++++++----- .../disabled-top-chat-info-sandbox/page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../overlay/enabled-header-sandbox/page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../enabled-input-files-sandbox/page.tsx | 13 ++++++++----- .../enabled-marketplace-sandbox/page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- .../enabled-only-header-sandbox/page.tsx | 13 ++++++++----- .../overlay/model-id-set-sandbox/page.tsx | 13 ++++++++----- .../page.tsx | 13 ++++++++----- 18 files changed, 136 insertions(+), 103 deletions(-) delete mode 100644 apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx diff --git a/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx b/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx deleted file mode 100644 index 9ba3f9f5bf..0000000000 --- a/apps/overlay-sandbox/app/cases/components/dynamicChatOverlayWrapper.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import dynamic from 'next/dynamic'; - -export const commonOverlayProps = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, -}; - -const DynamicChatOverlayWrapper = dynamic(() => - import('../components/chatOverlayWrapper').then( - (mod) => mod.ChatOverlayWrapper, - ), -); - -export default DynamicChatOverlayWrapper; diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx index d31dda2e33..4fec27f3fb 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx @@ -1,20 +1,23 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - ...commonOverlayProps, + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx index 9a418db86e..eacdee3d53 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx @@ -1,13 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - ...commonOverlayProps, + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, theme: 'light', enabledFeatures: [ Feature.ConversationsSection, @@ -30,8 +28,13 @@ const overlayOptions = { Feature.CustomLogo, Feature.Footer, ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx index 466e5e0102..2e8252f6ef 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx @@ -1,12 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -14,9 +13,13 @@ const overlayOptions = { Feature.TopSettings, Feature.TopChatInfo, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx index b973af39d7..4fec27f3fb 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx @@ -1,20 +1,23 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx index 8b7a043816..77df2af726 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx @@ -1,20 +1,23 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopSettings, Feature.TopChatInfo, Feature.DisallowChangeAgent, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx index 31aed17d28..5653e92184 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx @@ -1,12 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.Header, Feature.Footer, @@ -30,9 +29,13 @@ const overlayOptions = { Feature.CustomLogo, Feature.MessageTemplates, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx index 8274dacb8c..d7fc1030b7 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx @@ -1,16 +1,19 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.HideEmptyChatChangeAgent], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx index 419ebd284a..0251949c0e 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx @@ -1,20 +1,23 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.TopSettings, Feature.ConversationsSection, Feature.HideTopContextMenu, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx index 15c8754034..23f628f0d3 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx @@ -1,21 +1,24 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, Feature.ConversationsSection, Feature.InputFiles, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx index 38e9bb8c02..f91cff0526 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx @@ -1,12 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -17,9 +16,13 @@ const overlayOptions = { Feature.CodeApps, Feature.QuickApps, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx index 33aa844c7f..b9df959761 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx @@ -1,12 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, @@ -14,9 +13,13 @@ const overlayOptions = { Feature.TopSettings, Feature.TopClearConversation, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx index 8f71570bf5..ae58ebd48b 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx @@ -1,20 +1,23 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [ Feature.ReportAnIssue, Feature.RequestApiKey, Feature.AttachmentsManager, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx index 139511d730..9e6eae61b5 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx @@ -1,16 +1,19 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.Header, Feature.ConversationsSection], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx index 1d1640fe15..2f30b1c530 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx @@ -1,16 +1,19 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.Header, Feature.Footer], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx index a3c0a14aaa..5f28ab7daa 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx @@ -1,16 +1,19 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - ...commonOverlayProps, + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, enabledFeatures: [Feature.Header], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx index 34f2510d1c..4bf4a5e396 100644 --- a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx @@ -1,12 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -23,9 +22,13 @@ const overlayOptions = { Feature.Likes, Feature.Marketplace, ], - ...commonOverlayProps, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } diff --git a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx index ce7e84f777..5d49db22c3 100644 --- a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx @@ -1,13 +1,11 @@ 'use client'; -import DynamicChatOverlayWrapper, { - commonOverlayProps, -} from '../../components/dynamicChatOverlayWrapper'; +import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - ...commonOverlayProps, + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, overlayConversationId: 'conversations/public/playback__[Playback] overlayConversationName__0.0.1', enabledFeatures: [ @@ -15,8 +13,13 @@ const overlayOptions = { Feature.ConversationsPublishing, Feature.Header, ], + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, }; export default function Index() { - return ; + return ; } From 4a807f49db35cd20713de57e50c3d3ffa7af5e1d Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 14 Jan 2025 11:56:29 +0100 Subject: [PATCH 16/44] feat/overlay-settings-tests: added common props for overlay sandbox --- .../app/cases/components/chatOverlayWrapper.tsx | 9 +++++++++ .../app/cases/overlay-manager/page.tsx | 8 ++------ .../overlay/disabled-all-features-sandbox/page.tsx | 12 +++++------- .../cases/overlay/disabled-header-sandbox/page.tsx | 12 +++++------- .../overlay/disabled-marketplace-sandbox/page.tsx | 12 +++++------- .../overlay/disabled-top-chat-info-sandbox/page.tsx | 12 +++++------- .../enabled-disallow-change-agent-sandbox/page.tsx | 12 +++++------- .../cases/overlay/enabled-header-sandbox/page.tsx | 12 +++++------- .../enabled-hide-empty-change-agent-sandbox/page.tsx | 12 +++++------- .../enabled-hide-top-context-menu-sandbox/page.tsx | 12 +++++------- .../overlay/enabled-input-files-sandbox/page.tsx | 12 +++++------- .../overlay/enabled-marketplace-sandbox/page.tsx | 12 +++++------- .../page.tsx | 12 +++++------- .../page.tsx | 12 +++++------- .../page.tsx | 12 +++++------- .../enabled-only-header-footer-sandbox/page.tsx | 12 +++++------- .../overlay/enabled-only-header-sandbox/page.tsx | 12 +++++------- .../app/cases/overlay/model-id-set-sandbox/page.tsx | 12 +++++------- .../overlay-conversation-id-set-sandbox/page.tsx | 12 +++++------- 19 files changed, 96 insertions(+), 125 deletions(-) diff --git a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx index 8bddc5c738..f46fddb2a7 100644 --- a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx +++ b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx @@ -3,6 +3,15 @@ import { ChatOverlay, ChatOverlayOptions } from '@epam/ai-dial-overlay'; import React, { useCallback, useEffect, useRef, useState } from 'react'; +export const commonOverlayProps = { + domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + requestTimeout: 20000, + loaderStyles: { + background: 'white', + fontSize: '24px', + }, +}; + interface ChatOverlayWrapperProps { overlayOptions: Omit; } diff --git a/apps/overlay-sandbox/app/cases/overlay-manager/page.tsx b/apps/overlay-sandbox/app/cases/overlay-manager/page.tsx index 7cfe822e3c..0286d656da 100644 --- a/apps/overlay-sandbox/app/cases/overlay-manager/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay-manager/page.tsx @@ -1,10 +1,11 @@ import { ChatOverlayManagerWrapper } from '../components/chatOverlayManagerWrapper'; +import { commonOverlayProps } from '../components/chatOverlayWrapper'; import { ChatOverlayManagerOptions, Feature } from '@epam/ai-dial-overlay'; const overlayOptions: Omit = { id: 'test', - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, theme: 'light', modelId: 'gpt-4', enabledFeatures: [ @@ -21,11 +22,6 @@ const overlayOptions: Omit = { Feature.ReportAnIssue, Feature.Likes, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, allowFullscreen: true, iconSvg: ` diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx index 4fec27f3fb..3da2475712 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx @@ -1,21 +1,19 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx index eacdee3d53..95966ae0d2 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-header-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, theme: 'light', enabledFeatures: [ Feature.ConversationsSection, @@ -28,11 +31,6 @@ const overlayOptions = { Feature.CustomLogo, Feature.Footer, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx index 2e8252f6ef..a3c0d13eb2 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-marketplace-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -13,11 +16,6 @@ const overlayOptions = { Feature.TopSettings, Feature.TopChatInfo, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx index 4fec27f3fb..3da2475712 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-top-chat-info-sandbox/page.tsx @@ -1,21 +1,19 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.TopClearConversation, Feature.TopChatInfo, Feature.TopChatModelSettings, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx index 77df2af726..41003f2620 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-disallow-change-agent-sandbox/page.tsx @@ -1,21 +1,19 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.TopSettings, Feature.TopChatInfo, Feature.DisallowChangeAgent, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx index 5653e92184..c4f26679b9 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-header-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.Header, Feature.Footer, @@ -29,11 +32,6 @@ const overlayOptions = { Feature.CustomLogo, Feature.MessageTemplates, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx index d7fc1030b7..48f1128c3a 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-empty-change-agent-sandbox/page.tsx @@ -1,17 +1,15 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [Feature.HideEmptyChatChangeAgent], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx index 0251949c0e..00022292c8 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-hide-top-context-menu-sandbox/page.tsx @@ -1,21 +1,19 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.TopSettings, Feature.ConversationsSection, Feature.HideTopContextMenu, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx index 23f628f0d3..d3e4d3bc23 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-input-files-sandbox/page.tsx @@ -1,22 +1,20 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, Feature.ConversationsSection, Feature.InputFiles, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx index f91cff0526..b7ca9e79c4 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-marketplace-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -16,11 +19,6 @@ const overlayOptions = { Feature.CodeApps, Feature.QuickApps, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx index b9df959761..22584bd747 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.EmptyChatSettings, Feature.Header, @@ -13,11 +16,6 @@ const overlayOptions = { Feature.TopSettings, Feature.TopClearConversation, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx index ae58ebd48b..bedd9f5f22 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-footer-links-attachments-sandbox/page.tsx @@ -1,21 +1,19 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [ Feature.ReportAnIssue, Feature.RequestApiKey, Feature.AttachmentsManager, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx index 9e6eae61b5..c331e825a8 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-conversations-section-sandbox/page.tsx @@ -1,17 +1,15 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [Feature.Header, Feature.ConversationsSection], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx index 2f30b1c530..cd9bdd7515 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-footer-sandbox/page.tsx @@ -1,17 +1,15 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [Feature.Header, Feature.Footer], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx index 5f28ab7daa..94ef790b8f 100644 --- a/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/enabled-only-header-sandbox/page.tsx @@ -1,17 +1,15 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, enabledFeatures: [Feature.Header], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx index 4bf4a5e396..4adcf76327 100644 --- a/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/model-id-set-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, modelId: 'gpt-4', enabledFeatures: [ Feature.ConversationsSection, @@ -22,11 +25,6 @@ const overlayOptions = { Feature.Likes, Feature.Marketplace, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { diff --git a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx index 5d49db22c3..9b102bf0aa 100644 --- a/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/overlay-conversation-id-set-sandbox/page.tsx @@ -1,11 +1,14 @@ 'use client'; -import { ChatOverlayWrapper } from '../../components/chatOverlayWrapper'; +import { + ChatOverlayWrapper, + commonOverlayProps, +} from '../../components/chatOverlayWrapper'; import { Feature } from '@epam/ai-dial-shared'; const overlayOptions = { - domain: process.env.NEXT_PUBLIC_OVERLAY_HOST!, + ...commonOverlayProps, overlayConversationId: 'conversations/public/playback__[Playback] overlayConversationName__0.0.1', enabledFeatures: [ @@ -13,11 +16,6 @@ const overlayOptions = { Feature.ConversationsPublishing, Feature.Header, ], - requestTimeout: 20000, - loaderStyles: { - background: 'white', - fontSize: '24px', - }, }; export default function Index() { From 61e9818ae67925bc5b89319b38bae7f8149e661d Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 14 Jan 2025 12:15:55 +0100 Subject: [PATCH 17/44] feat/overlay-settings-tests: added workerThreads=true to next config --- apps/overlay-sandbox/next.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/overlay-sandbox/next.config.js b/apps/overlay-sandbox/next.config.js index 4f7ce385db..f236a05a0a 100644 --- a/apps/overlay-sandbox/next.config.js +++ b/apps/overlay-sandbox/next.config.js @@ -20,6 +20,9 @@ const nextConfig = { return config; }, + experimental: { + workerThreads: true + } }; const plugins = [ From 4e58d493fc4a90729c90927c2dc11326d2a6340e Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 17 Jan 2025 11:20:29 +0100 Subject: [PATCH 18/44] feat/overlay-settings-tests: resolved merge conflicts --- apps/chat-e2e/src/tests/isolatedView.test.ts | 2 +- apps/chat-e2e/src/ui/selectors/headerSelectors.ts | 1 - apps/chat-e2e/src/ui/webElements/header.ts | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/chat-e2e/src/tests/isolatedView.test.ts b/apps/chat-e2e/src/tests/isolatedView.test.ts index 2c0307c331..105834c960 100644 --- a/apps/chat-e2e/src/tests/isolatedView.test.ts +++ b/apps/chat-e2e/src/tests/isolatedView.test.ts @@ -384,7 +384,7 @@ dialTest( await dialTest.step( 'Click on the logo after sending the request', async () => { - await header.dialLogo.click(); + await header.logo.click(); await chatBar.waitForState({ state: 'hidden' }); await promptBar.waitForState({ state: 'hidden' }); await sendMessageAssertion.assertInputFieldState('visible', 'enabled'); diff --git a/apps/chat-e2e/src/ui/selectors/headerSelectors.ts b/apps/chat-e2e/src/ui/selectors/headerSelectors.ts index 9e7e25161a..69153a5cc1 100644 --- a/apps/chat-e2e/src/ui/selectors/headerSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/headerSelectors.ts @@ -13,5 +13,4 @@ export const HeaderSelectors = { username: '[data-qa="username"]:visible', avatar: '[alt="User avatar"]', closeButton: '#close-icon', - dialLogo: '[data-qa="dial-logo"]', }; diff --git a/apps/chat-e2e/src/ui/webElements/header.ts b/apps/chat-e2e/src/ui/webElements/header.ts index 607a446b22..bb11006360 100644 --- a/apps/chat-e2e/src/ui/webElements/header.ts +++ b/apps/chat-e2e/src/ui/webElements/header.ts @@ -34,8 +34,6 @@ export class Header extends BaseElement { public logo = this.getChildElementBySelector(HeaderSelectors.logo); - public dialLogo = this.getChildElementBySelector(HeaderSelectors.dialLogo); - public async createNewConversation() { await this.newEntityButton.click(); } From 2067e4d793894c6308e28557bc15858f1f299080 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 17 Jan 2025 11:26:38 +0100 Subject: [PATCH 19/44] feat/overlay-settings-tests: prettier --- apps/chat/src/components/Header/Logo.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/chat/src/components/Header/Logo.tsx b/apps/chat/src/components/Header/Logo.tsx index 9597dd6c30..8cca2eb773 100644 --- a/apps/chat/src/components/Header/Logo.tsx +++ b/apps/chat/src/components/Header/Logo.tsx @@ -73,7 +73,6 @@ export const Logo = () => { 'mx-auto min-w-[110px] bg-contain bg-center bg-no-repeat md:ml-5 lg:bg-left', messageIsStreaming && 'cursor-not-allowed', )} - data-qa="dial-logo" style={{ backgroundImage: customLogoUrl ? `url(${cssEscape(customLogoUrl)})` From cc528bfe3f0c1142f1efaf2d7d25efdb700698bf Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 17 Jan 2025 13:23:52 +0100 Subject: [PATCH 20/44] feat/overlay-settings-tests: fixed test --- apps/chat-e2e/src/tests/isolatedView.test.ts | 2 +- apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts | 6 ++++++ apps/chat-e2e/src/ui/selectors/dialogSelectors.ts | 1 - apps/chat-e2e/src/ui/webElements/settingsModal.ts | 4 ---- apps/chat/src/components/Settings/CustomLogoSelect.tsx | 1 - 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/chat-e2e/src/tests/isolatedView.test.ts b/apps/chat-e2e/src/tests/isolatedView.test.ts index 105834c960..93f14cc568 100644 --- a/apps/chat-e2e/src/tests/isolatedView.test.ts +++ b/apps/chat-e2e/src/tests/isolatedView.test.ts @@ -277,7 +277,7 @@ dialTest( AccountMenuOptions.settings, AccountMenuOptions.logout, ); - await accountDropdownMenu.selectMenuOption('Settings'); + await accountDropdownMenu.selectMenuOption(AccountMenuOptions.settings); await baseAssertion.assertElementState(settingsModal, 'visible'); await baseAssertion.assertElementState(settingsModal.theme, 'visible'); await baseAssertion.assertElementState( diff --git a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts index 9000ce6dc2..485f8fba20 100644 --- a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts @@ -3,6 +3,7 @@ import { DialAIEntityModel } from '@/chat/types/models'; import dialTest from '@/src/core/dialFixtures'; import dialOverlayTest from '@/src/core/dialOverlayFixtures'; import { + Attachment, MockedChatApiResponseBodies, OverlaySandboxUrls, } from '@/src/testData'; @@ -32,6 +33,7 @@ dialOverlayTest( overlayConfirmationDialog, overlayConversations, overlayConversationSettingsModal, + overlayFileApiHelper, setTestIds, }) => { setTestIds('EPMRTC-3773', 'EPMRTC-3765', 'EPMRTC-4868'); @@ -41,10 +43,14 @@ dialOverlayTest( await dialTest.step( 'Create conversation with attachment in the request', async () => { + const imageUrl = await overlayFileApiHelper.putFile( + Attachment.sunImageName, + ); attachmentConversation = conversationData.prepareConversationWithAttachmentsInRequest( modelWithAttachment, true, + imageUrl, ); await overlayDataInjector.createConversations([attachmentConversation]); }, diff --git a/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts b/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts index e7d885d06e..20455856bd 100644 --- a/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/dialogSelectors.ts @@ -136,7 +136,6 @@ export const AccountSettingsModalSelector = { customLogo: '[data-qa="custom-logo"]', fullWidthChatToggle: '[data-qa="toggle-switch"]', save: '[data-qa="save"]', - customLogo: '[data-qa="custom-logo"]', }; export const PublishingModalSelectors = { diff --git a/apps/chat-e2e/src/ui/webElements/settingsModal.ts b/apps/chat-e2e/src/ui/webElements/settingsModal.ts index c9e4b5aa69..7056037cd6 100644 --- a/apps/chat-e2e/src/ui/webElements/settingsModal.ts +++ b/apps/chat-e2e/src/ui/webElements/settingsModal.ts @@ -30,10 +30,6 @@ export class SettingsModal extends BaseElement { AccountSettingsModalSelector.fullWidthChatToggle, ); - public customLogo = this.getChildElementBySelector( - AccountSettingsModalSelector.customLogo, - ); - public saveButton = this.getChildElementBySelector( AccountSettingsModalSelector.save, ); diff --git a/apps/chat/src/components/Settings/CustomLogoSelect.tsx b/apps/chat/src/components/Settings/CustomLogoSelect.tsx index 6cfb7df7bf..2cd630ee6c 100644 --- a/apps/chat/src/components/Settings/CustomLogoSelect.tsx +++ b/apps/chat/src/components/Settings/CustomLogoSelect.tsx @@ -48,7 +48,6 @@ export const CustomLogoSelect = ({ 'flex h-[38px] max-w-[331px] grow basis-2/3 items-center gap-8 overflow-hidden rounded border border-primary px-3 focus-within:border-accent-primary focus:border-accent-primary md:basis-3/4', className, )} - data-qa="custom-logo" >
Date: Fri, 17 Jan 2025 16:00:04 +0100 Subject: [PATCH 21/44] feat/publish-file-tests: implemented tests for files publishing --- .../src/assertions/addonsDialogAssertion.ts | 2 +- .../src/assertions/agentInfoAssertion.ts | 2 +- .../src/assertions/agentSettingAssertion.ts | 2 +- .../assertions/{ => base}/baseAssertion.ts | 8 + .../{ => base}/entityTreeAssertion.ts | 2 +- apps/chat-e2e/src/assertions/chatAssertion.ts | 2 +- .../src/assertions/chatHeaderAssertion.ts | 2 +- .../src/assertions/chatMessagesAssertion.ts | 2 +- .../conversationInfoTooltipAssertion.ts | 2 +- .../conversationToApproveAssertion.ts | 4 - .../conversationToCompareAssertion.ts | 2 +- .../conversationToPublishAssertion.ts | 4 - .../src/assertions/folderAssertion.ts | 2 +- apps/chat-e2e/src/assertions/index.ts | 14 +- .../assertions/marketplaceAgentsAssertion.ts | 2 +- .../messageTemplateModalAssertion.ts | 2 +- .../assertions/promptPreviewModalAssertion.ts | 2 +- .../assertions/promptToApproveAssertion.ts | 4 - .../assertions/promptToPublishAssertion.ts | 4 - .../publishedPromptPreviewModalAssertion.ts | 0 .../publishingApprovalModalAssertion.ts | 2 +- .../publishingRequestModalAssertion.ts | 2 +- .../trees}/publishEntityAssertion.ts | 2 +- .../trees}/publishFolderAssertion.ts | 0 .../renameConversationModalAssertion.ts | 2 +- .../src/assertions/sideBarEntityAssertion.ts | 2 +- .../assertions/talkToAgentDialogAssertion.ts | 2 +- .../src/assertions/tooltipAssertion.ts | 2 +- .../src/assertions/variableModalAssertion.ts | 2 +- apps/chat-e2e/src/core/baseFixtures.ts | 8 +- apps/chat-e2e/src/core/dialAdminFixtures.ts | 101 ++- apps/chat-e2e/src/core/dialFixtures.ts | 52 +- apps/chat-e2e/src/core/dialOverlayFixtures.ts | 2 + .../src/core/dialSharedWithMeFixtures.ts | 27 +- .../src/testData/api/baseApiHelper.ts | 4 +- .../src/testData/api/fileApiHelper.ts | 8 - .../src/testData/api/itemApiHelper.ts | 8 - .../src/testData/expectedConstants.ts | 4 + .../duplicateSharedConversations.test.ts | 8 +- .../src/tests/publishConversation.test.ts | 43 +- .../publishConversationToOrganisation.test.ts | 31 +- .../publishConversationWithAttachment.test.ts | 660 ++++++++++++++++++ .../publishFolderWithConversation.test.ts | 99 ++- .../shareConversationWithContent.test.ts | 59 +- apps/chat-e2e/src/ui/webElements/chat.ts | 2 +- .../src/ui/webElements/chatMessages.ts | 3 +- .../entityTree/publishFilesTree.ts | 8 + 47 files changed, 1083 insertions(+), 124 deletions(-) rename apps/chat-e2e/src/assertions/{ => base}/baseAssertion.ts (96%) rename apps/chat-e2e/src/assertions/{ => base}/entityTreeAssertion.ts (98%) delete mode 100644 apps/chat-e2e/src/assertions/conversationToApproveAssertion.ts delete mode 100644 apps/chat-e2e/src/assertions/conversationToPublishAssertion.ts delete mode 100644 apps/chat-e2e/src/assertions/promptToApproveAssertion.ts delete mode 100644 apps/chat-e2e/src/assertions/promptToPublishAssertion.ts rename apps/chat-e2e/src/assertions/{ => publishing}/publishedPromptPreviewModalAssertion.ts (100%) rename apps/chat-e2e/src/assertions/{ => publishing}/publishingApprovalModalAssertion.ts (97%) rename apps/chat-e2e/src/assertions/{ => publishing}/publishingRequestModalAssertion.ts (94%) rename apps/chat-e2e/src/assertions/{ => publishing/trees}/publishEntityAssertion.ts (92%) rename apps/chat-e2e/src/assertions/{ => publishing/trees}/publishFolderAssertion.ts (100%) create mode 100644 apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts diff --git a/apps/chat-e2e/src/assertions/addonsDialogAssertion.ts b/apps/chat-e2e/src/assertions/addonsDialogAssertion.ts index cf9c245ed4..35076a59e2 100644 --- a/apps/chat-e2e/src/assertions/addonsDialogAssertion.ts +++ b/apps/chat-e2e/src/assertions/addonsDialogAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { AddonsDialog } from '@/src/ui/webElements'; export class AddonsDialogAssertion extends BaseAssertion { diff --git a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts index 01c5553dec..0e9186ed05 100644 --- a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts +++ b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages } from '@/src/testData'; import { AgentInfo } from '@/src/ui/webElements'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/agentSettingAssertion.ts b/apps/chat-e2e/src/assertions/agentSettingAssertion.ts index 3d1190289c..769e2e36d0 100644 --- a/apps/chat-e2e/src/assertions/agentSettingAssertion.ts +++ b/apps/chat-e2e/src/assertions/agentSettingAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages } from '@/src/testData'; import { AgentSettings } from '@/src/ui/webElements'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/baseAssertion.ts b/apps/chat-e2e/src/assertions/base/baseAssertion.ts similarity index 96% rename from apps/chat-e2e/src/assertions/baseAssertion.ts rename to apps/chat-e2e/src/assertions/base/baseAssertion.ts index d6ee45ebbc..fad7b5a1a5 100644 --- a/apps/chat-e2e/src/assertions/baseAssertion.ts +++ b/apps/chat-e2e/src/assertions/base/baseAssertion.ts @@ -223,4 +223,12 @@ export class BaseAssertion { .soft(elementsCount, ExpectedMessages.elementsCountIsValid) .toBe(expectedCount); } + + public assertValue( + actualValue: string | number | undefined, + expectedValue: string | number, + expectedMessage?: string, + ) { + expect.soft(actualValue, expectedMessage ?? '').toBe(expectedValue); + } } diff --git a/apps/chat-e2e/src/assertions/entityTreeAssertion.ts b/apps/chat-e2e/src/assertions/base/entityTreeAssertion.ts similarity index 98% rename from apps/chat-e2e/src/assertions/entityTreeAssertion.ts rename to apps/chat-e2e/src/assertions/base/entityTreeAssertion.ts index b789bc21a2..66226f3f1d 100644 --- a/apps/chat-e2e/src/assertions/entityTreeAssertion.ts +++ b/apps/chat-e2e/src/assertions/base/entityTreeAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { CheckboxState, ElementState, diff --git a/apps/chat-e2e/src/assertions/chatAssertion.ts b/apps/chat-e2e/src/assertions/chatAssertion.ts index 5dbf841909..848c255536 100644 --- a/apps/chat-e2e/src/assertions/chatAssertion.ts +++ b/apps/chat-e2e/src/assertions/chatAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedConstants, diff --git a/apps/chat-e2e/src/assertions/chatHeaderAssertion.ts b/apps/chat-e2e/src/assertions/chatHeaderAssertion.ts index 251c146c0e..5a3d5d35bc 100644 --- a/apps/chat-e2e/src/assertions/chatHeaderAssertion.ts +++ b/apps/chat-e2e/src/assertions/chatHeaderAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedMessages } from '@/src/testData'; import { Styles } from '@/src/ui/domData'; import { ChatHeader } from '@/src/ui/webElements'; diff --git a/apps/chat-e2e/src/assertions/chatMessagesAssertion.ts b/apps/chat-e2e/src/assertions/chatMessagesAssertion.ts index 01675738d1..d7fd64ab38 100644 --- a/apps/chat-e2e/src/assertions/chatMessagesAssertion.ts +++ b/apps/chat-e2e/src/assertions/chatMessagesAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementLabel, ElementState, ExpectedMessages } from '@/src/testData'; import { Styles } from '@/src/ui/domData'; import { ChatMessages } from '@/src/ui/webElements'; diff --git a/apps/chat-e2e/src/assertions/conversationInfoTooltipAssertion.ts b/apps/chat-e2e/src/assertions/conversationInfoTooltipAssertion.ts index f4250021a8..f3df1945db 100644 --- a/apps/chat-e2e/src/assertions/conversationInfoTooltipAssertion.ts +++ b/apps/chat-e2e/src/assertions/conversationInfoTooltipAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ModelInfoTooltip } from '@/src/ui/webElements'; export class ConversationInfoTooltipAssertion extends BaseAssertion { diff --git a/apps/chat-e2e/src/assertions/conversationToApproveAssertion.ts b/apps/chat-e2e/src/assertions/conversationToApproveAssertion.ts deleted file mode 100644 index 5f432d40fc..0000000000 --- a/apps/chat-e2e/src/assertions/conversationToApproveAssertion.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PublishEntityAssertion } from '@/src/assertions/publishEntityAssertion'; -import { ConversationsToApproveTree } from '@/src/ui/webElements/entityTree'; - -export class ConversationToApproveAssertion extends PublishEntityAssertion {} diff --git a/apps/chat-e2e/src/assertions/conversationToCompareAssertion.ts b/apps/chat-e2e/src/assertions/conversationToCompareAssertion.ts index e7c0629290..89aeb1514f 100644 --- a/apps/chat-e2e/src/assertions/conversationToCompareAssertion.ts +++ b/apps/chat-e2e/src/assertions/conversationToCompareAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedMessages } from '@/src/testData'; import { ConversationToCompare } from '@/src/ui/webElements'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/conversationToPublishAssertion.ts b/apps/chat-e2e/src/assertions/conversationToPublishAssertion.ts deleted file mode 100644 index fcf2ee71a8..0000000000 --- a/apps/chat-e2e/src/assertions/conversationToPublishAssertion.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PublishEntityAssertion } from '@/src/assertions/publishEntityAssertion'; -import { ConversationsToPublishTree } from '@/src/ui/webElements/entityTree'; - -export class ConversationToPublishAssertion extends PublishEntityAssertion {} diff --git a/apps/chat-e2e/src/assertions/folderAssertion.ts b/apps/chat-e2e/src/assertions/folderAssertion.ts index cc1754e47e..71d24d515f 100644 --- a/apps/chat-e2e/src/assertions/folderAssertion.ts +++ b/apps/chat-e2e/src/assertions/folderAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { CheckboxState, ElementState, ExpectedMessages } from '@/src/testData'; import { EntityType, TreeEntity } from '@/src/testData/types'; import { Attributes } from '@/src/ui/domData'; diff --git a/apps/chat-e2e/src/assertions/index.ts b/apps/chat-e2e/src/assertions/index.ts index 5f1c873b19..afca2f3800 100644 --- a/apps/chat-e2e/src/assertions/index.ts +++ b/apps/chat-e2e/src/assertions/index.ts @@ -7,10 +7,9 @@ export * from './chatHeaderAssertion'; export * from './chatMessagesAssertion'; export * from './confirmationDialogAssertion'; export * from './conversationAssertion'; -export * from './conversationToApproveAssertion'; export * from './downloadAssertion'; export * from './agentSettingAssertion'; -export * from './entityTreeAssertion'; +export * from './base/entityTreeAssertion'; export * from './toastAssertion'; export * from './folderAssertion'; export * from './footerAssertion'; @@ -19,9 +18,9 @@ export * from './playbackAssertion'; export * from './promptAssertion'; export * from './promptListAssertion'; export * from './promptModalAssertion'; -export * from './publishEntityAssertion'; -export * from './publishingApprovalModalAssertion'; -export * from './publishingRequestModalAssertion'; +export * from '@/src/assertions/publishing/trees/publishEntityAssertion'; +export * from './publishing/publishingApprovalModalAssertion'; +export * from './publishing/publishingRequestModalAssertion'; export * from './talkToAgentDialogAssertion'; export * from './sendMessageAssertion'; export * from './sharedPromptPreviewModalAssertion'; @@ -32,11 +31,10 @@ export * from './tooltipAssertion'; export * from './variableModalAssertion'; export * from './manageAttachmentsAssertion'; export * from './selectFolderModalAssertion'; -export * from './baseAssertion'; +export * from './base/baseAssertion'; export * from './conversationInfoTooltipAssertion'; export * from './agentInfoAssertion'; export * from './addonsDialogAssertion'; export * from './marketplaceAgentsAssertion'; export * from './conversationToCompareAssertion'; -export * from './conversationToPublishAssertion'; -export * from './publishFolderAssertion'; +export * from '@/src/assertions/publishing/trees/publishFolderAssertion'; diff --git a/apps/chat-e2e/src/assertions/marketplaceAgentsAssertion.ts b/apps/chat-e2e/src/assertions/marketplaceAgentsAssertion.ts index 818f4e72e2..58b8019a30 100644 --- a/apps/chat-e2e/src/assertions/marketplaceAgentsAssertion.ts +++ b/apps/chat-e2e/src/assertions/marketplaceAgentsAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { MarketplaceAgents } from '@/src/ui/webElements'; export class MarketplaceAgentsAssertion extends BaseAssertion { diff --git a/apps/chat-e2e/src/assertions/messageTemplateModalAssertion.ts b/apps/chat-e2e/src/assertions/messageTemplateModalAssertion.ts index c7fa8e17ac..4420fb4a7f 100644 --- a/apps/chat-e2e/src/assertions/messageTemplateModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/messageTemplateModalAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { MessageTemplateModal } from '@/src/ui/webElements'; export class MessageTemplateModalAssertion extends BaseAssertion { diff --git a/apps/chat-e2e/src/assertions/promptPreviewModalAssertion.ts b/apps/chat-e2e/src/assertions/promptPreviewModalAssertion.ts index 21bc9704c1..4f424d93aa 100644 --- a/apps/chat-e2e/src/assertions/promptPreviewModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/promptPreviewModalAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedMessages } from '@/src/testData'; import { PromptPreviewModalWindow } from '@/src/ui/webElements/promptPreviewModalWindow'; diff --git a/apps/chat-e2e/src/assertions/promptToApproveAssertion.ts b/apps/chat-e2e/src/assertions/promptToApproveAssertion.ts deleted file mode 100644 index 6e977bbabc..0000000000 --- a/apps/chat-e2e/src/assertions/promptToApproveAssertion.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PublishEntityAssertion } from '@/src/assertions/publishEntityAssertion'; -import { PromptsToApproveTree } from '@/src/ui/webElements/entityTree'; - -export class PromptToApproveAssertion extends PublishEntityAssertion {} diff --git a/apps/chat-e2e/src/assertions/promptToPublishAssertion.ts b/apps/chat-e2e/src/assertions/promptToPublishAssertion.ts deleted file mode 100644 index 6b082da522..0000000000 --- a/apps/chat-e2e/src/assertions/promptToPublishAssertion.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PublishEntityAssertion } from '@/src/assertions/publishEntityAssertion'; -import { PromptsToPublishTree } from '@/src/ui/webElements/entityTree'; - -export class PromptToPublishAssertion extends PublishEntityAssertion {} diff --git a/apps/chat-e2e/src/assertions/publishedPromptPreviewModalAssertion.ts b/apps/chat-e2e/src/assertions/publishing/publishedPromptPreviewModalAssertion.ts similarity index 100% rename from apps/chat-e2e/src/assertions/publishedPromptPreviewModalAssertion.ts rename to apps/chat-e2e/src/assertions/publishing/publishedPromptPreviewModalAssertion.ts diff --git a/apps/chat-e2e/src/assertions/publishingApprovalModalAssertion.ts b/apps/chat-e2e/src/assertions/publishing/publishingApprovalModalAssertion.ts similarity index 97% rename from apps/chat-e2e/src/assertions/publishingApprovalModalAssertion.ts rename to apps/chat-e2e/src/assertions/publishing/publishingApprovalModalAssertion.ts index d626bedce3..ea9333c490 100644 --- a/apps/chat-e2e/src/assertions/publishingApprovalModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/publishing/publishingApprovalModalAssertion.ts @@ -1,5 +1,5 @@ import { Publication } from '@/chat/types/publication'; -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedConstants, diff --git a/apps/chat-e2e/src/assertions/publishingRequestModalAssertion.ts b/apps/chat-e2e/src/assertions/publishing/publishingRequestModalAssertion.ts similarity index 94% rename from apps/chat-e2e/src/assertions/publishingRequestModalAssertion.ts rename to apps/chat-e2e/src/assertions/publishing/publishingRequestModalAssertion.ts index 77ede6b2a9..8910ec0a66 100644 --- a/apps/chat-e2e/src/assertions/publishingRequestModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/publishing/publishingRequestModalAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages, PublishingExpectedMessages } from '@/src/testData'; import { Colors, Styles } from '@/src/ui/domData'; import { PublishingRequestModal } from '@/src/ui/webElements'; diff --git a/apps/chat-e2e/src/assertions/publishEntityAssertion.ts b/apps/chat-e2e/src/assertions/publishing/trees/publishEntityAssertion.ts similarity index 92% rename from apps/chat-e2e/src/assertions/publishEntityAssertion.ts rename to apps/chat-e2e/src/assertions/publishing/trees/publishEntityAssertion.ts index 385fa88d1a..4f30fabb6a 100644 --- a/apps/chat-e2e/src/assertions/publishEntityAssertion.ts +++ b/apps/chat-e2e/src/assertions/publishing/trees/publishEntityAssertion.ts @@ -1,4 +1,4 @@ -import { EntityTreeAssertion } from '@/src/assertions/entityTreeAssertion'; +import { EntityTreeAssertion } from '@/src/assertions/base/entityTreeAssertion'; import { PublishingExpectedMessages, TreeEntity } from '@/src/testData'; import { PublishEntitiesTree } from '@/src/ui/webElements/entityTree'; diff --git a/apps/chat-e2e/src/assertions/publishFolderAssertion.ts b/apps/chat-e2e/src/assertions/publishing/trees/publishFolderAssertion.ts similarity index 100% rename from apps/chat-e2e/src/assertions/publishFolderAssertion.ts rename to apps/chat-e2e/src/assertions/publishing/trees/publishFolderAssertion.ts diff --git a/apps/chat-e2e/src/assertions/renameConversationModalAssertion.ts b/apps/chat-e2e/src/assertions/renameConversationModalAssertion.ts index 777296e8ab..ea2579a921 100644 --- a/apps/chat-e2e/src/assertions/renameConversationModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/renameConversationModalAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { RenameConversationModal } from '@/src/ui/webElements/renameConversationModal'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/sideBarEntityAssertion.ts b/apps/chat-e2e/src/assertions/sideBarEntityAssertion.ts index 024ce38bc8..10fd23a2c1 100644 --- a/apps/chat-e2e/src/assertions/sideBarEntityAssertion.ts +++ b/apps/chat-e2e/src/assertions/sideBarEntityAssertion.ts @@ -1,4 +1,4 @@ -import { EntityTreeAssertion } from '@/src/assertions/entityTreeAssertion'; +import { EntityTreeAssertion } from '@/src/assertions/base/entityTreeAssertion'; import { ElementState, EntityType, diff --git a/apps/chat-e2e/src/assertions/talkToAgentDialogAssertion.ts b/apps/chat-e2e/src/assertions/talkToAgentDialogAssertion.ts index cf2c383464..48aadaf707 100644 --- a/apps/chat-e2e/src/assertions/talkToAgentDialogAssertion.ts +++ b/apps/chat-e2e/src/assertions/talkToAgentDialogAssertion.ts @@ -1,5 +1,5 @@ import { DialAIEntityModel } from '@/chat/types/models'; -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages } from '@/src/testData'; import { TalkToAgentDialog } from '@/src/ui/webElements/talkToAgentDialog'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/tooltipAssertion.ts b/apps/chat-e2e/src/assertions/tooltipAssertion.ts index 484e164eca..6c74961703 100644 --- a/apps/chat-e2e/src/assertions/tooltipAssertion.ts +++ b/apps/chat-e2e/src/assertions/tooltipAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages } from '@/src/testData'; import { Tooltip } from '@/src/ui/webElements/tooltip'; import { expect } from '@playwright/test'; diff --git a/apps/chat-e2e/src/assertions/variableModalAssertion.ts b/apps/chat-e2e/src/assertions/variableModalAssertion.ts index 282ee8bf20..bc016f3374 100644 --- a/apps/chat-e2e/src/assertions/variableModalAssertion.ts +++ b/apps/chat-e2e/src/assertions/variableModalAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementState, ExpectedMessages } from '@/src/testData'; import { Attributes, Overflow, Styles } from '@/src/ui/domData'; import { VariableModalDialog } from '@/src/ui/webElements'; diff --git a/apps/chat-e2e/src/core/baseFixtures.ts b/apps/chat-e2e/src/core/baseFixtures.ts index 3402e0b39f..d771f1459b 100644 --- a/apps/chat-e2e/src/core/baseFixtures.ts +++ b/apps/chat-e2e/src/core/baseFixtures.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions'; +import { ApiAssertion, BaseAssertion } from '@/src/assertions'; import { LocalStorageManager } from '@/src/core/localStorageManager'; import { AuthProvider, @@ -46,6 +46,7 @@ const test = base.extend< incognitoLocalStorageManager: LocalStorageManager; incognitoAuth0Login: ProviderLogin; baseAssertion: BaseAssertion; + apiAssertion: ApiAssertion; // eslint-disable-next-line @typescript-eslint/no-explicit-any incognitoProviderLogin: ProviderLogin; conversationData: ConversationData; @@ -77,6 +78,11 @@ const test = base.extend< const baseAssertion = new BaseAssertion(); await use(baseAssertion); }, + // eslint-disable-next-line no-empty-pattern + apiAssertion: async ({}, use) => { + const apiAssertion = new ApiAssertion(); + await use(apiAssertion); + }, loginPage: async ({ page }, use) => { const loginPage = new LoginPage(page); await use(loginPage); diff --git a/apps/chat-e2e/src/core/dialAdminFixtures.ts b/apps/chat-e2e/src/core/dialAdminFixtures.ts index b3f1297f92..7248c7a9c5 100644 --- a/apps/chat-e2e/src/core/dialAdminFixtures.ts +++ b/apps/chat-e2e/src/core/dialAdminFixtures.ts @@ -8,6 +8,7 @@ import { PromptBar, PublicationReviewControl, PublishingApprovalModal, + PublishingRequestModal, VariableModalDialog, } from '../ui/webElements'; @@ -15,25 +16,32 @@ import config from '@/config/chat.playwright.config'; import { ChatHeaderAssertion, ChatMessagesAssertion, + ConversationAssertion, + EntityTreeAssertion, MenuAssertion, + PublishEntityAssertion, PublishFolderAssertion, TooltipAssertion, VariableModalAssertion, } from '@/src/assertions'; -import { ConversationToApproveAssertion } from '@/src/assertions/conversationToApproveAssertion'; import { FolderAssertion } from '@/src/assertions/folderAssertion'; -import { PromptToApproveAssertion } from '@/src/assertions/promptToApproveAssertion'; -import { PublishedPromptPreviewModalAssertion } from '@/src/assertions/publishedPromptPreviewModalAssertion'; -import { PublishingApprovalModalAssertion } from '@/src/assertions/publishingApprovalModalAssertion'; +import { PublishedPromptPreviewModalAssertion } from '@/src/assertions/publishing/publishedPromptPreviewModalAssertion'; +import { PublishingApprovalModalAssertion } from '@/src/assertions/publishing/publishingApprovalModalAssertion'; import { SideBarEntityAssertion } from '@/src/assertions/sideBarEntityAssertion'; import dialTest, { stateFilePath } from '@/src/core/dialFixtures'; import { LocalStorageManager } from '@/src/core/localStorageManager'; +import { isApiStorageType } from '@/src/hooks/global-setup'; +import { ApiInjector } from '@/src/testData/injector/apiInjector'; +import { BrowserStorageInjector } from '@/src/testData/injector/browserStorageInjector'; +import { DataInjectorInterface } from '@/src/testData/injector/dataInjectorInterface'; import { AppContainer } from '@/src/ui/webElements/appContainer'; import { ApproveRequiredConversationsTree, ApproveRequiredPrompts, ConversationsToApproveTree, + ConversationsToPublishTree, ConversationsTree, + FilesToApproveTree, FolderConversationsToApprove, FolderPrompts, Folders, @@ -60,15 +68,21 @@ const dialAdminTest = dialTest.extend<{ adminApproveRequiredPrompts: ApproveRequiredPrompts; adminOrganizationFolderConversations: Folders; adminConversationsToApprove: ConversationsToApproveTree; + adminFilesToApprove: FilesToApproveTree; adminPromptsToApprove: PromptsToApproveTree; adminPublishingApprovalModal: PublishingApprovalModal; adminPublishedPromptPreviewModal: PublishedPromptPreviewModal; + adminApiInjector: ApiInjector; + adminBrowserStorageInjector: BrowserStorageInjector; + adminDataInjector: DataInjectorInterface; + adminPublishingRequestModal: PublishingRequestModal; adminApproveRequiredConversationsAssertion: FolderAssertion; adminApproveRequiredPromptsAssertion: FolderAssertion; adminOrganizationFolderConversationAssertions: FolderAssertion; adminPublishingApprovalModalAssertion: PublishingApprovalModalAssertion; - adminConversationToApproveAssertion: ConversationToApproveAssertion; - adminPromptToApproveAssertion: PromptToApproveAssertion; + adminConversationToApproveAssertion: PublishEntityAssertion; + adminFilesToApproveAssertion: EntityTreeAssertion; + adminPromptToApproveAssertion: PublishEntityAssertion; adminFolderToApproveAssertion: PublishFolderAssertion; adminPublicationReviewControl: PublicationReviewControl; adminChatHeader: ChatHeader; @@ -78,6 +92,7 @@ const dialAdminTest = dialTest.extend<{ adminTooltip: Tooltip; adminOrganizationConversations: OrganizationConversationsTree; adminVariableModal: VariableModalDialog; + adminConversationDropdownMenu: DropdownMenu; adminChatHeaderAssertion: ChatHeaderAssertion; adminChatMessagesAssertion: ChatMessagesAssertion; adminOrganizationFolderDropdownMenuAssertion: MenuAssertion; @@ -86,6 +101,9 @@ const dialAdminTest = dialTest.extend<{ adminOrganizationConversationAssertion: SideBarEntityAssertion; adminPublishedPromptPreviewModalAssertion: PublishedPromptPreviewModalAssertion; adminVariableModalAssertion: VariableModalAssertion; + adminConversationAssertion: ConversationAssertion; + adminConversationsToPublishTree: ConversationsToPublishTree; + adminConversationToPublishAssertion: PublishEntityAssertion; }>({ adminPublishedPromptPreviewModalAssertion: async ( { adminPublishedPromptPreviewModal }, @@ -172,6 +190,11 @@ const dialAdminTest = dialTest.extend<{ adminPublishingApprovalModal.getConversationsToApproveTree(); await use(adminConversationsToApprove); }, + adminFilesToApprove: async ({ adminPublishingApprovalModal }, use) => { + const adminFilesToApprove = + adminPublishingApprovalModal.getFilesToApproveTree(); + await use(adminFilesToApprove); + }, adminPromptsToApprove: async ({ adminPublishingApprovalModal }, use) => { const adminPromptsToApprove = adminPublishingApprovalModal.getPromptsToApproveTree(); @@ -223,6 +246,10 @@ const dialAdminTest = dialTest.extend<{ const adminVariableModal = new VariableModalDialog(adminPage); await use(adminVariableModal); }, + adminConversationDropdownMenu: async ({ adminConversations }, use) => { + const adminConversationDropdownMenu = adminConversations.getDropdownMenu(); + await use(adminConversationDropdownMenu); + }, adminChatHeaderAssertion: async ({ adminChatHeader }, use) => { const adminChatHeaderAssertion = new ChatHeaderAssertion(adminChatHeader); await use(adminChatHeaderAssertion); @@ -233,6 +260,29 @@ const dialAdminTest = dialTest.extend<{ ); await use(adminChatMessagesAssertion); }, + adminApiInjector: async ({ adminUserItemApiHelper }, use) => { + const adminApiInjector = new ApiInjector(adminUserItemApiHelper); + await use(adminApiInjector); + }, + adminBrowserStorageInjector: async ({ adminLocalStorageManager }, use) => { + const adminBrowserStorageInjector = new BrowserStorageInjector( + adminLocalStorageManager, + ); + await use(adminBrowserStorageInjector); + }, + adminPublishingRequestModal: async ({ adminPage }, use) => { + const adminPublishingRequestModal = new PublishingRequestModal(adminPage); + await use(adminPublishingRequestModal); + }, + adminDataInjector: async ( + { adminApiInjector, adminBrowserStorageInjector }, + use, + ) => { + const adminDataInjector = isApiStorageType + ? adminApiInjector + : adminBrowserStorageInjector; + await use(adminDataInjector); + }, adminApproveRequiredConversationsAssertion: async ( { adminApproveRequiredConversations }, use, @@ -273,13 +323,20 @@ const dialAdminTest = dialTest.extend<{ use, ) => { const adminConversationToApproveAssertion = - new ConversationToApproveAssertion(adminConversationsToApprove); + new PublishEntityAssertion( + adminConversationsToApprove, + ); await use(adminConversationToApproveAssertion); }, - adminPromptToApproveAssertion: async ({ adminPromptsToApprove }, use) => { - const adminPromptToApproveAssertion = new PromptToApproveAssertion( - adminPromptsToApprove, + adminFilesToApproveAssertion: async ({ adminFilesToApprove }, use) => { + const adminFilesToApproveAssertion = new EntityTreeAssertion( + adminFilesToApprove, ); + await use(adminFilesToApproveAssertion); + }, + adminPromptToApproveAssertion: async ({ adminPromptsToApprove }, use) => { + const adminPromptToApproveAssertion = + new PublishEntityAssertion(adminPromptsToApprove); await use(adminPromptToApproveAssertion); }, adminFolderToApproveAssertion: async ( @@ -328,6 +385,30 @@ const dialAdminTest = dialTest.extend<{ ); await use(adminVariableModalAssertion); }, + adminConversationAssertion: async ({ adminConversations }, use) => { + const adminConversationAssertion = new ConversationAssertion( + adminConversations, + ); + await use(adminConversationAssertion); + }, + adminConversationsToPublishTree: async ( + { adminPublishingRequestModal }, + use, + ) => { + const adminConversationsToPublishTree = + adminPublishingRequestModal.getConversationsToPublishTree(); + await use(adminConversationsToPublishTree); + }, + adminConversationToPublishAssertion: async ( + { adminConversationsToPublishTree }, + use, + ) => { + const adminConversationToPublishAssertion = + new PublishEntityAssertion( + adminConversationsToPublishTree, + ); + await use(adminConversationToPublishAssertion); + }, }); export default dialAdminTest; diff --git a/apps/chat-e2e/src/core/dialFixtures.ts b/apps/chat-e2e/src/core/dialFixtures.ts index e2595b91dc..242771d102 100644 --- a/apps/chat-e2e/src/core/dialFixtures.ts +++ b/apps/chat-e2e/src/core/dialFixtures.ts @@ -22,7 +22,6 @@ import { AccountSettingsAssertion, AgentInfoAssertion, AgentSettingAssertion, - ApiAssertion, ChatAssertion, ChatHeaderAssertion, ChatMessagesAssertion, @@ -31,6 +30,7 @@ import { ConversationInfoTooltipAssertion, ConversationToCompareAssertion, DownloadAssertion, + EntityTreeAssertion, FolderAssertion, FooterAssertion, MarketplaceAgentsAssertion, @@ -39,6 +39,7 @@ import { PromptAssertion, PromptListAssertion, PromptModalAssertion, + PublishEntityAssertion, PublishFolderAssertion, PublishingRequestModalAssertion, SendMessageAssertion, @@ -51,10 +52,8 @@ import { VariableModalAssertion, } from '@/src/assertions'; import { AddonsDialogAssertion } from '@/src/assertions/addonsDialogAssertion'; -import { ConversationToPublishAssertion } from '@/src/assertions/conversationToPublishAssertion'; import { ManageAttachmentsAssertion } from '@/src/assertions/manageAttachmentsAssertion'; import { MessageTemplateModalAssertion } from '@/src/assertions/messageTemplateModalAssertion'; -import { PromptToPublishAssertion } from '@/src/assertions/promptToPublishAssertion'; import { RenameConversationModalAssertion } from '@/src/assertions/renameConversationModalAssertion'; import { SelectFolderModalAssertion } from '@/src/assertions/selectFolderModalAssertion'; import { SettingsModalAssertion } from '@/src/assertions/settingsModalAssertion'; @@ -86,6 +85,7 @@ import { DropdownMenu } from '@/src/ui/webElements/dropdownMenu'; import { ConversationsToPublishTree, ConversationsTree, + FilesToPublishTree, FolderConversations, FolderConversationsToPublish, FolderPrompts, @@ -224,6 +224,7 @@ const dialTest = test.extend<{ settingsModal: SettingsModal; publishingRequestModal: PublishingRequestModal; conversationsToPublishTree: ConversationsToPublishTree; + filesToPublishTree: FilesToPublishTree; promptsToPublishTree: PromptsToPublishTree; folderConversationsToPublish: FolderConversationsToPublish; publicationApiHelper: PublicationApiHelper; @@ -257,7 +258,6 @@ const dialTest = test.extend<{ sendMessagePromptListAssertion: PromptListAssertion; systemPromptListAssertion: PromptListAssertion; variableModalAssertion: VariableModalAssertion; - apiAssertion: ApiAssertion; chatAssertion: ChatAssertion; agentSettingAssertion: AgentSettingAssertion; playbackAssertion: PlaybackAssertion; @@ -273,8 +273,9 @@ const dialTest = test.extend<{ conversationToCompareAssertion: ConversationToCompareAssertion; publishingRequestFolderConversationAssertion: FolderAssertion; talkToAgentDialogAssertion: TalkToAgentDialogAssertion; - conversationToPublishAssertion: ConversationToPublishAssertion; - promptToPublishAssertion: PromptToPublishAssertion; + conversationToPublishAssertion: PublishEntityAssertion; + publishFileAssertion: EntityTreeAssertion; + promptToPublishAssertion: PublishEntityAssertion; folderToPublishAssertion: PublishFolderAssertion; organizationFolderConversationAssertions: FolderAssertion; messageTemplateModalAssertion: MessageTemplateModalAssertion; @@ -604,7 +605,10 @@ const dialTest = test.extend<{ await use(mainUserShareApiHelper); }, adminUserItemApiHelper: async ({ adminUserRequestContext }, use) => { - const adminUserItemApiHelper = new ItemApiHelper(adminUserRequestContext); + const adminUserItemApiHelper = new ItemApiHelper( + adminUserRequestContext, + BucketUtil.getAdminUserBucket(), + ); await use(adminUserItemApiHelper); }, additionalShareUserRequestContext: async ({ playwright }, use) => { @@ -637,6 +641,7 @@ const dialTest = test.extend<{ ) => { const additionalUserShareApiHelper = new ShareApiHelper( additionalShareUserRequestContext, + BucketUtil.getAdditionalShareUserBucket(), ); await use(additionalUserShareApiHelper); }, @@ -646,6 +651,7 @@ const dialTest = test.extend<{ ) => { const additionalSecondUserShareApiHelper = new ShareApiHelper( additionalSecondShareUserRequestContext, + BucketUtil.getAdditionalSecondShareUserBucket(), ); await use(additionalSecondUserShareApiHelper); }, @@ -655,7 +661,8 @@ const dialTest = test.extend<{ ) => { const additionalUserItemApiHelper = new ItemApiHelper( additionalShareUserRequestContext, - ); + BucketUtil.getAdditionalShareUserBucket(), + ); // Use User2's bucket await use(additionalUserItemApiHelper); }, chatNotFound: async ({ page }, use) => { @@ -668,6 +675,7 @@ const dialTest = test.extend<{ ) => { const additionalSecondUserItemApiHelper = new ItemApiHelper( additionalSecondShareUserRequestContext, + BucketUtil.getAdditionalSecondShareUserBucket(), ); await use(additionalSecondUserItemApiHelper); }, @@ -708,6 +716,10 @@ const dialTest = test.extend<{ publishingRequestModal.getConversationsToPublishTree(); await use(conversationsToPublishTree); }, + filesToPublishTree: async ({ publishingRequestModal }, use) => { + const filesToPublishTree = publishingRequestModal.getFilesToPublishTree(); + await use(filesToPublishTree); + }, promptsToPublishTree: async ({ publishingRequestModal }, use) => { const promptsToPublishTree = publishingRequestModal.getPromptsToPublishTree(); @@ -725,6 +737,7 @@ const dialTest = test.extend<{ adminPublicationApiHelper: async ({ adminUserRequestContext }, use) => { const adminPublicationApiHelper = new PublicationApiHelper( adminUserRequestContext, + BucketUtil.getAdminUserBucket(), ); await use(adminPublicationApiHelper); }, @@ -957,15 +970,21 @@ const dialTest = test.extend<{ { conversationsToPublishTree }, use, ) => { - const conversationToPublishAssertion = new ConversationToPublishAssertion( - conversationsToPublishTree, - ); + const conversationToPublishAssertion = + new PublishEntityAssertion( + conversationsToPublishTree, + ); await use(conversationToPublishAssertion); }, - promptToPublishAssertion: async ({ promptsToPublishTree }, use) => { - const promptToPublishAssertion = new PromptToPublishAssertion( - promptsToPublishTree, + publishFileAssertion: async ({ filesToPublishTree }, use) => { + const publishFileAssertion = new EntityTreeAssertion( + filesToPublishTree, ); + await use(publishFileAssertion); + }, + promptToPublishAssertion: async ({ promptsToPublishTree }, use) => { + const promptToPublishAssertion = + new PublishEntityAssertion(promptsToPublishTree); await use(promptToPublishAssertion); }, folderToPublishAssertion: async ({ publishingRequestModal }, use) => { @@ -984,11 +1003,6 @@ const dialTest = test.extend<{ await use(organizationFolderConversationAssertions); }, // eslint-disable-next-line no-empty-pattern - apiAssertion: async ({}, use) => { - const apiAssertion = new ApiAssertion(); - await use(apiAssertion); - }, - // eslint-disable-next-line no-empty-pattern shareApiAssertion: async ({}, use) => { const shareApiAssertion = new ShareApiAssertion(); await use(shareApiAssertion); diff --git a/apps/chat-e2e/src/core/dialOverlayFixtures.ts b/apps/chat-e2e/src/core/dialOverlayFixtures.ts index 3aa03bb132..2083ca9956 100644 --- a/apps/chat-e2e/src/core/dialOverlayFixtures.ts +++ b/apps/chat-e2e/src/core/dialOverlayFixtures.ts @@ -51,6 +51,7 @@ import { ProfilePanel } from '@/src/ui/webElements/overlay/profilePanel'; import { PlaybackControl } from '@/src/ui/webElements/playbackControl'; import { SettingsModal } from '@/src/ui/webElements/settingsModal'; import { ShareModal } from '@/src/ui/webElements/shareModal'; +import { BucketUtil } from '@/src/utils'; import path from 'path'; import { APIRequestContext } from 'playwright-core'; import * as process from 'process'; @@ -353,6 +354,7 @@ const dialOverlayTest = test.extend<{ adminPublicationApiHelper: async ({ adminUserRequestContext }, use) => { const adminPublicationApiHelper = new PublicationApiHelper( adminUserRequestContext, + BucketUtil.getAdminUserBucket(), ); await use(adminPublicationApiHelper); }, diff --git a/apps/chat-e2e/src/core/dialSharedWithMeFixtures.ts b/apps/chat-e2e/src/core/dialSharedWithMeFixtures.ts index 339ba95ff6..3da3cfaa92 100644 --- a/apps/chat-e2e/src/core/dialSharedWithMeFixtures.ts +++ b/apps/chat-e2e/src/core/dialSharedWithMeFixtures.ts @@ -14,6 +14,7 @@ import { ModelInfoTooltip, PromptBar, PromptModalDialog, + PublishingRequestModal, SendMessage, SharedPromptPreviewModal, TalkToAgentDialog, @@ -44,7 +45,7 @@ import { VariableModalAssertion } from '@/src/assertions/variableModalAssertion' import dialTest, { stateFilePath } from '@/src/core/dialFixtures'; import { LocalStorageManager } from '@/src/core/localStorageManager'; import { isApiStorageType } from '@/src/hooks/global-setup'; -import { FileApiHelper, ItemApiHelper } from '@/src/testData/api'; +import { FileApiHelper } from '@/src/testData/api'; import { ApiInjector } from '@/src/testData/injector/apiInjector'; import { BrowserStorageInjector } from '@/src/testData/injector/browserStorageInjector'; import { DataInjectorInterface } from '@/src/testData/injector/dataInjectorInterface'; @@ -102,7 +103,6 @@ const dialSharedWithMeTest = dialTest.extend<{ additionalShareUserBrowserStorageInjector: BrowserStorageInjector; additionalShareUserApiInjector: ApiInjector; additionalShareUserDataInjector: DataInjectorInterface; - additionalShareUserItemApiHelper: ItemApiHelper; additionalShareUserFileApiHelper: FileApiHelper; additionalShareUserPromptModalDialog: PromptModalDialog; additionalShareUserSharedWithMePromptAssertion: SharedWithMePromptsAssertion; @@ -110,6 +110,7 @@ const dialSharedWithMeTest = dialTest.extend<{ additionalShareUserSendMessageAssertion: SendMessageAssertion; additionalShareUserVariableModalAssertion: VariableModalAssertion; additionalShareUserConversationDropdownMenu: DropdownMenu; + additionalShareUserPublishingRequestModal: PublishingRequestModal; additionalShareUserSharedFolderPromptsAssertions: FolderAssertion; additionalShareUserPromptsDropdownMenuAssertion: MenuAssertion; additionalShareUserFolderDropdownMenuAssertion: MenuAssertion; @@ -210,16 +211,6 @@ const dialSharedWithMeTest = dialTest.extend<{ ); await use(additionalShareUserAttachFilesModal); }, - additionalShareUserItemApiHelper: async ( - { additionalShareUserRequestContext }, - use, - ) => { - const additionalUserItemApiHelper = new ItemApiHelper( - additionalShareUserRequestContext, - BucketUtil.getAdditionalShareUserBucket(), - ); // Use User2's bucket - await use(additionalUserItemApiHelper); - }, additionalShareUserAttachmentDropdownMenu: async ( { additionalShareUserSendMessage }, use, @@ -229,11 +220,11 @@ const dialSharedWithMeTest = dialTest.extend<{ await use(additionalShareUserAttachmentDropdownMenu); }, additionalShareUserApiInjector: async ( - { additionalShareUserItemApiHelper }, + { additionalUserItemApiHelper }, use, ) => { const additionalShareUserApiInjector = new ApiInjector( - additionalShareUserItemApiHelper, + additionalUserItemApiHelper, ); await use(additionalShareUserApiInjector); }, @@ -431,6 +422,14 @@ const dialSharedWithMeTest = dialTest.extend<{ additionalShareUserConversations.getDropdownMenu(); await use(additionalShareUserConversationDropdownMenu); }, + additionalShareUserPublishingRequestModal: async ( + { additionalShareUserPage }, + use, + ) => { + const additionalShareUserPublishingRequestModal = + new PublishingRequestModal(additionalShareUserPage); + await use(additionalShareUserPublishingRequestModal); + }, additionalShareUserSharedWithMePromptDropdownMenu: async ( { additionalShareUserSharedWithMePrompts }, use, diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index cec9bb9ff3..91ec20b92e 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -3,9 +3,11 @@ import { APIRequestContext } from '@playwright/test'; export class BaseApiHelper { protected request: APIRequestContext; + protected userBucket?: string; - constructor(request: APIRequestContext) { + constructor(request: APIRequestContext, userBucket?: string) { this.request = request; + this.userBucket = userBucket; } //function to override the API host if overlay sandbox is running diff --git a/apps/chat-e2e/src/testData/api/fileApiHelper.ts b/apps/chat-e2e/src/testData/api/fileApiHelper.ts index d1b7e6b0cb..aab812da84 100644 --- a/apps/chat-e2e/src/testData/api/fileApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/fileApiHelper.ts @@ -6,16 +6,8 @@ import { BucketUtil, ItemUtil } from '@/src/utils'; import { expect } from '@playwright/test'; import * as fs from 'fs'; import path from 'path'; -import { APIRequestContext } from 'playwright-core'; export class FileApiHelper extends BaseApiHelper { - private readonly userBucket?: string; - - constructor(request: APIRequestContext, userBucket?: string) { - super(request); - this.userBucket = userBucket; - } - private async putFileGeneric( buffer: Buffer, filename: string, diff --git a/apps/chat-e2e/src/testData/api/itemApiHelper.ts b/apps/chat-e2e/src/testData/api/itemApiHelper.ts index 22cd86e18a..3d8de8e7be 100644 --- a/apps/chat-e2e/src/testData/api/itemApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/itemApiHelper.ts @@ -6,16 +6,8 @@ import { BaseApiHelper } from '@/src/testData/api/baseApiHelper'; import { BucketUtil, ItemUtil } from '@/src/utils'; import { Entity } from '@epam/ai-dial-shared'; import { expect } from '@playwright/test'; -import { APIRequestContext } from 'playwright-core'; export class ItemApiHelper extends BaseApiHelper { - private readonly userBucket?: string; - - constructor(request: APIRequestContext, userBucket?: string) { - super(request); - this.userBucket = userBucket; - } - public async deleteAllData(bucket?: string) { const bucketToUse = this.userBucket ?? bucket; const conversations = await this.listItems( diff --git a/apps/chat-e2e/src/testData/expectedConstants.ts b/apps/chat-e2e/src/testData/expectedConstants.ts index a2504263d2..028494356d 100644 --- a/apps/chat-e2e/src/testData/expectedConstants.ts +++ b/apps/chat-e2e/src/testData/expectedConstants.ts @@ -219,6 +219,10 @@ export const ExpectedConstants = { modelInfoTooltipChangeTitle: 'Change current agent:', requestApiKeyLink: 'this form', reportAnIssueLink: 'report an issue', + publishedAttachmentDownloadPath: (name: string) => + `${API.fileHost}/public/${name}`, + attachmentPublishErrorMessage: + 'Publishing failed. You are only allowed to publish conversations with attachments from "All files"', }; export enum Types { diff --git a/apps/chat-e2e/src/tests/duplicateSharedConversations.test.ts b/apps/chat-e2e/src/tests/duplicateSharedConversations.test.ts index d4800fef26..ab84a078ad 100644 --- a/apps/chat-e2e/src/tests/duplicateSharedConversations.test.ts +++ b/apps/chat-e2e/src/tests/duplicateSharedConversations.test.ts @@ -146,7 +146,7 @@ dialSharedWithMeTest( folderConversation.folders.name, folderConversation.conversations[0].name, ); - await additionalShareUserChat.duplicateSharedConversation(); + await additionalShareUserChat.duplicateConversation(); await expect .soft( @@ -165,7 +165,7 @@ dialSharedWithMeTest( undefined, { isHttpMethodTriggered: false }, ); - await additionalShareUserChat.duplicateSharedConversation(); + await additionalShareUserChat.duplicateConversation(); await additionalShareUserConversations .getEntityByName(`${conversationName} 1`) .waitFor(); @@ -282,7 +282,7 @@ dialSharedWithMeTest( await dialSharedWithMeTest.step( 'Click on "Duplicate the conversation to be able to edit it" button and verify comparing conversations are duplicated and opened in Compare mode', async () => { - await additionalShareUserChat.duplicateSharedConversation(); + await additionalShareUserChat.duplicateConversation(); await additionalShareUserCompare.waitForComparedConversationsLoaded(); await additionalShareUserChatAssertion.assertDuplicateButtonState( 'hidden', @@ -317,7 +317,7 @@ dialSharedWithMeTest( await dialSharedWithMeTest.step( 'Click on "Duplicate the conversation to be able to edit it" button and verify comparing conversations are duplicated and opened in Compare mode', async () => { - await additionalShareUserChat.duplicateSharedConversation(); + await additionalShareUserChat.duplicateConversation(); await additionalShareUserCompare.waitForComparedConversationsLoaded(); await additionalShareUserChatAssertion.assertDuplicateButtonState( 'hidden', diff --git a/apps/chat-e2e/src/tests/publishConversation.test.ts b/apps/chat-e2e/src/tests/publishConversation.test.ts index d4db029101..7a8d6f60d5 100644 --- a/apps/chat-e2e/src/tests/publishConversation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversation.test.ts @@ -22,6 +22,7 @@ dialAdminTest( 'Publication request name can not be blank.\n' + 'File section displayed when no files in request.\n' + 'Publish admin: review chat.\n' + + 'Admin area: Publish request details.\n' + 'Context menu for approve required section ( not playback mode)' + 'Publish admin: Approve singe chat.\n' + 'Error message when create publish request for already published chat.\n' + @@ -71,6 +72,7 @@ dialAdminTest( 'EPMRTC-3578', 'EPMRTC-3928', 'EPMRTC-3228', + 'EPMRTC-4189', 'EPMRTC-3503', 'EPMRTC-3224', 'EPMRTC-4070', @@ -403,7 +405,8 @@ dialAdminTest( dialAdminTest( 'Publish request name: tab is changed to space if to use it in chat name.\n' + 'Publication request name: Spaces at the beginning or end of chat name are removed.\n' + - 'Publication request name with hieroglyph, specific letters', + 'Publication request name with hieroglyph, specific letters.\n' + + 'Chat from Approve required section is not shown in Compare mode drop down list', async ({ conversationData, dataInjector, @@ -411,15 +414,30 @@ dialAdminTest( publicationApiHelper, adminDialHomePage, adminApproveRequiredConversationsAssertion, + adminDataInjector, + adminConversations, + adminConversationDropdownMenu, + adminChat, + baseAssertion, setTestIds, }) => { - setTestIds('EPMRTC-3575', 'EPMRTC-3584', 'EPMRTC-3589'); + setTestIds('EPMRTC-3575', 'EPMRTC-3584', 'EPMRTC-3589', 'EPMRTC-4057'); const publicationNames = [ `${GeneratorUtil.randomPublicationRequestName()}name\t\twith\ttabs`, ` ${GeneratorUtil.randomPublicationRequestName()} `, `${GeneratorUtil.randomPublicationRequestName()}${ExpectedConstants.hieroglyphChars}`, ]; let conversation: Conversation; + let adminConversation: Conversation; + + await dialAdminTest.step( + 'Prepare conversation for admin user', + async () => { + adminConversation = conversationData.prepareDefaultConversation(); + conversationData.resetData(); + await adminDataInjector.createConversations([adminConversation]); + }, + ); await dialTest.step( 'Create a publication request and verify publication name is correct', @@ -443,6 +461,27 @@ dialAdminTest( } }, ); + + await dialAdminTest.step( + 'Open Compare mode for admins conversation and verify conversation from publication request is not available for comparison', + async () => { + await adminConversations.openEntityDropdownMenu(adminConversation.name); + await adminConversationDropdownMenu.selectMenuOption( + MenuOptions.compare, + ); + const compareConversations = adminChat + .getCompare() + .getConversationToCompare(); + await compareConversations.checkShowAllConversations(); + const conversationsList = + await compareConversations.getCompareConversationNames(); + baseAssertion.assertArrayExcludesAll( + conversationsList, + [conversation.name], + ExpectedMessages.conversationsToCompareOptionsValid, + ); + }, + ); }, ); diff --git a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts index c758cb3d4b..ee43c31fed 100644 --- a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts @@ -215,6 +215,7 @@ dialAdminTest( 'Publish chat: add, rename and delete options for new folder in Organization.\n' + 'Max length of folder name in Publish to path should be 160 symbols .\n' + 'Publish chat: add new folder inside nested folder structure with depth 4.\n' + + 'Change path: create nested folder structure and delete nested folder.\n' + 'Change path: select folder of different levels.\n' + 'Change path form: focus stay on new created folder.\n' + 'Publish chat into nested folder structure', @@ -229,6 +230,7 @@ dialAdminTest( baseAssertion, selectFolders, folderDropdownMenu, + confirmationDialog, folderDropdownMenuAssertion, selectFoldersAssertion, toastAssertion, @@ -249,6 +251,7 @@ dialAdminTest( 'EPMRTC-3577', 'EPMRTC-3458', 'EPMRTC-4060', + 'EPMRTC-4905', 'EPMRTC-3797', 'EPMRTC-3459', ); @@ -263,7 +266,7 @@ dialAdminTest( const newFolderName = GeneratorUtil.randomString(maxNameLength * 1.5); const cutNewFolderName = newFolderName.substring(0, maxNameLength); const defaultFolderName = ExpectedConstants.newFolderWithIndexTitle(1); - const publicationPath = `${PublishPath.Organization}/${cutNewFolderName}/${defaultFolderName}/${defaultFolderName}/${defaultFolderName}`; + const publicationPath = `${PublishPath.Organization}/${cutNewFolderName}/${defaultFolderName}/${defaultFolderName}`; await dialTest.step('Prepare a new conversation to publish', async () => { conversationToPublish = conversationData.prepareDefaultConversation(); @@ -355,6 +358,24 @@ dialAdminTest( }, ); + await dialTest.step( + 'Delete low-level folder and verify a new one is created in edit mode', + async () => { + await selectFolders.openFolderDropdownMenu( + defaultFolderName, + maxNestedLevel - 1, + ); + await folderDropdownMenu.selectMenuOption(MenuOptions.delete); + await confirmationDialog.confirm(); + await selectFolderModal.newFolderButton.click(); + await selectFoldersAssertion.assertFolderEditInputState('visible'); + await selectFoldersAssertion.assertFolderEditInputValue( + defaultFolderName, + ); + await selectFolders.getEditFolderInputActions().clickTickButton(); + }, + ); + await dialTest.step('Verify folders section can be selected', async () => { await selectFolderModal.selectRootFoldersSection(); await selectFolderModalAssertion.assertSectionSelectedState(true); @@ -370,9 +391,9 @@ dialAdminTest( true, ); - for (let i = 1; i <= maxNestedLevel - 1; i++) { + for (let i = 1; i <= maxNestedLevel - 2; i++) { //TODO:remove the clause when fixed https://github.com/epam/ai-dial-chat/issues/2294 - if (i === maxNestedLevel - 1) { + if (i === maxNestedLevel - 2) { await selectFolders.getEditFolderInputActions().clickTickButton(); } await selectFolderModal.selectFolder(defaultFolderName, i); @@ -453,7 +474,7 @@ dialAdminTest( cutNewFolderName, { httpHost: cutNewFolderName }, ); - for (let i = 1; i <= maxNestedLevel - 1; i++) { + for (let i = 1; i <= maxNestedLevel - 2; i++) { await adminOrganizationFolderConversationAssertions.assertFolderState( { name: defaultFolderName, index: i }, 'visible', @@ -466,7 +487,7 @@ dialAdminTest( } await adminOrganizationFolderConversationAssertions.assertFolderEntityState( - { name: defaultFolderName, index: 3 }, + { name: defaultFolderName, index: 2 }, { name: conversationToPublish.name }, 'visible', ); diff --git a/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts new file mode 100644 index 0000000000..424eecf627 --- /dev/null +++ b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts @@ -0,0 +1,660 @@ +import { Conversation } from '@/chat/types/chat'; +import { DialAIEntityModel } from '@/chat/types/models'; +import { Publication, PublicationRequestModel } from '@/chat/types/publication'; +import dialAdminTest from '@/src/core/dialAdminFixtures'; +import dialTest from '@/src/core/dialFixtures'; +import dialSharedWithMeTest from '@/src/core/dialSharedWithMeFixtures'; +import { + API, + Attachment, + CheckboxState, + ExpectedConstants, + ExpectedMessages, + MenuOptions, +} from '@/src/testData'; +import { FileModalSection } from '@/src/ui/webElements'; +import { FileUtil, GeneratorUtil, ModelsUtil } from '@/src/utils'; +import { expect } from '@playwright/test'; + +let defaultModel: DialAIEntityModel; +const publicationsToUnpublish: Publication[] = []; + +dialTest.beforeAll(async () => { + defaultModel = ModelsUtil.getDefaultModel()!; +}); + +dialAdminTest( + 'Publish chat with file.\n' + + 'Publish chat with attachments: download files.\n' + + 'Admin area: Publish request details.\n' + + 'Publish admin : request for chat with files: files are available for admin.\n' + + `Link 'Go to a review' change to 'Continue review" when admin started review with click on chat .\n` + + 'Publish request for chat with already published file.\n' + + 'Publish chat with file, file is from Organization section.\n' + + 'Publish request toooltips', + async ({ + dialHomePage, + conversationData, + dataInjector, + conversations, + organizationConversations, + chatMessagesAssertion, + conversationDropdownMenu, + renameConversationModal, + publishingRequestModal, + toast, + filesToPublishTree, + conversationToPublishAssertion, + publishFileAssertion, + adminDialHomePage, + adminApproveRequiredConversations, + chatBar, + attachFilesModal, + tooltipAssertion, + manageAttachmentsAssertion, + adminPublishingApprovalModal, + adminPublicationReviewControl, + adminFilesToApprove, + adminChatMessages, + organizationConversationAssertion, + adminApproveRequiredConversationsAssertion, + adminOrganizationConversationAssertion, + adminPublishingApprovalModalAssertion, + adminConversationToApproveAssertion, + adminFilesToApproveAssertion, + baseAssertion, + fileApiHelper, + setTestIds, + }) => { + setTestIds( + 'EPMRTC-3463', + 'EPMRTC-3213', + 'EPMRTC-4189', + 'EPMRTC-3421', + 'EPMRTC-3793', + 'EPMRTC-4080', + 'EPMRTC-4704', + 'EPMRTC-3457', + ); + let imageUrl: string; + const filePath = API.modelFilePath(defaultModel.id); + let conversation: Conversation; + let secondConversation: Conversation; + const requestName = GeneratorUtil.randomPublicationRequestName(); + let publishApiModels: { + request: PublicationRequestModel; + response: Publication; + }; + const updatedConversationName = GeneratorUtil.randomString(5); + + await dialSharedWithMeTest.step( + 'Prepare conversation with attachment in the request', + async () => { + imageUrl = await fileApiHelper.putFile( + Attachment.cloudImageName, + filePath, + ); + conversation = + conversationData.prepareConversationWithAttachmentsInRequest( + defaultModel, + true, + imageUrl, + ); + conversationData.resetData(); + await dataInjector.createConversations([conversation]); + }, + ); + + await dialTest.step( + 'Select "Publish" conversation dropdown menu option and verify publishing modal is opened, file is available for publishing and downloading', + async () => { + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await conversations.selectConversation(conversation.name); + await conversations.openEntityDropdownMenu(conversation.name); + await conversationDropdownMenu.selectMenuOption(MenuOptions.publish); + await baseAssertion.assertElementState( + publishingRequestModal, + 'visible', + ); + await conversationToPublishAssertion.assertEntityState( + { name: conversation.name }, + 'visible', + ); + await publishFileAssertion.assertEntityState( + { name: Attachment.cloudImageName }, + 'visible', + ); + await publishFileAssertion.assertEntityCheckboxState( + { name: Attachment.cloudImageName }, + CheckboxState.checked, + ); + await publishFileAssertion.assertElementState( + filesToPublishTree.getFileDownloadIcon(Attachment.cloudImageName), + 'visible', + ); + publishFileAssertion.assertValue( + await filesToPublishTree.getFileDownloadIUrl( + Attachment.cloudImageName, + ), + `api/${imageUrl}`, + ExpectedMessages.attachmentUrlIsValid, + ); + }, + ); + + await dialTest.step( + 'Verify file checkbox state can be changed', + async () => { + for (const state of [CheckboxState.unchecked, CheckboxState.checked]) { + await filesToPublishTree + .getEntityCheckbox(Attachment.cloudImageName) + .click(); + await publishFileAssertion.assertEntityCheckboxState( + { name: Attachment.cloudImageName }, + state, + ); + } + }, + ); + + await dialTest.step( + 'Hover over file and verify tooltip is shown', + async () => { + await filesToPublishTree + .getEntityName(Attachment.cloudImageName) + .hoverOver(); + await tooltipAssertion.assertTooltipContent(Attachment.cloudImageName); + }, + ); + + await dialTest.step( + 'Set publication request name and submit the request', + async () => { + await publishingRequestModal.requestName.fillInInput(requestName); + publishApiModels = + await publishingRequestModal.sendPublicationRequest(); + await baseAssertion.assertElementState( + publishingRequestModal, + 'hidden', + ); + publicationsToUnpublish.push(publishApiModels.response); + }, + ); + + await dialAdminTest.step( + 'Login as admin and verify publishing request is displayed under "Approve required" section', + async () => { + await adminDialHomePage.openHomePage(); + await adminDialHomePage.waitForPageLoaded(); + await adminApproveRequiredConversationsAssertion.assertFolderState( + { name: requestName }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Expand request folder and verify "Publication approval" modal is displayed', + async () => { + await adminApproveRequiredConversations.expandApproveRequiredFolder( + requestName, + ); + await adminApproveRequiredConversationsAssertion.assertFolderEntityState( + { name: requestName }, + { name: conversation.name }, + 'visible', + ); + await adminPublishingApprovalModalAssertion.assertElementState( + adminPublishingApprovalModal, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Verify file is displayed under "Files" tree and has download icon', + async () => { + await adminConversationToApproveAssertion.assertEntityState( + { name: conversation.name }, + 'visible', + ); + await adminFilesToApproveAssertion.assertEntityState( + { name: Attachment.cloudImageName }, + 'visible', + ); + await adminFilesToApproveAssertion.assertElementState( + adminFilesToApprove.getFileDownloadIcon(Attachment.cloudImageName), + 'visible', + ); + await adminDialHomePage.downloadData(() => + adminFilesToApprove + .getFileDownloadIcon(Attachment.cloudImageName) + .click(), + ); + const exportedFiles = FileUtil.getExportedFiles(); + expect + .soft( + exportedFiles?.find((f) => f.includes(Attachment.cloudImageName)), + ExpectedMessages.dataIsExported, + ) + .toBeDefined(); + }, + ); + + await dialAdminTest.step( + 'Admin approves the request and verifies publication disappears from "Approve required" and displayed under "Organization" section', + async () => { + await adminApproveRequiredConversations.selectFolderEntity( + requestName, + conversation.name, + ); + await baseAssertion.assertElementState(adminChatMessages, 'visible'); + await adminApproveRequiredConversations.expandCollapseFolder( + requestName, + ); + await adminPublishingApprovalModalAssertion.assertReviewButtonTitle( + ExpectedConstants.continueReviewButtonTitle, + ); + await adminPublishingApprovalModal.goToEntityReview({ + isHttpMethodTriggered: false, + }); + await baseAssertion.assertElementState(adminChatMessages, 'visible'); + await adminPublicationReviewControl.backToPublicationRequest(); + await adminPublishingApprovalModal.approveRequest(); + await adminApproveRequiredConversationsAssertion.assertFolderState( + { name: requestName }, + 'hidden', + ); + await adminOrganizationConversationAssertion.assertEntityState( + { name: conversation.name }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Create a conversation with published file', + async () => { + const fileResource = publishApiModels.response.resources.find((r) => + r.targetUrl.includes(Attachment.cloudImageName), + )!; + secondConversation = + conversationData.prepareConversationWithAttachmentsInRequest( + defaultModel, + true, + fileResource.targetUrl, + ); + await dataInjector.createConversations([secondConversation]); + }, + ); + + await dialAdminTest.step( + 'Admin approves the request and verify verifies publication disappears from "Approve required" and displayed under "Organization" section', + async () => { + await dialHomePage.reloadPage(); + await dialHomePage.waitForPageLoaded(); + await organizationConversationAssertion.assertEntityState( + { name: conversation.name }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Select published conversation and verify it contains attachment', + async () => { + await organizationConversations.selectConversation(conversation.name); + await chatMessagesAssertion.assertMessageDownloadUrl( + 1, + ExpectedConstants.publishedAttachmentDownloadPath( + Attachment.cloudImageName, + ), + ); + }, + ); + + await dialAdminTest.step( + 'Verify attachment is displayed under "Organization" section in "Manage attachments" modal', + async () => { + await chatBar.openManageAttachmentsModal(); + await manageAttachmentsAssertion.assertEntityState( + { name: Attachment.cloudImageName }, + FileModalSection.Organization, + 'visible', + ); + await attachFilesModal.closeButton.click(); + }, + ); + + await dialAdminTest.step( + 'Rename initial conversation and verify one more publication request can be submitted', + async () => { + await conversations.openEntityDropdownMenu(conversation.name); + await conversationDropdownMenu.selectMenuOption(MenuOptions.rename); + await renameConversationModal.editInputValue(updatedConversationName); + await renameConversationModal.saveButton.click(); + + await conversations.openEntityDropdownMenu(updatedConversationName); + await conversationDropdownMenu.selectMenuOption(MenuOptions.publish); + await publishingRequestModal.requestName.fillInInput( + GeneratorUtil.randomPublicationRequestName(), + ); + const publishApiModels = + await publishingRequestModal.sendPublicationRequest(); + baseAssertion.assertValue( + publishApiModels.response.resources.filter( + (r) => + r.sourceUrl === + conversation.id.replace( + conversation.name, + updatedConversationName, + ), + ).length, + 1, + ); + baseAssertion.assertValue( + publishApiModels.response.resources.filter( + (r) => r.sourceUrl === imageUrl, + ).length, + 1, + ); + }, + ); + + await dialAdminTest.step( + 'Verify error toast is displayed on attempt to create publication request for conversation with already published file', + async () => { + await conversations.openEntityDropdownMenu(secondConversation.name); + await conversationDropdownMenu.selectMenuOption(MenuOptions.publish); + await publishingRequestModal.requestName.fillInInput( + GeneratorUtil.randomPublicationRequestName(), + ); + await publishingRequestModal.sendRequestButton.click(); + await baseAssertion.assertElementState(toast, 'visible'); + await baseAssertion.assertElementText( + toast, + ExpectedConstants.attachmentPublishErrorMessage, + ); + await baseAssertion.assertElementState( + publishingRequestModal, + 'hidden', + ); + }, + ); + }, +); + +dialAdminTest( + 'Publish chat with plotly', + async ({ + conversationData, + fileApiHelper, + dataInjector, + dialHomePage, + conversations, + conversationDropdownMenu, + baseAssertion, + apiAssertion, + publishingRequestModal, + adminDialHomePage, + adminPublishingApprovalModal, + adminPublicationReviewControl, + adminOrganizationConversations, + adminConversationDropdownMenu, + adminChat, + adminChatMessages, + adminConversationAssertion, + publishFileAssertion, + adminApproveRequiredConversationsAssertion, + adminOrganizationConversationAssertion, + adminPublishingApprovalModalAssertion, + adminApproveRequiredConversations, + adminFilesToApproveAssertion, + setTestIds, + }) => { + setTestIds('EPMRTC-3625'); + let plotlyConversation: Conversation; + let plotlyImageUrl: string; + const requestName = GeneratorUtil.randomPublicationRequestName(); + let publishApiModels: { + request: PublicationRequestModel; + response: Publication; + }; + const chatResponseIndex = 2; + + await dialTest.step( + 'Prepare conversation with plotly graph in the response', + async () => { + plotlyImageUrl = await fileApiHelper.putFile( + Attachment.plotlyName, + API.modelFilePath(defaultModel.id), + ); + plotlyConversation = + conversationData.prepareConversationWithAttachmentInResponse( + plotlyImageUrl, + defaultModel, + ); + await dataInjector.createConversations([plotlyConversation]); + }, + ); + + await dialTest.step( + 'Select "Publish" conversation dropdown menu option and verify publishing modal is opened, plotly is available for publishing', + async () => { + await dialHomePage.openHomePage(); + await dialHomePage.waitForPageLoaded(); + await conversations.selectConversation(plotlyConversation.name); + await conversations.openEntityDropdownMenu(plotlyConversation.name); + await conversationDropdownMenu.selectMenuOption(MenuOptions.publish); + await baseAssertion.assertElementState( + publishingRequestModal, + 'visible', + ); + await publishFileAssertion.assertEntityState( + { name: Attachment.plotlyName }, + 'visible', + ); + }, + ); + + await dialTest.step( + 'Set publication request name and submit the request', + async () => { + await publishingRequestModal.requestName.fillInInput(requestName); + publishApiModels = + await publishingRequestModal.sendPublicationRequest(); + await baseAssertion.assertElementState( + publishingRequestModal, + 'hidden', + ); + publicationsToUnpublish.push(publishApiModels.response); + }, + ); + + await dialAdminTest.step( + 'Login as admin and verify publishing request is displayed under "Approve required" section', + async () => { + await adminDialHomePage.openHomePage(); + await adminDialHomePage.waitForPageLoaded(); + await adminApproveRequiredConversationsAssertion.assertFolderState( + { name: requestName }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Expand request folder and verify "Publication approval" modal is displayed', + async () => { + await adminApproveRequiredConversations.expandApproveRequiredFolder( + requestName, + ); + await adminApproveRequiredConversationsAssertion.assertFolderEntityState( + { name: requestName }, + { name: plotlyConversation.name }, + 'visible', + ); + await adminPublishingApprovalModalAssertion.assertElementState( + adminPublishingApprovalModal, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Verify plotly is displayed under "Files" tree', + async () => { + await adminFilesToApproveAssertion.assertEntityState( + { name: Attachment.plotlyName }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Admin approves the request and verifies publication disappears from "Approve required" and displayed under "Organization" section', + async () => { + await adminPublishingApprovalModal.goToEntityReview({ + isHttpMethodTriggered: false, + }); + await adminPublicationReviewControl.backToPublicationRequest(); + await adminPublishingApprovalModal.approveRequest(); + await adminApproveRequiredConversationsAssertion.assertFolderState( + { name: requestName }, + 'hidden', + ); + await adminOrganizationConversationAssertion.assertEntityState( + { name: plotlyConversation.name }, + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Open published conversation and verify plotly graph is shown on expand attachment', + async () => { + await adminOrganizationConversations.selectConversation( + plotlyConversation.name, + ); + await adminChatMessages + .getChatMessageAttachment(chatResponseIndex, Attachment.plotlyName) + .waitForState({ state: 'visible' }); + const expandAttachmentResponse = + await adminChatMessages.expandChatMessageAttachment( + chatResponseIndex, + Attachment.plotlyName, + ); + baseAssertion.assertValue( + expandAttachmentResponse + ? expandAttachmentResponse.status() + : undefined, + 200, + ExpectedMessages.attachmentIsExpanded, + ); + await baseAssertion.assertElementState( + adminChatMessages.getMessagePlotlyAttachment(chatResponseIndex), + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Duplicate published conversation and verify plotly graph is shown on expand attachment', + async () => { + await adminChat.duplicateConversation(); + await adminConversationAssertion.assertEntityState( + { name: plotlyConversation.name }, + 'visible', + ); + await adminConversationAssertion.assertSelectedConversation( + plotlyConversation.name, + ); + await adminChatMessages + .getChatMessageAttachment(chatResponseIndex, Attachment.plotlyName) + .waitForState({ state: 'visible' }); + await adminChatMessages.expandChatMessageAttachment( + chatResponseIndex, + Attachment.plotlyName, + { isHttpMethodTriggered: false }, + ); + await baseAssertion.assertElementState( + adminChatMessages.getMessagePlotlyAttachment(chatResponseIndex), + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Create playback of published conversation and verify plotly graph is shown on expand attachment', + async () => { + const playbackName = ExpectedConstants.playbackConversation.concat( + plotlyConversation.name, + ); + await adminOrganizationConversations.openEntityDropdownMenu( + plotlyConversation.name, + ); + await adminConversationDropdownMenu.selectMenuOption( + MenuOptions.playback, + ); + await adminConversationAssertion.assertEntityState( + { name: playbackName }, + 'visible', + ); + await adminConversationAssertion.assertSelectedConversation( + playbackName, + ); + for (let i = 1; i <= chatResponseIndex; i++) { + await adminChat.playNextChatMessage(); + } + await adminChatMessages + .getChatMessageAttachment(chatResponseIndex, Attachment.plotlyName) + .waitForState({ state: 'visible' }); + await adminChatMessages.expandChatMessageAttachment( + chatResponseIndex, + Attachment.plotlyName, + { isHttpMethodTriggered: false }, + ); + await baseAssertion.assertElementState( + adminChatMessages.getMessagePlotlyAttachment(chatResponseIndex), + 'visible', + ); + }, + ); + + await dialAdminTest.step( + 'Verify replay conversation can be created based on published one', + async () => { + const replayName = ExpectedConstants.replayConversation.concat( + plotlyConversation.name, + ); + await adminOrganizationConversations.openEntityDropdownMenu( + plotlyConversation.name, + ); + await adminConversationDropdownMenu.selectMenuOption( + MenuOptions.replay, + ); + await adminConversationAssertion.assertEntityState( + { name: replayName }, + 'visible', + ); + await adminConversationAssertion.assertSelectedConversation(replayName); + const replayRequest = await adminChat.startReplay(); + await apiAssertion.assertRequestMessage( + replayRequest.messages[0], + plotlyConversation.messages[0].content, + ); + }, + ); + }, +); + +dialTest.afterAll( + async ({ publicationApiHelper, adminPublicationApiHelper }) => { + for (const publication of publicationsToUnpublish) { + const unpublishResponse = + await publicationApiHelper.createUnpublishRequest(publication); + await adminPublicationApiHelper.approveRequest(unpublishResponse); + } + }, +); diff --git a/apps/chat-e2e/src/tests/publishFolderWithConversation.test.ts b/apps/chat-e2e/src/tests/publishFolderWithConversation.test.ts index 04a7ac5d1c..7999afcaa7 100644 --- a/apps/chat-e2e/src/tests/publishFolderWithConversation.test.ts +++ b/apps/chat-e2e/src/tests/publishFolderWithConversation.test.ts @@ -378,8 +378,11 @@ dialAdminTest( dialAdminTest( 'Published folder became available in Change path form for publish request.\n' + + 'Publish chat: Change path: context menu for existing folders.\n' + 'Publish folder into nested folder structure with depth 4.\n' + - 'Publish folder: update path in publish request', + 'Publish folder: update path in publish request.\n' + + 'Publish request toooltips.\n' + + 'admin view: create publication request when open request from Approve required', async ({ dialHomePage, conversationData, @@ -387,6 +390,7 @@ dialAdminTest( folderConversations, folderDropdownMenu, publishingRequestModal, + folderConversationsToPublish, selectFolders, selectFoldersAssertion, publicationApiHelper, @@ -395,12 +399,18 @@ dialAdminTest( selectFolderModal, toastAssertion, adminDialHomePage, + adminPublishingRequestModal, adminApproveRequiredConversationsAssertion, adminChatHeaderAssertion, adminChatMessagesAssertion, baseAssertion, + tooltipAssertion, adminPublicationReviewControl, + adminDataInjector, adminApproveRequiredConversations, + adminConversations, + adminConversationDropdownMenu, + adminConversationToPublishAssertion, adminPublishingApprovalModalAssertion, adminFolderToApproveAssertion, adminPublishingApprovalModal, @@ -408,9 +418,17 @@ dialAdminTest( adminOrganizationFolderConversationAssertions, setTestIds, }) => { - setTestIds('EPMRTC-3613', 'EPMRTC-3460', 'EPMRTC-3204'); + setTestIds( + 'EPMRTC-3613', + 'EPMRTC-3456', + 'EPMRTC-3460', + 'EPMRTC-3204', + 'EPMRTC-3457', + 'EPMRTC-3943', + ); let publishedFolderConversation: FolderConversation; let folderConversationToPublish: FolderConversation; + let adminConversation: Conversation; const orgFolder = GeneratorUtil.randomString(5); const requestName = GeneratorUtil.randomPublicationRequestName(); const publicationPath = `${PublishPath.Organization}/${orgFolder}`; @@ -423,6 +441,7 @@ dialAdminTest( conversationData.resetData(); folderConversationToPublish = conversationData.prepareDefaultConversationInFolder(); + conversationData.resetData(); await dataInjector.createConversations( [ ...publishedFolderConversation.conversations, @@ -483,11 +502,23 @@ dialAdminTest( ); await dialTest.step( - 'Create max length folder hierarchy and verify error toast is shown on attempt to select low-level folder', + 'Open folder dropdown menu and verify available options', async () => { await selectFolders.openFolderDropdownMenu( publishedFolderConversation.folders.name, ); + const actualOptions = await folderDropdownMenu.getAllMenuOptions(); + baseAssertion.assertArrayIncludesAll( + actualOptions, + [MenuOptions.addNewFolder], + ExpectedMessages.contextMenuOptionsValid, + ); + }, + ); + + await dialTest.step( + 'Create max length folder hierarchy and verify error toast is shown on attempt to select low-level folder', + async () => { await folderDropdownMenu.selectMenuOption(MenuOptions.addNewFolder); await selectFolders.getEditFolderInputActions().clickTickButton(); @@ -529,6 +560,41 @@ dialAdminTest( }, ); + await dialTest.step( + 'Hover over "Publish to" path and verify tooltip is shown', + async () => { + await publishingRequestModal.getChangePublishToPath().path.hoverOver(); + await tooltipAssertion.assertTooltipContent(publicationPath); + }, + ); + + await dialTest.step( + 'Hover over conversation and verify tooltip is shown', + async () => { + await folderConversationsToPublish + .getFolderEntityNameElement( + folderConversationToPublish.folders.name, + folderConversationToPublish.conversations[0].name, + ) + .hoverOver(); + await tooltipAssertion.assertTooltipContent( + folderConversationToPublish.conversations[0].name, + ); + }, + ); + + await dialTest.step( + 'Hover over conversation folder and verify tooltip is shown', + async () => { + await folderConversationsToPublish + .getFolderName(folderConversationToPublish.folders.name) + .hoverOver(); + await tooltipAssertion.assertTooltipContent( + folderConversationToPublish.folders.name, + ); + }, + ); + await dialTest.step( 'Set publication request name and send request', async () => { @@ -539,6 +605,14 @@ dialAdminTest( }, ); + await dialAdminTest.step( + 'Prepare conversation for admin user', + async () => { + adminConversation = conversationData.prepareDefaultConversation(); + await adminDataInjector.createConversations([adminConversation]); + }, + ); + await dialAdminTest.step( 'Login as admin and verify publishing request is displayed under "Approve required" section', async () => { @@ -586,6 +660,25 @@ dialAdminTest( }, ); + await dialAdminTest.step( + `Create publication request for today's chat and verify request modal with conversation details is displayed`, + async () => { + await adminConversations.openEntityDropdownMenu(adminConversation.name); + await adminConversationDropdownMenu.selectMenuOption( + MenuOptions.publish, + ); + await baseAssertion.assertElementState( + adminPublishingRequestModal, + 'visible', + ); + await adminConversationToPublishAssertion.assertEntityState( + { name: adminConversation.name }, + 'visible', + ); + await adminPublishingRequestModal.cancelButton.click(); + }, + ); + await dialAdminTest.step( 'Admin clicks on "Go to a review" button and verify the folder conversation is opened, navigation buttons are disabled', async () => { diff --git a/apps/chat-e2e/src/tests/shareConversationWithContent.test.ts b/apps/chat-e2e/src/tests/shareConversationWithContent.test.ts index b01362e029..68b0ee5b9c 100644 --- a/apps/chat-e2e/src/tests/shareConversationWithContent.test.ts +++ b/apps/chat-e2e/src/tests/shareConversationWithContent.test.ts @@ -1,10 +1,12 @@ import { Conversation } from '@/chat/types/chat'; import { DialAIEntityModel } from '@/chat/types/models'; +import dialAdminTest from '@/src/core/dialAdminFixtures'; import dialTest from '@/src/core/dialFixtures'; import dialSharedWithMeTest from '@/src/core/dialSharedWithMeFixtures'; import { API, Attachment, + ExpectedConstants, ExpectedMessages, FolderConversation, MenuOptions, @@ -28,7 +30,8 @@ dialTest.beforeAll(async () => { dialSharedWithMeTest( 'Share with me. Chats with different context.\n' + - 'Shared chat history is updated in Shared with me if to generate new picture', + 'Shared chat history is updated in Shared with me if to generate new picture.\n' + + 'Publish chat with file, file is from "Shared with me" section', async ({ conversationData, fileApiHelper, @@ -37,15 +40,22 @@ dialSharedWithMeTest( additionalUserShareApiHelper, additionalShareUserDialHomePage, additionalShareUserChatMessages, + additionalShareUserConversations, + additionalShareUserConversationDropdownMenu, + additionalShareUserPublishingRequestModal, + additionalShareUserToast, additionalShareUserSharedWithMeConversations, additionalShareUserRequestContext, + additionalShareUserDataInjector, + baseAssertion, setTestIds, }) => { - setTestIds('EPMRTC-1933', 'EPMRTC-2896'); + setTestIds('EPMRTC-1933', 'EPMRTC-2896', 'EPMRTC-4705'); let responseImageConversation: Conversation; let requestImageConversation: Conversation; let stageConversation: Conversation; let codeConversation: Conversation; + let conversationWithSharedFile: Conversation; let sharedConversations: Conversation[]; let responseImageUrl: string; @@ -115,6 +125,23 @@ dialSharedWithMeTest( }, ); + await dialAdminTest.step( + 'Create a conversation with shared file', + async () => { + conversationWithSharedFile = + conversationData.prepareConversationWithAttachmentsInRequest( + defaultModel, + true, + responseImageUrl, + ); + conversationWithSharedFile.messages[0].custom_content!.attachments = + responseImageConversation.messages[1].custom_content!.attachments; + await additionalShareUserDataInjector.createConversations([ + conversationWithSharedFile, + ]); + }, + ); + await dialSharedWithMeTest.step( 'Open shared conversations one by one and verify attachments, stages and code style are displayed correctly', async () => { @@ -210,6 +237,34 @@ dialSharedWithMeTest( }, ); + await dialAdminTest.step( + 'Verify error toast is displayed on attempt to create publication request for conversation with shared file', + async () => { + await additionalShareUserConversations.openEntityDropdownMenu( + conversationWithSharedFile.name, + ); + await additionalShareUserConversationDropdownMenu.selectMenuOption( + MenuOptions.publish, + ); + await additionalShareUserPublishingRequestModal.requestName.fillInInput( + GeneratorUtil.randomPublicationRequestName(), + ); + await additionalShareUserPublishingRequestModal.sendRequestButton.click(); + await baseAssertion.assertElementState( + additionalShareUserToast, + 'visible', + ); + await baseAssertion.assertElementText( + additionalShareUserToast, + ExpectedConstants.attachmentPublishErrorMessage, + ); + await baseAssertion.assertElementState( + additionalShareUserPublishingRequestModal, + 'hidden', + ); + }, + ); + //TODO: uncomment when issue https://github.com/epam/ai-dial-chat/issues/1111 is fixed // await dialSharedWithMeTest.step( // 'Add one more attachment to conversation with images in the response', diff --git a/apps/chat-e2e/src/ui/webElements/chat.ts b/apps/chat-e2e/src/ui/webElements/chat.ts index d94a7cd96d..d8b2732c61 100644 --- a/apps/chat-e2e/src/ui/webElements/chat.ts +++ b/apps/chat-e2e/src/ui/webElements/chat.ts @@ -291,7 +291,7 @@ export class Chat extends BaseElement { await this.getPlaybackControl().playbackPreviousButton.click(); } - public async duplicateSharedConversation() { + public async duplicateConversation() { const respPromise = this.page.waitForResponse( (resp) => resp.request().method() === 'POST', ); diff --git a/apps/chat-e2e/src/ui/webElements/chatMessages.ts b/apps/chat-e2e/src/ui/webElements/chatMessages.ts index 9803c68a80..175154929d 100644 --- a/apps/chat-e2e/src/ui/webElements/chatMessages.ts +++ b/apps/chat-e2e/src/ui/webElements/chatMessages.ts @@ -187,6 +187,7 @@ export class ChatMessages extends BaseElement { public async expandChatMessageAttachment( message: string | number, attachmentTitle: string, + { isHttpMethodTriggered = true }: { isHttpMethodTriggered?: boolean } = {}, ) { const isCollapsed = await this.getCollapsedChatMessageAttachment(message).isVisible(); @@ -195,7 +196,7 @@ export class ChatMessages extends BaseElement { message, attachmentTitle, ); - if (isApiStorageType) { + if (isApiStorageType && isHttpMethodTriggered) { const respPromise = this.page.waitForResponse( (resp) => resp.request().method() === 'GET' && diff --git a/apps/chat-e2e/src/ui/webElements/entityTree/publishFilesTree.ts b/apps/chat-e2e/src/ui/webElements/entityTree/publishFilesTree.ts index c59bff9a49..b943fe1f2b 100644 --- a/apps/chat-e2e/src/ui/webElements/entityTree/publishFilesTree.ts +++ b/apps/chat-e2e/src/ui/webElements/entityTree/publishFilesTree.ts @@ -1,7 +1,15 @@ +import { Attributes } from '@/src/ui/domData'; import { FileSelectors } from '@/src/ui/selectors'; import { EntitiesTree } from '@/src/ui/webElements/entityTree'; export class PublishFilesTree extends EntitiesTree { public getFileDownloadIcon = (filename: string) => this.getEntityByName(filename).locator(`~${FileSelectors.downloadIcon}`); + + public async getFileDownloadIUrl(filename: string) { + const link = await this.getFileDownloadIcon(filename).getAttribute( + Attributes.href, + ); + return link !== null ? link : ''; + } } From 9fe2fe68d67b88ed07cf8595cdf8ecec5d20b122 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 20 Jan 2025 12:35:44 +0100 Subject: [PATCH 22/44] feat/overlay-settings-tests: fixed review comments --- apps/chat-e2e/src/core/dialOverlayFixtures.ts | 9 ++++++ apps/chat-e2e/src/tests/isolatedView.test.ts | 6 ++-- .../tests/overlay/chatSettingsFeature.test.ts | 4 ++- .../src/tests/overlay/headerFeature.test.ts | 30 ++++++++++++------- .../tests/overlay/marketplaceFeature.test.ts | 6 ++-- .../src/tests/overlay/modelIdFeature.test.ts | 19 +----------- .../overlayConversationIdFeature.test.ts | 1 + .../tests/overlay/topSettingsFeature.test.ts | 1 - .../chat-e2e/src/ui/webElements/chatHeader.ts | 6 ++-- apps/chat-e2e/src/ui/webElements/toast.ts | 6 ++-- .../disabled-all-features-sandbox/page.tsx | 8 +---- 11 files changed, 48 insertions(+), 48 deletions(-) diff --git a/apps/chat-e2e/src/core/dialOverlayFixtures.ts b/apps/chat-e2e/src/core/dialOverlayFixtures.ts index 3aa03bb132..d17d4c3928 100644 --- a/apps/chat-e2e/src/core/dialOverlayFixtures.ts +++ b/apps/chat-e2e/src/core/dialOverlayFixtures.ts @@ -15,6 +15,7 @@ import { PublishingRequestModal, SendMessage, TalkToAgentDialog, + Toast, } from '../ui/webElements'; import config from '@/config/overlay.playwright.config'; @@ -94,6 +95,7 @@ const dialOverlayTest = test.extend<{ overlaySettingsModal: SettingsModal; overlayConfirmationDialog: ConfirmationDialog; overlayModelInfoTooltip: ModelInfoTooltip; + overlayToast: Toast; overlayRequestApiKeyModal: RequestApiKeyModal; overlayReportAnIssueModal: ReportAnIssueModal; overlayAttachFilesModal: AttachFilesModal; @@ -290,6 +292,13 @@ const dialOverlayTest = test.extend<{ ); await use(overlayModelInfoTooltip); }, + overlayToast: async ({ page, overlayHomePage }, use) => { + const overlayToast = new Toast( + page, + overlayHomePage.getOverlayContainer().getElementLocator(), + ); + await use(overlayToast); + }, overlayRequestApiKeyModal: async ({ page, overlayHomePage }, use) => { const overlayRequestApiKeyModal = new RequestApiKeyModal( page, diff --git a/apps/chat-e2e/src/tests/isolatedView.test.ts b/apps/chat-e2e/src/tests/isolatedView.test.ts index 93f14cc568..c24c7e767d 100644 --- a/apps/chat-e2e/src/tests/isolatedView.test.ts +++ b/apps/chat-e2e/src/tests/isolatedView.test.ts @@ -77,7 +77,7 @@ dialTest( await chat.sendRequestWithButton(request); await chatBar.waitForState({ state: 'hidden' }); await promptBar.waitForState({ state: 'hidden' }); - await chatHeader.openConversationSettings.waitForState({ + await chatHeader.conversationSettings.waitForState({ state: 'visible', }); }, @@ -303,7 +303,7 @@ dialTest( await dialTest.step( 'Click on the Settings icon after sending the request', async () => { - await chatHeader.openConversationSettings.click(); + await chatHeader.conversationSettings.click(); await baseAssertion.assertElementState( conversationSettingsModal.getElementLocator(), 'visible', @@ -316,7 +316,7 @@ dialTest( await dialTest.step( 'Hover over the Setting icon and check the wording on the tooltip', async () => { - await chatHeader.openConversationSettings.hoverOver(); + await chatHeader.conversationSettings.hoverOver(); const tooltipContent = await tooltip.getContent(); expect .soft(tooltipContent, ExpectedMessages.tooltipContentIsValid) diff --git a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts index 485f8fba20..ae1fe8f823 100644 --- a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts @@ -33,6 +33,7 @@ dialOverlayTest( overlayConfirmationDialog, overlayConversations, overlayConversationSettingsModal, + overlayToast, overlayFileApiHelper, setTestIds, }) => { @@ -68,6 +69,7 @@ dialOverlayTest( attachmentConversation.name, ); await overlayChat.addModelToWorkspace(); + await overlayToast.closeToast(); await overlayBaseAssertion.assertElementState( overlaySendMessage.attachmentMenuTrigger, 'hidden', @@ -79,7 +81,7 @@ dialOverlayTest( 'Verify gear icon is not available in the header', async () => { await overlayBaseAssertion.assertElementState( - overlayChatHeader.openConversationSettings, + overlayChatHeader.conversationSettings, 'hidden', ); }, diff --git a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts index 2ccab84ac4..30d672f793 100644 --- a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts @@ -3,15 +3,17 @@ import { Prompt } from '@/chat/types/prompt'; import dialTest from '@/src/core/dialFixtures'; import dialOverlayTest from '@/src/core/dialOverlayFixtures'; import { + API, ExpectedConstants, + ExpectedMessages, MenuOptions, MockedChatApiResponseBodies, Theme, } from '@/src/testData'; import { OverlaySandboxUrls } from '@/src/testData/overlay/overlaySandboxUrls'; import { keys } from '@/src/ui/keyboard'; -import { GeneratorUtil } from '@/src/utils'; -import { Locator } from '@playwright/test'; +import { GeneratorUtil, ItemUtil, ModelsUtil } from '@/src/utils'; +import { Locator, expect } from '@playwright/test'; dialOverlayTest( '[Overlay] Defaults set in the code: theme.\n' + @@ -388,6 +390,7 @@ dialOverlayTest( overlayHeader, overlayAccountSettings, overlayBaseAssertion, + overlayItemApiHelper, overlayProfilePanel, overlayConfirmationDialog, overlaySettingsModal, @@ -401,6 +404,7 @@ dialOverlayTest( await overlayHomePage.navigateToUrl( OverlaySandboxUrls.enabledOnlyHeaderSandboxUrl, ); + await overlayHomePage.waitForPageLoaded(); await overlayBaseAssertion.assertElementState( overlayHeader.newEntityButton, 'visible', @@ -423,12 +427,23 @@ dialOverlayTest( MockedChatApiResponseBodies.simpleTextBody, { isOverlay: true }, ); - await overlayChat.sendRequestWithButton(GeneratorUtil.randomString(5)); + const requestContent = GeneratorUtil.randomString(5); + await overlayChat.sendRequestWithButton(requestContent); await overlayHeader.createNewConversation(); await overlayBaseAssertion.assertElementState( overlayAgentInfo, 'visible', ); + const allConversations = await overlayItemApiHelper.listItems( + API.conversationsHost(), + ); + const conversationWithContent = `${ModelsUtil.getDefaultModel()!.id}${ItemUtil.conversationIdSeparator}${requestContent}`; + expect + .soft( + allConversations.find((c) => c.name === conversationWithContent), + ExpectedMessages.conversationIsVisible, + ) + .toBeDefined(); }, ); @@ -532,7 +547,6 @@ dialOverlayTest( '[Overlay] Display Report an issue modal - Feature.ReportAnIssue', async ({ overlayHomePage, - page, overlayRequestApiKeyModal, overlayAccountSettings, overlayBaseAssertion, @@ -548,6 +562,7 @@ dialOverlayTest( await overlayHomePage.navigateToUrl( OverlaySandboxUrls.enabledOnlyHeaderFooterSandboxUrl, ); + await overlayHomePage.waitForPageLoaded(); await overlayAccountSettings.click(); await overlayProfilePanel .getFooter() @@ -556,18 +571,13 @@ dialOverlayTest( overlayRequestApiKeyModal, 'hidden', ); - //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 - for (let i = 1; i <= 2; i++) { - await page.keyboard.press(keys.escape); - } }, ); - await dialTest.step('Verify new issue0 cannot be reported', async () => { + await dialTest.step('Verify new issue cannot be reported', async () => { await overlayProfilePanel .getFooter() .openFooterLink(ExpectedConstants.reportAnIssueLink); - //TODO: remove when fixed https://github.com/epam/ai-dial-chat/issues/2878 await overlayBaseAssertion.assertElementState( overlayReportAnIssueModal, 'hidden', diff --git a/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts b/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts index f55ca88633..27a76b6507 100644 --- a/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/marketplaceFeature.test.ts @@ -31,11 +31,12 @@ dialOverlayTest( }); await dialTest.step( - 'Verify "Dial Marketplace" button is available on the right side panel', + 'Verify "Dial Marketplace" button is available on the left side panel', async () => { await overlayHomePage.navigateToUrl( OverlaySandboxUrls.enableMarketplaceUrl, ); + await overlayHomePage.waitForPageLoaded(); await overlayHeader.leftPanelToggle.click(); await overlayBaseAssertion.assertElementState( overlayChatBar.dialMarketplaceLink, @@ -118,6 +119,7 @@ dialOverlayTest( await overlayHomePage.navigateToUrl( OverlaySandboxUrls.disableMarketplaceUrl, ); + await overlayHomePage.waitForPageLoaded(); await overlayHeader.leftPanelToggle.click(); await overlayBaseAssertion.assertElementState( overlayChatBar.dialMarketplaceLink, @@ -140,7 +142,7 @@ dialOverlayTest( ); await dialTest.step( - 'Select created conversation, click on model icon in the header and verify there is "Search" field available', + 'Select created conversation, click on model icon in the header and verify there is no "Go to My workspace" button', async () => { await overlayHeader.leftPanelToggle.click(); await overlayConversations.selectConversation(conversation.name); diff --git a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts index 99a5ff3f3f..6c19fea898 100644 --- a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts @@ -119,7 +119,7 @@ dialOverlayTest( 'visible', ); await overlayBaseAssertion.assertElementState( - overlayChatHeader.openConversationSettings, + overlayChatHeader.conversationSettings, 'visible', ); await overlayBaseAssertion.assertElementState( @@ -137,23 +137,6 @@ dialOverlayTest( overlayModelInfoTooltip.title, ExpectedConstants.modelInfoTooltipChangeTitle, ); - - await overlayBaseAssertion.assertElementState( - overlayChatHeader.chatTitle, - 'visible', - ); - await overlayBaseAssertion.assertElementState( - overlayChatHeader.chatModelIcon, - 'visible', - ); - await overlayBaseAssertion.assertElementState( - overlayChatHeader.openConversationSettings, - 'visible', - ); - await overlayBaseAssertion.assertElementState( - overlayChatHeader.clearConversation, - 'visible', - ); }, ); diff --git a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts index 5771e30d27..b173e07cf4 100644 --- a/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/overlayConversationIdFeature.test.ts @@ -91,6 +91,7 @@ dialOverlayTest( await overlayHomePage.navigateToUrl( OverlaySandboxUrls.overlayConversationIdSetUrl, ); + await overlayHomePage.waitForPageLoaded(); await overlayBaseAssertion.assertElementState( overlayPlaybackControl, 'visible', diff --git a/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts index 2afe1b9277..b3f3272dd6 100644 --- a/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/topSettingsFeature.test.ts @@ -92,7 +92,6 @@ dialOverlayTest( await dialTest.step( 'Hover over model icon and verify tooltip content', async () => { - await overlayChatHeader.chatModelIcon.hoverOver(); await overlayBaseAssertion.assertElementText( overlayModelInfoTooltip.title, ExpectedConstants.modelInfoTooltipTitle, diff --git a/apps/chat-e2e/src/ui/webElements/chatHeader.ts b/apps/chat-e2e/src/ui/webElements/chatHeader.ts index b03c14d854..0bca8a89f0 100644 --- a/apps/chat-e2e/src/ui/webElements/chatHeader.ts +++ b/apps/chat-e2e/src/ui/webElements/chatHeader.ts @@ -34,7 +34,7 @@ export class ChatHeader extends BaseElement { public deleteConversationFromComparison = this.getChildElementBySelector( ChatHeaderSelectors.deleteFromCompareIcon, ); - public openConversationSettings = this.getChildElementBySelector( + public conversationSettings = this.getChildElementBySelector( ChatHeaderSelectors.conversationSettingsIcon, ); public clearConversation = this.getChildElementBySelector( @@ -63,7 +63,7 @@ export class ChatHeader extends BaseElement { async openConversationSettingsPopup() { const modelsResponsePromise = this.page.waitForResponse(API.modelsHost); const addonsResponsePromise = this.page.waitForResponse(API.addonsHost); - await this.openConversationSettings.click(); + await this.conversationSettings.click(); await modelsResponsePromise; await addonsResponsePromise; } @@ -73,6 +73,6 @@ export class ChatHeader extends BaseElement { } public async hoverOverChatSettings() { - await this.openConversationSettings.hoverOver(); + await this.conversationSettings.hoverOver(); } } diff --git a/apps/chat-e2e/src/ui/webElements/toast.ts b/apps/chat-e2e/src/ui/webElements/toast.ts index c139356a65..0505827a39 100644 --- a/apps/chat-e2e/src/ui/webElements/toast.ts +++ b/apps/chat-e2e/src/ui/webElements/toast.ts @@ -1,11 +1,11 @@ import { Tags } from '@/src/ui/domData'; import { ToastSelectors } from '@/src/ui/selectors'; import { BaseElement } from '@/src/ui/webElements/baseElement'; -import { Page } from '@playwright/test'; +import { Locator, Page } from '@playwright/test'; export class Toast extends BaseElement { - constructor(page: Page) { - super(page, ToastSelectors.toast); + constructor(page: Page, parentLocator?: Locator) { + super(page, ToastSelectors.toast, parentLocator); } public closeButton = this.getChildElementBySelector(Tags.button); diff --git a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx index 3da2475712..7634153f5a 100644 --- a/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx +++ b/apps/overlay-sandbox/app/cases/overlay/disabled-all-features-sandbox/page.tsx @@ -5,15 +5,9 @@ import { commonOverlayProps, } from '../../components/chatOverlayWrapper'; -import { Feature } from '@epam/ai-dial-shared'; - const overlayOptions = { ...commonOverlayProps, - enabledFeatures: [ - Feature.TopClearConversation, - Feature.TopChatInfo, - Feature.TopChatModelSettings, - ], + enabledFeatures: [], }; export default function Index() { From fb2ad04218920a626b990b9acd9074ec912ef1ac Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 20 Jan 2025 17:49:02 +0100 Subject: [PATCH 23/44] feat/overlay-settings-tests: renamed sandbox --- apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts | 4 ++-- apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts | 2 +- .../page.tsx | 0 apps/overlay-sandbox/app/page.tsx | 6 ++---- 4 files changed, 5 insertions(+), 7 deletions(-) rename apps/overlay-sandbox/app/cases/overlay/{enabled-only-empty-chat-settings-sandbox => enabled-empty-chat-settings-sandbox}/page.tsx (100%) diff --git a/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts b/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts index e943be679b..bb72fda967 100644 --- a/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts +++ b/apps/chat-e2e/src/testData/overlay/overlaySandboxUrls.ts @@ -15,8 +15,8 @@ export const OverlaySandboxUrls = { '/cases/overlay/enabled-disallow-change-agent-sandbox', //sandbox to test 'EPMRTC-4872' enableHideTopContextMenuUrl: '/cases/overlay/enabled-hide-top-context-menu-sandbox', //sandbox to test 'EPMRTC-4873' - enableOnlyEmptyChatSettingsOverlayUrl: - '/cases/overlay/enabled-only-empty-chat-settings-sandbox', //sandbox to test 'EPMRTC-3773', 'EPMRTC-3765' + enableEmptyChatSettingsOverlayUrl: + '/cases/overlay/enabled-empty-chat-settings-sandbox', //sandbox to test 'EPMRTC-3773', 'EPMRTC-3765' enableInputFilesUrl: '/cases/overlay/enabled-input-files-sandbox', //sandbox to test 'EPMRTC-3773' enableHideEmptyChangeAgentUrl: '/cases/overlay/enabled-hide-empty-change-agent-sandbox', //sandbox to test 'EPMRTC-4868' diff --git a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts index ae1fe8f823..9c1e1d8a53 100644 --- a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts @@ -61,7 +61,7 @@ dialOverlayTest( 'Open conversation with attachment and verify clip icon is not available in the Send field', async () => { await overlayHomePage.navigateToUrl( - OverlaySandboxUrls.enableOnlyEmptyChatSettingsOverlayUrl, + OverlaySandboxUrls.enableEmptyChatSettingsOverlayUrl, ); await overlayHomePage.waitForPageLoaded(); await overlayHeader.leftPanelToggle.click(); diff --git a/apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx b/apps/overlay-sandbox/app/cases/overlay/enabled-empty-chat-settings-sandbox/page.tsx similarity index 100% rename from apps/overlay-sandbox/app/cases/overlay/enabled-only-empty-chat-settings-sandbox/page.tsx rename to apps/overlay-sandbox/app/cases/overlay/enabled-empty-chat-settings-sandbox/page.tsx diff --git a/apps/overlay-sandbox/app/page.tsx b/apps/overlay-sandbox/app/page.tsx index ed80eef113..18e7401896 100644 --- a/apps/overlay-sandbox/app/page.tsx +++ b/apps/overlay-sandbox/app/page.tsx @@ -66,10 +66,8 @@ export default async function Index() { - - enableOnlyEmptyChatSettingsOverlay + + enableEmptyChatSettingsOverlay From ede9832053babad2468dd1810a75336c165d9ef7 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 21 Jan 2025 10:37:27 +0100 Subject: [PATCH 24/44] feat/publish-file-tests: fixed import --- apps/chat-e2e/src/assertions/sendMessageAssertion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/chat-e2e/src/assertions/sendMessageAssertion.ts b/apps/chat-e2e/src/assertions/sendMessageAssertion.ts index 6ddf6556b2..d6a3d8dd3e 100644 --- a/apps/chat-e2e/src/assertions/sendMessageAssertion.ts +++ b/apps/chat-e2e/src/assertions/sendMessageAssertion.ts @@ -1,4 +1,4 @@ -import { BaseAssertion } from '@/src/assertions/baseAssertion'; +import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ElementActionabilityState, ElementState, From 3aabf9b5fde5a6a0fbc123d61bc7dd61b2cab8ea Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 21 Jan 2025 11:23:46 +0100 Subject: [PATCH 25/44] feat/publish-file-tests: marked tests as slow --- .../chat-e2e/src/tests/publishConversationWithAttachment.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts index 424eecf627..51c32f4fd4 100644 --- a/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts @@ -413,6 +413,7 @@ dialAdminTest( adminFilesToApproveAssertion, setTestIds, }) => { + dialAdminTest.slow(); setTestIds('EPMRTC-3625'); let plotlyConversation: Conversation; let plotlyImageUrl: string; From 9bcf2ed234586f1f3d2fee999ef66fa9daa02566 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Tue, 21 Jan 2025 18:06:57 +0100 Subject: [PATCH 26/44] feat/publish-file-tests: fixed admin bucket for overlay --- apps/chat-e2e/src/testData/api/baseApiHelper.ts | 9 --------- apps/chat-e2e/src/utils/bucketUtil.ts | 7 +++++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/apps/chat-e2e/src/testData/api/baseApiHelper.ts b/apps/chat-e2e/src/testData/api/baseApiHelper.ts index e108e9b6a9..91ec20b92e 100644 --- a/apps/chat-e2e/src/testData/api/baseApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/baseApiHelper.ts @@ -18,13 +18,4 @@ export class BaseApiHelper { } return endpoint; } - - //function to override the API host if overlay sandbox is running - public getHost(endpoint: string) { - const baseUrl = config.use!.baseURL; - if (baseUrl === overlayHost) { - endpoint = process.env.NEXT_PUBLIC_OVERLAY_HOST + endpoint; - } - return endpoint; - } } diff --git a/apps/chat-e2e/src/utils/bucketUtil.ts b/apps/chat-e2e/src/utils/bucketUtil.ts index d04dd71810..f72731ffc2 100644 --- a/apps/chat-e2e/src/utils/bucketUtil.ts +++ b/apps/chat-e2e/src/utils/bucketUtil.ts @@ -1,4 +1,4 @@ -import config from '@/config/chat.playwright.config'; +import config, { overlayHost } from '@/config/chat.playwright.config'; export class BucketUtil { public static getBucket(index?: number) { @@ -22,6 +22,9 @@ export class BucketUtil { } public static getAdminUserBucket() { - return BucketUtil.getBucket(+config.workers! * 3); + const baseUrl = config.use!.baseURL; + const index = + baseUrl === overlayHost ? +config.workers! : +config.workers! * 3; + return BucketUtil.getBucket(index); } } From 0260b0c26748fbba82ac35d96fe545caaa1c0b12 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Wed, 22 Jan 2025 09:59:34 +0100 Subject: [PATCH 27/44] feat/publish-file-tests: debug changes --- apps/chat-e2e/project.json | 5 +---- .../src/tests/overlay/headerFeature.test.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/chat-e2e/project.json b/apps/chat-e2e/project.json index 548d39db20..c45510853f 100644 --- a/apps/chat-e2e/project.json +++ b/apps/chat-e2e/project.json @@ -48,10 +48,7 @@ "executor": "nx:run-commands", "configurations": { "development": { - "commands": [ - "nx run chat-e2e:e2e:chat", - "nx run chat-e2e:e2e:overlay" - ], + "commands": ["nx run chat-e2e:e2e:overlay"], "parallel": false }, "production": { diff --git a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts index 30d672f793..8f89a007f6 100644 --- a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts @@ -394,6 +394,8 @@ dialOverlayTest( overlayProfilePanel, overlayConfirmationDialog, overlaySettingsModal, + localStorageManager, + overlayFileApiHelper, setTestIds, }) => { setTestIds('EPMRTC-3766', 'EPMRTC-3767', 'EPMRTC-3778'); @@ -423,6 +425,18 @@ dialOverlayTest( await dialTest.step( 'Verify new conversation is create on click "Plus" button', async () => { + console.log( + 'RECENT MODELS: ', + await localStorageManager.getRecentModelsIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ), + ); + const installedDeploymentsResponse = await overlayFileApiHelper.getFile( + API.installedDeploymentsHost(), + ); + const installedDeployments = + (await installedDeploymentsResponse.json()) as { id: string }[]; + console.log('INSTALLED Deployments: ', installedDeployments); await overlayHomePage.mockChatTextResponse( MockedChatApiResponseBodies.simpleTextBody, { isOverlay: true }, From 7551148f5f88e12d84b9cb0b937a8265cb30f868 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Wed, 22 Jan 2025 10:37:05 +0100 Subject: [PATCH 28/44] feat/publish-file-tests: debug changes --- apps/chat-e2e/project.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/chat-e2e/project.json b/apps/chat-e2e/project.json index c45510853f..6795086904 100644 --- a/apps/chat-e2e/project.json +++ b/apps/chat-e2e/project.json @@ -48,12 +48,14 @@ "executor": "nx:run-commands", "configurations": { "development": { - "commands": ["nx run chat-e2e:e2e:overlay"], + "commands": [ + "nx run chat-e2e:e2e:chat", + "nx run chat-e2e:e2e:overlay" + ], "parallel": false }, "production": { "commands": [ - "nx run chat-e2e:e2e:chat --configuration=production", "nx run chat-e2e:e2e:overlay --configuration=production --output-style=static" ], "parallel": false From 4c0a1c44075501f6ebc23efe88b6f46e9f5c9199 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Wed, 22 Jan 2025 11:10:16 +0100 Subject: [PATCH 29/44] feat/publish-file-tests: debug changes --- apps/chat-e2e/src/core/localStorageManager.ts | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/chat-e2e/src/core/localStorageManager.ts b/apps/chat-e2e/src/core/localStorageManager.ts index a8b10cf99c..5593e6e581 100644 --- a/apps/chat-e2e/src/core/localStorageManager.ts +++ b/apps/chat-e2e/src/core/localStorageManager.ts @@ -170,7 +170,20 @@ export class LocalStorageManager { } async getSelectedConversationIds(originHost?: string) { - let selectedConversationIds; + const selectedConversationIds = await this.getKey( + 'selectedConversationIds', + originHost, + ); + return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; + } + + async getRecentModelsIds(originHost?: string) { + const recentModelsIds = await this.getKey('recentModelsIds', originHost); + return recentModelsIds ? JSON.parse(recentModelsIds) : ''; + } + + private async getKey(key: string, originHost?: string) { + let value; const storage = await this.page.context().storageState(); let origin; if (originHost) { @@ -179,10 +192,8 @@ export class LocalStorageManager { origin = storage.origins[0]; } if (origin) { - selectedConversationIds = origin.localStorage.find( - (s) => s.name === 'selectedConversationIds', - )?.value; + value = origin.localStorage.find((s) => s.name === key)?.value; } - return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; + return value; } } From 003a789f3c9f9bb0178447f93babda2c9b9b0062 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Wed, 22 Jan 2025 13:23:05 +0100 Subject: [PATCH 30/44] feat/publish-file-tests: reverted debug changes; fixed flaky test --- apps/chat-e2e/project.json | 1 + apps/chat-e2e/src/core/localStorageManager.ts | 21 +++--------- .../src/tests/overlay/headerFeature.test.ts | 14 -------- .../publishConversationToOrganisation.test.ts | 33 ++++++++++++------- 4 files changed, 27 insertions(+), 42 deletions(-) diff --git a/apps/chat-e2e/project.json b/apps/chat-e2e/project.json index 6795086904..548d39db20 100644 --- a/apps/chat-e2e/project.json +++ b/apps/chat-e2e/project.json @@ -56,6 +56,7 @@ }, "production": { "commands": [ + "nx run chat-e2e:e2e:chat --configuration=production", "nx run chat-e2e:e2e:overlay --configuration=production --output-style=static" ], "parallel": false diff --git a/apps/chat-e2e/src/core/localStorageManager.ts b/apps/chat-e2e/src/core/localStorageManager.ts index 5593e6e581..a8b10cf99c 100644 --- a/apps/chat-e2e/src/core/localStorageManager.ts +++ b/apps/chat-e2e/src/core/localStorageManager.ts @@ -170,20 +170,7 @@ export class LocalStorageManager { } async getSelectedConversationIds(originHost?: string) { - const selectedConversationIds = await this.getKey( - 'selectedConversationIds', - originHost, - ); - return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; - } - - async getRecentModelsIds(originHost?: string) { - const recentModelsIds = await this.getKey('recentModelsIds', originHost); - return recentModelsIds ? JSON.parse(recentModelsIds) : ''; - } - - private async getKey(key: string, originHost?: string) { - let value; + let selectedConversationIds; const storage = await this.page.context().storageState(); let origin; if (originHost) { @@ -192,8 +179,10 @@ export class LocalStorageManager { origin = storage.origins[0]; } if (origin) { - value = origin.localStorage.find((s) => s.name === key)?.value; + selectedConversationIds = origin.localStorage.find( + (s) => s.name === 'selectedConversationIds', + )?.value; } - return value; + return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; } } diff --git a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts index 8f89a007f6..30d672f793 100644 --- a/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/headerFeature.test.ts @@ -394,8 +394,6 @@ dialOverlayTest( overlayProfilePanel, overlayConfirmationDialog, overlaySettingsModal, - localStorageManager, - overlayFileApiHelper, setTestIds, }) => { setTestIds('EPMRTC-3766', 'EPMRTC-3767', 'EPMRTC-3778'); @@ -425,18 +423,6 @@ dialOverlayTest( await dialTest.step( 'Verify new conversation is create on click "Plus" button', async () => { - console.log( - 'RECENT MODELS: ', - await localStorageManager.getRecentModelsIds( - process.env.NEXT_PUBLIC_OVERLAY_HOST, - ), - ); - const installedDeploymentsResponse = await overlayFileApiHelper.getFile( - API.installedDeploymentsHost(), - ); - const installedDeployments = - (await installedDeploymentsResponse.json()) as { id: string }[]; - console.log('INSTALLED Deployments: ', installedDeployments); await overlayHomePage.mockChatTextResponse( MockedChatApiResponseBodies.simpleTextBody, { isOverlay: true }, diff --git a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts index ee43c31fed..7163c84427 100644 --- a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts @@ -391,18 +391,27 @@ dialAdminTest( true, ); - for (let i = 1; i <= maxNestedLevel - 2; i++) { - //TODO:remove the clause when fixed https://github.com/epam/ai-dial-chat/issues/2294 - if (i === maxNestedLevel - 2) { - await selectFolders.getEditFolderInputActions().clickTickButton(); - } - await selectFolderModal.selectFolder(defaultFolderName, i); - await selectFoldersAssertion.assertFolderSelectedState( - { name: defaultFolderName, index: i }, - true, - ); - await selectFolders.expandFolder(defaultFolderName, undefined, i); - } + await selectFolders + .getNestedFolder(cutNewFolderName, defaultFolderName) + .click(); + await selectFoldersAssertion.assertFolderSelectedState( + { name: defaultFolderName, index: 1 }, + true, + ); + //TODO: remove next line when fixed https://github.com/epam/ai-dial-chat/issues/2294 + await selectFolders.editFolderNameWithTick( + GeneratorUtil.randomString(5), + { + isHttpMethodTriggered: false, + }, + ); + await selectFolders + .getNestedFolder(defaultFolderName, defaultFolderName) + .click(); + await selectFoldersAssertion.assertFolderSelectedState( + { name: defaultFolderName, index: 2 }, + true, + ); }, ); From 8f7ea5f02cb7d778a0e2ce88f2eb4ba848d198af Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Thu, 23 Jan 2025 17:03:52 +0100 Subject: [PATCH 31/44] feat/overlay-events-tests: implemented tests for overlay events --- .../src/assertions/agentInfoAssertion.ts | 5 +- apps/chat-e2e/src/core/dialOverlayFixtures.ts | 78 +++- apps/chat-e2e/src/core/localStorageManager.ts | 21 +- .../src/testData/api/itemApiHelper.ts | 16 +- .../src/testData/api/publicationApiHelper.ts | 31 ++ .../src/testData/expectedConstants.ts | 6 + .../tests/overlay/chatSettingsFeature.test.ts | 12 +- .../chat-e2e/src/tests/overlay/events.test.ts | 442 ++++++++++++++++++ .../src/tests/overlay/modelIdFeature.test.ts | 6 +- apps/chat-e2e/src/ui/domData/tags.ts | 2 + .../src/ui/pages/overlay/overlayBasePage.ts | 19 + .../src/ui/selectors/overlaySelectors.ts | 14 + .../src/ui/webElements/overlay/actions.ts | 71 +++ .../ui/webElements/overlay/configuration.ts | 13 + .../src/ui/webElements/overlay/dialog.ts | 12 + .../cases/components/chatOverlayWrapper.tsx | 17 +- 16 files changed, 742 insertions(+), 23 deletions(-) create mode 100644 apps/chat-e2e/src/tests/overlay/events.test.ts create mode 100644 apps/chat-e2e/src/ui/webElements/overlay/actions.ts create mode 100644 apps/chat-e2e/src/ui/webElements/overlay/configuration.ts create mode 100644 apps/chat-e2e/src/ui/webElements/overlay/dialog.ts diff --git a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts index 0e9186ed05..5114d7cad6 100644 --- a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts +++ b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts @@ -1,3 +1,4 @@ +import { DialAIEntityModel } from '@/chat/types/models'; import { BaseAssertion } from '@/src/assertions/base/baseAssertion'; import { ExpectedMessages } from '@/src/testData'; import { AgentInfo } from '@/src/ui/webElements'; @@ -18,10 +19,10 @@ export class AgentInfoAssertion extends BaseAssertion { ); } - public async assertDescription(expectedDescription?: string) { + public async assertDescription(expectedModel: DialAIEntityModel) { const description = await this.agentInfo.getAgentDescription(); expect .soft(description, ExpectedMessages.agentDescriptionIsValid) - .toBe(expectedDescription ?? ''); + .toBe(expectedModel.description?.split(/\s*\n\s*\n\s*/g)[0] ?? ''); } } diff --git a/apps/chat-e2e/src/core/dialOverlayFixtures.ts b/apps/chat-e2e/src/core/dialOverlayFixtures.ts index b70f56abfc..3dc2e6729d 100644 --- a/apps/chat-e2e/src/core/dialOverlayFixtures.ts +++ b/apps/chat-e2e/src/core/dialOverlayFixtures.ts @@ -30,13 +30,17 @@ import { } from '@/src/assertions'; import { OverlayAssertion } from '@/src/assertions/overlay/overlayAssertion'; import test from '@/src/core/baseFixtures'; +import { LocalStorageManager } from '@/src/core/localStorageManager'; +import { isApiStorageType } from '@/src/hooks/global-setup'; import { FileApiHelper, IconApiHelper, ItemApiHelper, PublicationApiHelper, + ShareApiHelper, } from '@/src/testData/api'; import { ApiInjector } from '@/src/testData/injector/apiInjector'; +import { BrowserStorageInjector } from '@/src/testData/injector/browserStorageInjector'; import { DataInjectorInterface } from '@/src/testData/injector/dataInjectorInterface'; import { OverlayHomePage } from '@/src/ui/pages/overlay/overlayHomePage'; import { OverlayMarketplacePage } from '@/src/ui/pages/overlay/overlayMarketplacePage'; @@ -48,11 +52,15 @@ import { import { ReportAnIssueModal } from '@/src/ui/webElements/footer/reportAnIssueModal'; import { RequestApiKeyModal } from '@/src/ui/webElements/footer/requestApiKeyModal'; import { Header } from '@/src/ui/webElements/header'; +import { Actions } from '@/src/ui/webElements/overlay/actions'; +import { Configuration } from '@/src/ui/webElements/overlay/configuration'; +import { Dialog } from '@/src/ui/webElements/overlay/dialog'; import { ProfilePanel } from '@/src/ui/webElements/overlay/profilePanel'; import { PlaybackControl } from '@/src/ui/webElements/playbackControl'; import { SettingsModal } from '@/src/ui/webElements/settingsModal'; import { ShareModal } from '@/src/ui/webElements/shareModal'; import { BucketUtil } from '@/src/utils'; +import { Page } from '@playwright/test'; import path from 'path'; import { APIRequestContext } from 'playwright-core'; import * as process from 'process'; @@ -106,8 +114,19 @@ const dialOverlayTest = test.extend<{ overlayAssertion: OverlayAssertion; overlayConversationAssertion: ConversationAssertion; overlayPromptAssertion: PromptAssertion; + overlayShareApiHelper: ShareApiHelper; adminUserRequestContext: APIRequestContext; adminPublicationApiHelper: PublicationApiHelper; + adminShareApiHelper: ShareApiHelper; + adminItemApiHelper: ItemApiHelper; + adminApiInjector: ApiInjector; + adminBrowserStorageInjector: BrowserStorageInjector; + adminPage: Page; + adminLocalStorageManager: LocalStorageManager; + adminDataInjector: DataInjectorInterface; + overlayActions: Actions; + overlayConfiguration: Configuration; + overlayDialog: Dialog; }>({ // eslint-disable-next-line no-empty-pattern storageState: async ({}, use) => { @@ -354,6 +373,10 @@ const dialOverlayTest = test.extend<{ const promptAssertion = new PromptAssertion(overlayPrompts); await use(promptAssertion); }, + overlayShareApiHelper: async ({ request }, use) => { + const overlayShareApiHelper = new ShareApiHelper(request); + await use(overlayShareApiHelper); + }, adminUserRequestContext: async ({ playwright }, use) => { const adminUserRequestContext = await playwright.request.newContext({ storageState: overlayStateFilePath(+config.workers!), @@ -363,10 +386,63 @@ const dialOverlayTest = test.extend<{ adminPublicationApiHelper: async ({ adminUserRequestContext }, use) => { const adminPublicationApiHelper = new PublicationApiHelper( adminUserRequestContext, - BucketUtil.getAdminUserBucket(), ); await use(adminPublicationApiHelper); }, + adminShareApiHelper: async ({ adminUserRequestContext }, use) => { + const adminShareApiHelper = new ShareApiHelper(adminUserRequestContext); + await use(adminShareApiHelper); + }, + adminItemApiHelper: async ({ adminUserRequestContext }, use) => { + const adminItemApiHelper = new ItemApiHelper( + adminUserRequestContext, + BucketUtil.getAdminUserBucket(), + ); + await use(adminItemApiHelper); + }, + adminApiInjector: async ({ adminItemApiHelper }, use) => { + const adminApiInjector = new ApiInjector(adminItemApiHelper); + await use(adminApiInjector); + }, + adminPage: async ({ browser }, use) => { + const context = await browser.newContext({ + storageState: overlayStateFilePath(+config.workers!), + }); + const adminPage = await context.newPage(); + await use(adminPage); + await context.close(); + }, + adminLocalStorageManager: async ({ adminPage }, use) => { + const adminLocalStorageManager = new LocalStorageManager(adminPage); + await use(adminLocalStorageManager); + }, + adminBrowserStorageInjector: async ({ adminLocalStorageManager }, use) => { + const adminBrowserStorageInjector = new BrowserStorageInjector( + adminLocalStorageManager, + ); + await use(adminBrowserStorageInjector); + }, + adminDataInjector: async ( + { adminApiInjector, adminBrowserStorageInjector }, + use, + ) => { + const adminDataInjector = isApiStorageType + ? adminApiInjector + : adminBrowserStorageInjector; + await use(adminDataInjector); + }, + overlayActions: async ({ overlayHomePage }, use) => { + const overlayActions = overlayHomePage.getActions(); + await use(overlayActions); + }, + overlayConfiguration: async ({ overlayHomePage }, use) => { + const overlayConfiguration = overlayHomePage.getConfiguration(); + await use(overlayConfiguration); + }, + overlayDialog: async ({ page }, use) => { + const overlayDialog = new Dialog(page); + await use(overlayDialog); + }, }); export default dialOverlayTest; diff --git a/apps/chat-e2e/src/core/localStorageManager.ts b/apps/chat-e2e/src/core/localStorageManager.ts index a8b10cf99c..5593e6e581 100644 --- a/apps/chat-e2e/src/core/localStorageManager.ts +++ b/apps/chat-e2e/src/core/localStorageManager.ts @@ -170,7 +170,20 @@ export class LocalStorageManager { } async getSelectedConversationIds(originHost?: string) { - let selectedConversationIds; + const selectedConversationIds = await this.getKey( + 'selectedConversationIds', + originHost, + ); + return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; + } + + async getRecentModelsIds(originHost?: string) { + const recentModelsIds = await this.getKey('recentModelsIds', originHost); + return recentModelsIds ? JSON.parse(recentModelsIds) : ''; + } + + private async getKey(key: string, originHost?: string) { + let value; const storage = await this.page.context().storageState(); let origin; if (originHost) { @@ -179,10 +192,8 @@ export class LocalStorageManager { origin = storage.origins[0]; } if (origin) { - selectedConversationIds = origin.localStorage.find( - (s) => s.name === 'selectedConversationIds', - )?.value; + value = origin.localStorage.find((s) => s.name === key)?.value; } - return selectedConversationIds ? JSON.parse(selectedConversationIds) : ''; + return value; } } diff --git a/apps/chat-e2e/src/testData/api/itemApiHelper.ts b/apps/chat-e2e/src/testData/api/itemApiHelper.ts index 3d8de8e7be..d13c3f2f04 100644 --- a/apps/chat-e2e/src/testData/api/itemApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/itemApiHelper.ts @@ -1,5 +1,5 @@ import { Conversation } from '@/chat/types/chat'; -import { BackendDataEntity, BackendDataNodeType } from '@/chat/types/common'; +import { BackendChatEntity, BackendDataNodeType } from '@/chat/types/common'; import { Prompt } from '@/chat/types/prompt'; import { API } from '@/src/testData'; import { BaseApiHelper } from '@/src/testData/api/baseApiHelper'; @@ -39,10 +39,20 @@ export class ItemApiHelper extends BaseApiHelper { statusCode, `Received response code: ${statusCode} with body: ${await response.text()}`, ).toBe(200); - return (await response.json()) as BackendDataEntity[]; + return (await response.json()) as BackendChatEntity[]; } - public async deleteBackendItem(...items: BackendDataEntity[]) { + public async getItem(id: string) { + const response = await this.request.get(this.getHost(`/api/${id}`)); + const statusCode = response.status(); + expect( + statusCode, + `Received response code: ${statusCode} with body: ${await response.text()}`, + ).toBe(200); + return (await response.json()) as Conversation; + } + + public async deleteBackendItem(...items: BackendChatEntity[]) { for (const item of items) { const path = `/api/${item.url}`; const response = await this.request.delete(this.getHost(path)); diff --git a/apps/chat-e2e/src/testData/api/publicationApiHelper.ts b/apps/chat-e2e/src/testData/api/publicationApiHelper.ts index 9145514a4b..89e2a054fe 100644 --- a/apps/chat-e2e/src/testData/api/publicationApiHelper.ts +++ b/apps/chat-e2e/src/testData/api/publicationApiHelper.ts @@ -1,9 +1,11 @@ +import { Conversation } from '@/chat/types/chat'; import { Publication, PublicationInfo, PublicationRequestModel, PublicationStatus, PublicationsListModel, + PublishedList, } from '@/chat/types/publication'; import { API, ExpectedConstants } from '@/src/testData'; import { BaseApiHelper } from '@/src/testData/api/baseApiHelper'; @@ -31,6 +33,23 @@ export class PublicationApiHelper extends BaseApiHelper { return (await response.json()) as PublicationsListModel; } + public async listPublishedConversations() { + const response = await this.request.get( + this.getHost(API.publishedConversations), + { + params: { + recursive: true, + }, + }, + ); + const statusCode = response.status(); + expect( + statusCode, + `Received response code: ${statusCode} with body: ${await response.text()}`, + ).toBe(200); + return (await response.json()) as PublishedList; + } + public async getPublicationRequestDetails(publicationUrl: string) { const response = await this.request.post( this.getHost(API.publicationRequestDetails), @@ -46,6 +65,18 @@ export class PublicationApiHelper extends BaseApiHelper { return (await response.json()) as Publication; } + public async getPublishedConversation(conversationUrl: string) { + const response = await this.request.get( + this.getHost(`/api/${conversationUrl}`), + ); + const statusCode = response.status(); + expect( + statusCode, + `Received response code: ${statusCode} with body: ${await response.text()}`, + ).toBe(200); + return (await response.json()) as Conversation; + } + public async approveRequest( publicationRequest: Publication | PublicationInfo, ) { diff --git a/apps/chat-e2e/src/testData/expectedConstants.ts b/apps/chat-e2e/src/testData/expectedConstants.ts index 8846654e91..f92e1265f6 100644 --- a/apps/chat-e2e/src/testData/expectedConstants.ts +++ b/apps/chat-e2e/src/testData/expectedConstants.ts @@ -320,6 +320,7 @@ export const API = { publicationRulesList: '/api/publication/rulesList', multipleListingHost: () => `${API.listingHost}/multiple?recursive=true`, pendingPublicationsListing: '/api/publication/listing', + publishedConversations: '/api/publication/conversations/public', }; export const Import = { @@ -433,3 +434,8 @@ export enum AttachFilesFolders { appdata = 'appdata', images = 'images', } + +export enum PseudoModel { + replay = 'replay', + playback = 'playback', +} diff --git a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts index 9c1e1d8a53..54e7343739 100644 --- a/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/chatSettingsFeature.test.ts @@ -201,7 +201,8 @@ dialOverlayTest( dialOverlayTest( `[Overlay] When no any feature is enabled in the code.\n` + - '[Overlay] Display configure settings for empty chat - Feature.EmptyChatSettings. p1', + '[Overlay] Display configure settings for empty chat - Feature.EmptyChatSettings. p1.\n' + + `[Overlay] Send 'Hello' to Chat manually`, async ({ overlayHomePage, overlayChat, @@ -212,7 +213,7 @@ dialOverlayTest( overlaySendMessage, setTestIds, }) => { - setTestIds('EPMRTC-3780', 'EPMRTC-3765'); + setTestIds('EPMRTC-3780', 'EPMRTC-3765', 'EPMRTC-4846'); await dialTest.step( 'Open sandbox and verify model information, send request field and "Change agent" link are available', @@ -255,7 +256,12 @@ dialOverlayTest( MockedChatApiResponseBodies.simpleTextBody, { isOverlay: true }, ); - await overlayChat.sendRequestWithButton('test'); + const requestContent = 'test'; + const request = await overlayChat.sendRequestWithButton(requestContent); + overlayBaseAssertion.assertValue( + request.messages[0].content, + requestContent, + ); await overlayChatMessagesAssertion.assertMessageDeleteIconState( 1, 'visible', diff --git a/apps/chat-e2e/src/tests/overlay/events.test.ts b/apps/chat-e2e/src/tests/overlay/events.test.ts new file mode 100644 index 0000000000..e6edb1fe10 --- /dev/null +++ b/apps/chat-e2e/src/tests/overlay/events.test.ts @@ -0,0 +1,442 @@ +import { Conversation } from '@/chat/types/chat'; +import { Publication } from '@/chat/types/publication'; +import dialOverlayTest from '@/src/core/dialOverlayFixtures'; +import { + API, + ExpectedConstants, + FolderConversation, + MockedChatApiResponseBodies, + OverlaySandboxUrls, + PseudoModel, + Theme, +} from '@/src/testData'; +import { GeneratorUtil, ItemUtil, ModelsUtil } from '@/src/utils'; +import { + CreateConversationResponse, + GetConversationsResponse, + GetMessagesResponse, + OverlayConversation, + PublishActions, + SelectConversationResponse, +} from '@epam/ai-dial-shared'; +import { expect } from '@playwright/test'; + +const publicationsToUnpublish: Publication[] = []; + +dialOverlayTest( + `[Overlay. Events in sandbox] Send 'Hello' to Chat.\n` + + '[Overlay. Events in sandbox] Set system prompt.\n' + + '[Overlay. Events in sandbox] Get messages.\n' + + '[Overlay. Events in sandbox] Create conversation. Specific for Overlay: new conversation is created each time.\n' + + `[Overlay. Events in sandbox] Overlay configuration. Click on "Set light theme and new model" when new conversation is on the screen`, + async ({ + overlayHomePage, + overlayHeader, + overlayIconApiHelper, + overlayBaseAssertion, + overlayAgentInfoAssertion, + overlayAssertion, + overlayActions, + overlayConfiguration, + overlayAgentInfo, + overlayChat, + overlayDialog, + overlayItemApiHelper, + localStorageManager, + setTestIds, + }) => { + setTestIds( + 'EPMRTC-4845', + 'EPMRTC-395', + 'EPMRTC-4850', + 'EPMRTC-4506', + 'EPMRTC-4853', + ); + const firstRequestContent = 'Hello'; + const secondRequestContent = 'test'; + const systemPrompt = `End each word with string "!?!?!"`; + let secondRequest: Conversation; + const configuredModelId = 'stability.stable-diffusion-xl'; + + await overlayHomePage.mockChatTextResponse( + MockedChatApiResponseBodies.simpleTextBody, + { isOverlay: true }, + ); + + await dialOverlayTest.step( + `Click on "Send 'Hello' to Chat" and verify request with correct message is sent`, + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledOnlyHeaderSandboxUrl, + ); + await overlayHomePage.waitForPageLoaded(); + const request = await overlayActions.clickSendMessage(); + overlayBaseAssertion.assertValue( + request.messages[0].content, + firstRequestContent, + ); + }, + ); + + await dialOverlayTest.step( + `Click on "Set system prompt', send one more message and verify system prompt is set in the request`, + async () => { + await overlayActions.setSysPromptButton.click(); + secondRequest = (await overlayChat.sendRequestWithButton( + secondRequestContent, + )) as Conversation; + const systemMessage = secondRequest.messages.find( + (m) => m.role === 'system', + ); + expect.soft(systemMessage).toBeDefined(); + overlayBaseAssertion.assertValue(systemMessage?.content, systemPrompt); + }, + ); + + await dialOverlayTest.step( + `Click on "Get messages" and verify dialog with conversation messages is displayed`, + async () => { + await overlayActions.getMessagesButton.click(); + await overlayBaseAssertion.assertElementState(overlayDialog, 'visible'); + const actualMessages = + await overlayDialog.content.getElementInnerContent(); + const expectedItem = await overlayItemApiHelper.getItem( + secondRequest.id, + ); + const expectedMessages: GetMessagesResponse = { + messages: expectedItem.messages, + }; + expect + .soft(JSON.parse(actualMessages) as GetMessagesResponse) + .toStrictEqual(expectedMessages); + await overlayDialog.closeButton.click(); + }, + ); + + await dialOverlayTest.step( + `Click on "Create conversation" button two times and verify dialog with conversation is displayed, conversation index is incremented`, + async () => { + for (let i = 1; i <= 2; i++) { + const newConversationData = + await overlayActions.clickCreateConversation(); + expect + .soft( + newConversationData.request.id.endsWith( + ExpectedConstants.newConversationWithIndexTitle(i), + ), + ) + .toBeTruthy(); + await overlayBaseAssertion.assertElementState( + overlayDialog, + 'visible', + ); + const actualMessages = + await overlayDialog.content.getElementInnerContent(); + const expectedConversation: CreateConversationResponse = { + conversation: { + model: newConversationData.request.model, + name: newConversationData.request.name, + isPlayback: newConversationData.request.isPlayback ?? false, + isReplay: newConversationData.request.isReplay ?? false, + id: newConversationData.request.id, + lastActivityDate: newConversationData.response.updatedAt, + folderId: newConversationData.request.folderId, + bucket: newConversationData.response.bucket, + }, + }; + expect + .soft(JSON.parse(actualMessages) as CreateConversationResponse) + .toStrictEqual(expectedConversation); + await overlayDialog.closeButton.click(); + } + }, + ); + + await dialOverlayTest.step( + `Click on "Set light theme and new model" button and verify theme is changed to light, model is added to the recent models`, + async () => { + await overlayConfiguration.setConfigurationButton.click(); + await overlayAssertion.assertOverlayTheme(overlayHomePage, Theme.light); + await overlayBaseAssertion.assertElementText( + overlayAgentInfo.agentName, + ModelsUtil.getDefaultModel()!.name, + ); + const recentModels = await localStorageManager.getRecentModelsIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ); + overlayBaseAssertion.assertValue(recentModels[0], configuredModelId); + }, + ); + + await dialOverlayTest.step( + `Click on "Create new conversation" button and verify new model is applied`, + async () => { + const expectedModel = ModelsUtil.getModel(configuredModelId)!; + await overlayHeader.createNewConversation(); + await overlayAgentInfoAssertion.assertElementText( + overlayAgentInfo.agentName, + expectedModel.name, + ); + await overlayAgentInfoAssertion.assertDescription(expectedModel); + await overlayAgentInfoAssertion.assertAgentIcon( + overlayIconApiHelper.getEntityIcon(expectedModel), + ); + }, + ); + }, +); + +dialOverlayTest( + '[Overlay. Events in sandbox] Select conversation and its json appears if to click on Select conversation by ID.\n' + + '[Overlay. Events in sandbox] Get conversations', + async ({ + overlayHomePage, + overlayActions, + overlayDialog, + conversationData, + overlayChatHeader, + overlayBaseAssertion, + localStorageManager, + overlayDataInjector, + overlayShareApiHelper, + overlayItemApiHelper, + overlayPublicationApiHelper, + setTestIds, + adminShareApiHelper, + adminPublicationApiHelper, + adminDataInjector, + publishRequestBuilder, + }) => { + setTestIds('EPMRTC-396', 'EPMRTC-4852'); + let todayConversation: Conversation; + let folderConversation: FolderConversation; + let publishedConversation: Conversation; + let sharedConversation: Conversation; + const expectedConversationsArray: OverlayConversation[] = []; + + await dialOverlayTest.step( + `Prepare conversations in Today, Pinned, Organization and Shared sections`, + async () => { + todayConversation = conversationData.prepareDefaultConversation(); + conversationData.resetData(); + folderConversation = + conversationData.prepareDefaultConversationInFolder(); + conversationData.resetData(); + publishedConversation = conversationData.prepareDefaultConversation(); + conversationData.resetData(); + sharedConversation = conversationData.prepareDefaultConversation(); + await overlayDataInjector.createConversations([ + todayConversation, + ...folderConversation.conversations, + ]); + await adminDataInjector.createConversations([ + publishedConversation, + sharedConversation, + ]); + //publish conversation by admin + const publishRequest = publishRequestBuilder + .withName(GeneratorUtil.randomPublicationRequestName()) + .withConversationResource(publishedConversation, PublishActions.ADD) + .build(); + const publication = + await adminPublicationApiHelper.createPublishRequest(publishRequest); + await adminPublicationApiHelper.approveRequest(publication); + publicationsToUnpublish.push(publication); + //share conversation by admin + const shareByLinkResponse = await adminShareApiHelper.shareEntityByLink( + [sharedConversation], + ); + await overlayShareApiHelper.acceptInvite(shareByLinkResponse); + }, + ); + + await dialOverlayTest.step( + `Click "Get conversations" button and verify dialog with conversations is displayed`, + async () => { + await overlayHomePage.navigateToUrl( + OverlaySandboxUrls.enabledHeaderSandboxUrl, + ); + await overlayHomePage.waitForPageLoaded(); + await overlayActions.getConversationsButton.click(); + await overlayBaseAssertion.assertElementState(overlayDialog, 'visible'); + const actualConversations = + await overlayDialog.content.getElementInnerContent(); + const actualConversationsModels = JSON.parse( + actualConversations, + ) as GetConversationsResponse; + + const expectedConversationsModel: GetConversationsResponse = { + conversations: expectedConversationsArray, + }; + + //build expected conversations published with user + const actualPublishedConversationsList = + await overlayPublicationApiHelper.listPublishedConversations(); + for (const actualPublishedConversation of actualPublishedConversationsList.items!) { + const conversation = + await overlayPublicationApiHelper.getPublishedConversation( + actualPublishedConversation.url, + ); + const isPlayback = conversation.playback?.isPlayback; + const isReplay = conversation.replay?.isReplay; + const parentPath = actualPublishedConversation.parentPath; + expectedConversationsArray.push({ + model: isPlayback + ? { id: PseudoModel.playback } + : isReplay + ? { id: PseudoModel.replay } + : conversation.model, + name: conversation.name, + isPlayback: isPlayback ?? false, + isReplay: isReplay ?? false, + publicationInfo: { + version: actualPublishedConversation.name.substring( + actualPublishedConversation.name.lastIndexOf( + ItemUtil.conversationIdSeparator, + ) + ItemUtil.conversationIdSeparator.length, + ), + }, + id: conversation.id, + folderId: conversation.folderId, + publishedWithMe: !parentPath, + lastActivityDate: actualPublishedConversation.updatedAt, + bucket: actualPublishedConversation.bucket, + ...(parentPath && { parentPath }), + }); + } + + //build expected conversations created by user + const actualConversationsList = await overlayItemApiHelper.listItems( + API.conversationsHost(), + ); + for (const actualConversation of actualConversationsList) { + const conversation = await overlayItemApiHelper.getItem( + actualConversation.url, + ); + const parentPath = actualConversation.parentPath; + const isPlayback = conversation.playback?.isPlayback; + const isReplay = conversation.replay?.isReplay; + expectedConversationsArray.push({ + model: isPlayback + ? { id: PseudoModel.playback } + : isReplay + ? { id: PseudoModel.replay } + : conversation.model, + name: conversation.name, + isPlayback: isPlayback ?? false, + isReplay: isReplay ?? false, + id: conversation.id, + lastActivityDate: actualConversation.updatedAt, + folderId: conversation.folderId, + bucket: actualConversation.bucket, + ...(parentPath && { parentPath }), + }); + } + + //build expected conversations shared with user + const actualSharedConversationsList = + await overlayShareApiHelper.listSharedWithMeConversations(); + for (const actualSharedConversation of actualSharedConversationsList.resources) { + const conversation = await overlayItemApiHelper.getItem( + actualSharedConversation.url, + ); + const isPlayback = conversation.playback?.isPlayback; + const isReplay = conversation.replay?.isReplay; + expectedConversationsArray.push({ + model: isPlayback + ? { id: PseudoModel.playback } + : isReplay + ? { id: PseudoModel.replay } + : conversation.model, + name: conversation.name, + isPlayback: isPlayback ?? false, + isReplay: isReplay ?? false, + id: conversation.id, + folderId: conversation.folderId, + sharedWithMe: true, + bucket: actualSharedConversation.bucket, + }); + } + + //compare conversations from bucket storage + expect(actualConversationsModels.conversations.length).toBe( + expectedConversationsModel.conversations.length + 1, + ); + expect(actualConversationsModels.conversations).toEqual( + expect.arrayContaining(expectedConversationsModel.conversations), + ); + + //check newly created 'New conversation 1' is displayed + const selectedConversationIds = + await localStorageManager.getSelectedConversationIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ); + actualConversationsModels.conversations.find( + (c) => c.id === selectedConversationIds[0], + ); + expect( + actualConversationsModels.conversations.find( + (c) => c.id === selectedConversationIds[0], + ), + ).toBeDefined(); + await overlayDialog.closeButton.click(); + }, + ); + + await dialOverlayTest.step( + `Set id into "Select conversation by ID" field and verify conversation is selected, dialog with conversation is displayed`, + async () => { + await overlayActions.conversationIdField.fillInInput( + todayConversation.id, + ); + const conversationResponse = + await overlayActions.clickSelectConversationById(); + overlayBaseAssertion.assertValue( + conversationResponse.id, + todayConversation.id, + ); + + await overlayBaseAssertion.assertElementState(overlayDialog, 'visible'); + const actualConversation = + await overlayDialog.content.getElementInnerContent(); + const actualConversationModel = JSON.parse( + actualConversation, + ) as SelectConversationResponse; + + const expectedConversation = expectedConversationsArray.find( + (c) => c.id === todayConversation.id, + ); + const expectedSelectedConversation = { ...expectedConversation }; + delete expectedSelectedConversation.bucket; + + expect + .soft(actualConversationModel) + .toStrictEqual(expectedSelectedConversation); + await overlayDialog.closeButton.click(); + + await overlayBaseAssertion.assertElementText( + overlayChatHeader.chatTitle, + todayConversation.name, + ); + const selectedConversationIds = + await localStorageManager.getSelectedConversationIds( + process.env.NEXT_PUBLIC_OVERLAY_HOST, + ); + overlayBaseAssertion.assertValue( + selectedConversationIds[0], + todayConversation.id, + ); + }, + ); + }, +); + +dialOverlayTest.afterAll( + async ({ overlayPublicationApiHelper, adminPublicationApiHelper }) => { + for (const publication of publicationsToUnpublish) { + const unpublishResponse = + await overlayPublicationApiHelper.createUnpublishRequest(publication); + await adminPublicationApiHelper.approveRequest(unpublishResponse); + } + }, +); diff --git a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts index 6c19fea898..8bc7eeaace 100644 --- a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts @@ -61,8 +61,6 @@ dialOverlayTest( const expectedModel = ModelsUtil.getModel(expectedModelId)!; const expectedModelIcon = overlayIconApiHelper.getEntityIcon(expectedModel); - const expectedShortDescription = - expectedModel.description?.split(/\s*\n\s*\n\s*/g)[0]; await overlayHomePage.mockChatTextResponse( MockedChatApiResponseBodies.simpleTextBody, { isOverlay: true }, @@ -82,9 +80,7 @@ dialOverlayTest( overlayAgentInfo.agentName, expectedModel.name, ); - await overlayAgentInfoAssertion.assertDescription( - expectedShortDescription, - ); + await overlayAgentInfoAssertion.assertDescription(expectedModel); await overlayAgentInfoAssertion.assertAgentIcon(expectedModelIcon); }, ); diff --git a/apps/chat-e2e/src/ui/domData/tags.ts b/apps/chat-e2e/src/ui/domData/tags.ts index ea149df524..572ff9dcfd 100644 --- a/apps/chat-e2e/src/ui/domData/tags.ts +++ b/apps/chat-e2e/src/ui/domData/tags.ts @@ -14,4 +14,6 @@ export enum Tags { td = 'td', html = 'html', label = 'label', + dialog = 'dialog', + p = 'p', } diff --git a/apps/chat-e2e/src/ui/pages/overlay/overlayBasePage.ts b/apps/chat-e2e/src/ui/pages/overlay/overlayBasePage.ts index b0ad408ed0..5094a2dd00 100644 --- a/apps/chat-e2e/src/ui/pages/overlay/overlayBasePage.ts +++ b/apps/chat-e2e/src/ui/pages/overlay/overlayBasePage.ts @@ -2,6 +2,8 @@ import { Attributes, Tags } from '@/src/ui/domData'; import { BasePage } from '@/src/ui/pages'; import { OverlaySelectors, layoutContainer } from '@/src/ui/selectors'; import { BaseElement, BaseLayoutContainer } from '@/src/ui/webElements'; +import { Actions } from '@/src/ui/webElements/overlay/actions'; +import { Configuration } from '@/src/ui/webElements/overlay/configuration'; import { Page } from '@playwright/test'; export class OverlayBasePage extends BasePage { @@ -36,6 +38,23 @@ export class OverlayBasePage extends BasePage { OverlaySelectors.overlayManagerContainer, ); + public actions!: Actions; + public configuration!: Configuration; + + getActions(): Actions { + if (!this.actions) { + this.actions = new Actions(this.page); + } + return this.actions; + } + + getConfiguration(): Configuration { + if (!this.configuration) { + this.configuration = new Configuration(this.page); + } + return this.configuration; + } + public async getTheme() { return new BaseElement( this.page, diff --git a/apps/chat-e2e/src/ui/selectors/overlaySelectors.ts b/apps/chat-e2e/src/ui/selectors/overlaySelectors.ts index 8b589e6208..337fec6929 100644 --- a/apps/chat-e2e/src/ui/selectors/overlaySelectors.ts +++ b/apps/chat-e2e/src/ui/selectors/overlaySelectors.ts @@ -5,3 +5,17 @@ export const OverlaySelectors = { overlayManagerFullScreenButton: '#full-screen-button', overlayManagerContainer: '#frame-container', }; + +export const EventSelectors = { + chatActionsContainer: '#chat-actions', + sendMessageButton: '[data-qa="send-message"]', + setSysPromptButton: '[data-qa="set-sys-prompt"]', + getMessagesButton: '[data-qa="get-messages"]', + getConversationsButton: '[data-qa="get-conversations"]', + createConversationButton: '[data-qa="create-conversation"]', + createConversationInFolderButton: '[data-qa="create-conversation-in-folder"]', + selectConversationByIdButton: '[data-qa="select-conversation-by-id"]', + conversationIdField: '[data-qa="conversation-id"]', + configurationContainer: '#configuration', + setConfigurationButton: '[data-qa="set-configuration"]', +}; diff --git a/apps/chat-e2e/src/ui/webElements/overlay/actions.ts b/apps/chat-e2e/src/ui/webElements/overlay/actions.ts new file mode 100644 index 0000000000..3c115a8ef8 --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/overlay/actions.ts @@ -0,0 +1,71 @@ +import { Conversation } from '@/chat/types/chat'; +import { BackendChatEntity } from '@/chat/types/common'; +import { API } from '@/src/testData'; +import { EventSelectors } from '@/src/ui/selectors'; +import { BaseElement } from '@/src/ui/webElements'; +import { Page } from '@playwright/test'; +import * as process from 'node:process'; + +export class Actions extends BaseElement { + constructor(page: Page) { + super(page, EventSelectors.chatActionsContainer); + } + + public sendMessageButton = this.getChildElementBySelector( + EventSelectors.sendMessageButton, + ); + public setSysPromptButton = this.getChildElementBySelector( + EventSelectors.setSysPromptButton, + ); + public getMessagesButton = this.getChildElementBySelector( + EventSelectors.getMessagesButton, + ); + public getConversationsButton = this.getChildElementBySelector( + EventSelectors.getConversationsButton, + ); + public createConversationButton = this.getChildElementBySelector( + EventSelectors.createConversationButton, + ); + public createConversationInFolderButton = this.getChildElementBySelector( + EventSelectors.createConversationInFolderButton, + ); + public selectConversationByIdButton = this.getChildElementBySelector( + EventSelectors.selectConversationByIdButton, + ); + public conversationIdField = this.getChildElementBySelector( + EventSelectors.conversationIdField, + ); + + public async clickSendMessage() { + const requestPromise = this.page.waitForRequest( + process.env.NEXT_PUBLIC_OVERLAY_HOST + API.chatHost, + ); + await this.sendMessageButton.click(); + const request = await requestPromise; + return request.postDataJSON(); + } + + public async clickCreateConversation() { + const respPromise = this.page.waitForResponse( + (response) => + response.request().method() === 'POST' && response.status() === 200, + ); + await this.createConversationButton.click(); + const response = await respPromise; + const responseBody = (await response.json()) as BackendChatEntity; + return { + request: response.request().postDataJSON() as Conversation, + response: responseBody, + }; + } + + public async clickSelectConversationById() { + const respPromise = this.page.waitForResponse( + (response) => + response.request().method() === 'GET' && response.status() === 200, + ); + await this.selectConversationByIdButton.click(); + const response = await respPromise; + return (await response.json()) as Conversation; + } +} diff --git a/apps/chat-e2e/src/ui/webElements/overlay/configuration.ts b/apps/chat-e2e/src/ui/webElements/overlay/configuration.ts new file mode 100644 index 0000000000..1000361d74 --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/overlay/configuration.ts @@ -0,0 +1,13 @@ +import { EventSelectors } from '@/src/ui/selectors'; +import { BaseElement } from '@/src/ui/webElements'; +import { Page } from '@playwright/test'; + +export class Configuration extends BaseElement { + constructor(page: Page) { + super(page, EventSelectors.configurationContainer); + } + + public setConfigurationButton = this.getChildElementBySelector( + EventSelectors.setConfigurationButton, + ); +} diff --git a/apps/chat-e2e/src/ui/webElements/overlay/dialog.ts b/apps/chat-e2e/src/ui/webElements/overlay/dialog.ts new file mode 100644 index 0000000000..0cd3e1313d --- /dev/null +++ b/apps/chat-e2e/src/ui/webElements/overlay/dialog.ts @@ -0,0 +1,12 @@ +import { Tags } from '@/src/ui/domData'; +import { BaseElement } from '@/src/ui/webElements'; +import { Page } from '@playwright/test'; + +export class Dialog extends BaseElement { + constructor(page: Page) { + super(page, Tags.dialog); + } + + public closeButton = this.getChildElementBySelector(Tags.button); + public content = this.getChildElementBySelector(Tags.p); +} diff --git a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx index f46fddb2a7..18d2a054ae 100644 --- a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx +++ b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx @@ -97,7 +97,7 @@ export const ChatOverlayWrapper: React.FC = ({ >
-
+
Chat actions
@@ -106,6 +106,7 @@ export const ChatOverlayWrapper: React.FC = ({ onClick={() => { overlay.current?.sendMessage('Hello'); }} + data-qa="send-message" > Send 'Hello' to Chat @@ -117,6 +118,7 @@ export const ChatOverlayWrapper: React.FC = ({ 'End each word with string "!?!?!"', ); }} + data-qa="set-sys-prompt" > Set system prompt: End each word with string "!?!?!" @@ -128,6 +130,7 @@ export const ChatOverlayWrapper: React.FC = ({ handleDisplayInformation(JSON.stringify(messages, null, 2)); }} + data-qa="get-messages" > Get messages @@ -141,6 +144,7 @@ export const ChatOverlayWrapper: React.FC = ({ JSON.stringify(conversations, null, 2), ); }} + data-qa="get-conversations" > Get conversations @@ -153,6 +157,7 @@ export const ChatOverlayWrapper: React.FC = ({ handleDisplayInformation(JSON.stringify(conversation, null, 2)); }} + data-qa="create-conversation" > Create conversation @@ -167,6 +172,7 @@ export const ChatOverlayWrapper: React.FC = ({ handleDisplayInformation(JSON.stringify(conversation, null, 2)); }} + data-qa="create-conversation-in-folder" > Create conversation in inner folder @@ -175,6 +181,7 @@ export const ChatOverlayWrapper: React.FC = ({ @@ -183,11 +190,12 @@ export const ChatOverlayWrapper: React.FC = ({ placeholder="Type conversation ID" value={conversationIdInputValue} onChange={(e) => setConversationIdInputValue(e.target.value)} + data-qa="conversation-id" />
-
+
Overlay configuration
@@ -199,13 +207,14 @@ export const ChatOverlayWrapper: React.FC = ({ hostDomain: window.location.origin, }; - newOptions.theme = 'dark'; + newOptions.theme = 'light'; newOptions.modelId = 'stability.stable-diffusion-xl'; overlay.current?.setOverlayOptions(newOptions); }} + data-qa="set-configuration" > - Set dark theme and new model + Set light theme and new model
From ada022b0e703f2d3368a6c728c3c0d40555c6c03 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Thu, 23 Jan 2025 18:23:36 +0100 Subject: [PATCH 32/44] feat/overlay-events-tests: commented-out blocked by issue verifications --- .../chat-e2e/src/tests/overlay/events.test.ts | 79 ++++++++++--------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/apps/chat-e2e/src/tests/overlay/events.test.ts b/apps/chat-e2e/src/tests/overlay/events.test.ts index e6edb1fe10..860d190692 100644 --- a/apps/chat-e2e/src/tests/overlay/events.test.ts +++ b/apps/chat-e2e/src/tests/overlay/events.test.ts @@ -10,7 +10,7 @@ import { PseudoModel, Theme, } from '@/src/testData'; -import { GeneratorUtil, ItemUtil, ModelsUtil } from '@/src/utils'; +import { GeneratorUtil, ModelsUtil } from '@/src/utils'; import { CreateConversationResponse, GetConversationsResponse, @@ -200,7 +200,6 @@ dialOverlayTest( overlayDataInjector, overlayShareApiHelper, overlayItemApiHelper, - overlayPublicationApiHelper, setTestIds, adminShareApiHelper, adminPublicationApiHelper, @@ -270,40 +269,41 @@ dialOverlayTest( }; //build expected conversations published with user - const actualPublishedConversationsList = - await overlayPublicationApiHelper.listPublishedConversations(); - for (const actualPublishedConversation of actualPublishedConversationsList.items!) { - const conversation = - await overlayPublicationApiHelper.getPublishedConversation( - actualPublishedConversation.url, - ); - const isPlayback = conversation.playback?.isPlayback; - const isReplay = conversation.replay?.isReplay; - const parentPath = actualPublishedConversation.parentPath; - expectedConversationsArray.push({ - model: isPlayback - ? { id: PseudoModel.playback } - : isReplay - ? { id: PseudoModel.replay } - : conversation.model, - name: conversation.name, - isPlayback: isPlayback ?? false, - isReplay: isReplay ?? false, - publicationInfo: { - version: actualPublishedConversation.name.substring( - actualPublishedConversation.name.lastIndexOf( - ItemUtil.conversationIdSeparator, - ) + ItemUtil.conversationIdSeparator.length, - ), - }, - id: conversation.id, - folderId: conversation.folderId, - publishedWithMe: !parentPath, - lastActivityDate: actualPublishedConversation.updatedAt, - bucket: actualPublishedConversation.bucket, - ...(parentPath && { parentPath }), - }); - } + //TODO: enable when fixed https://github.com/epam/ai-dial-chat/issues/2929 + // const actualPublishedConversationsList = + // await overlayPublicationApiHelper.listPublishedConversations(); + // for (const actualPublishedConversation of actualPublishedConversationsList.items!) { + // const conversation = + // await overlayPublicationApiHelper.getPublishedConversation( + // actualPublishedConversation.url, + // ); + // const isPlayback = conversation.playback?.isPlayback; + // const isReplay = conversation.replay?.isReplay; + // const parentPath = actualPublishedConversation.parentPath; + // expectedConversationsArray.push({ + // model: isPlayback + // ? { id: PseudoModel.playback } + // : isReplay + // ? { id: PseudoModel.replay } + // : conversation.model, + // name: conversation.name, + // isPlayback: isPlayback ?? false, + // isReplay: isReplay ?? false, + // publicationInfo: { + // version: actualPublishedConversation.name.substring( + // actualPublishedConversation.name.lastIndexOf( + // ItemUtil.conversationIdSeparator, + // ) + ItemUtil.conversationIdSeparator.length, + // ), + // }, + // id: conversation.id, + // folderId: conversation.folderId, + // publishedWithMe: !parentPath, + // lastActivityDate: actualPublishedConversation.updatedAt, + // bucket: actualPublishedConversation.bucket, + // ...(parentPath && { parentPath }), + // }); + // } //build expected conversations created by user const actualConversationsList = await overlayItemApiHelper.listItems( @@ -359,9 +359,10 @@ dialOverlayTest( } //compare conversations from bucket storage - expect(actualConversationsModels.conversations.length).toBe( - expectedConversationsModel.conversations.length + 1, - ); + //TODO: enable when fixed https://github.com/epam/ai-dial-chat/issues/2929 + // expect(actualConversationsModels.conversations.length).toBe( + // expectedConversationsModel.conversations.length + 1, + // ); expect(actualConversationsModels.conversations).toEqual( expect.arrayContaining(expectedConversationsModel.conversations), ); From cde3d279eecbf10721f1c720c72e034a7c09f44c Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 24 Jan 2025 15:20:21 +0100 Subject: [PATCH 33/44] feat/publish-file-tests: fixed MR and skip blocked step --- .../src/tests/publishConversation.test.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/apps/chat-e2e/src/tests/publishConversation.test.ts b/apps/chat-e2e/src/tests/publishConversation.test.ts index 7a8d6f60d5..ad43f811c1 100644 --- a/apps/chat-e2e/src/tests/publishConversation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversation.test.ts @@ -413,6 +413,7 @@ dialAdminTest( publishRequestBuilder, publicationApiHelper, adminDialHomePage, + adminApproveRequiredConversations, adminApproveRequiredConversationsAssertion, adminDataInjector, adminConversations, @@ -427,7 +428,7 @@ dialAdminTest( ` ${GeneratorUtil.randomPublicationRequestName()} `, `${GeneratorUtil.randomPublicationRequestName()}${ExpectedConstants.hieroglyphChars}`, ]; - let conversation: Conversation; + const conversations: Conversation[] = []; let adminConversation: Conversation; await dialAdminTest.step( @@ -440,20 +441,26 @@ dialAdminTest( ); await dialTest.step( - 'Create a publication request and verify publication name is correct', + 'Create publication requests and verify publication names are correct', async () => { - for (const publicationName of publicationNames) { - conversation = conversationData.prepareDefaultConversation(); - await dataInjector.createConversations([conversation]); + for (let i = 1; i <= publicationNames.length; i++) { + const conversation = conversationData.prepareDefaultConversation(); + conversations.push(conversation); + conversationData.resetData(); + } + await dataInjector.createConversations(conversations); + + for (let i = 0; i < publicationNames.length; i++) { const publishRequest = publishRequestBuilder - .withName(publicationName) - .withConversationResource(conversation, PublishActions.ADD) + .withName(publicationNames[i]) + .withConversationResource(conversations[i], PublishActions.ADD) .build(); await publicationApiHelper.createPublishRequest(publishRequest); - conversationData.resetData(); + } - await adminDialHomePage.openHomePage(); - await adminDialHomePage.waitForPageLoaded(); + await adminDialHomePage.openHomePage(); + await adminDialHomePage.waitForPageLoaded(); + for (const publicationName of publicationNames) { await adminApproveRequiredConversationsAssertion.assertFolderState( { name: publicationName.trim().replaceAll('\t', ' ') }, 'visible', @@ -462,9 +469,16 @@ dialAdminTest( }, ); - await dialAdminTest.step( - 'Open Compare mode for admins conversation and verify conversation from publication request is not available for comparison', + await dialAdminTest.step.skip( + 'Open Compare mode for admins conversation and verify conversation from publication request is not available for comparison.\n' + + 'Issue: https://github.com/epam/ai-dial-chat/issues/3012', async () => { + const requestToExpand = + GeneratorUtil.randomArrayElement(publicationNames); + const requestIndex = publicationNames.indexOf(requestToExpand); + await adminApproveRequiredConversations.expandApproveRequiredFolder( + requestToExpand, + ); await adminConversations.openEntityDropdownMenu(adminConversation.name); await adminConversationDropdownMenu.selectMenuOption( MenuOptions.compare, @@ -477,7 +491,7 @@ dialAdminTest( await compareConversations.getCompareConversationNames(); baseAssertion.assertArrayExcludesAll( conversationsList, - [conversation.name], + [conversations[requestIndex].name], ExpectedMessages.conversationsToCompareOptionsValid, ); }, From 753e46bc36d412d95944d4bf73e9917d8ec563b8 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Sat, 25 Jan 2025 10:37:58 +0100 Subject: [PATCH 34/44] feat/publish-file-tests: fixed MR comments --- .../src/assertions/downloadAssertion.ts | 70 ++++++++++++++++--- .../chat-e2e/src/testData/expectedMessages.ts | 1 + .../publishConversationToOrganisation.test.ts | 5 ++ .../publishConversationWithAttachment.test.ts | 23 +++--- .../src/ui/webElements/entityTree/folders.ts | 6 ++ 5 files changed, 87 insertions(+), 18 deletions(-) diff --git a/apps/chat-e2e/src/assertions/downloadAssertion.ts b/apps/chat-e2e/src/assertions/downloadAssertion.ts index c6c7018b58..56632c7988 100644 --- a/apps/chat-e2e/src/assertions/downloadAssertion.ts +++ b/apps/chat-e2e/src/assertions/downloadAssertion.ts @@ -1,13 +1,14 @@ import { LatestExportFormat } from '@/chat/types/import-export'; -import { ExpectedMessages } from '@/src/testData'; +import { Attachment, ExpectedMessages } from '@/src/testData'; import { UploadDownloadData } from '@/src/ui/pages'; import { FileUtil } from '@/src/utils'; import { expect } from '@playwright/test'; +import path from 'path'; -enum FileType { +export enum FileType { JSON = 'json', PLAIN = 'plain', - // JPG = 'jpg', + JPG = 'jpg', } type FileReader = (path: string) => string | Buffer | object | undefined; @@ -15,7 +16,7 @@ export class DownloadAssertion { private static fileReaders: Record = { [FileType.JSON]: FileUtil.readJsonFileData, [FileType.PLAIN]: FileUtil.readPlainFileData, - // [FileType.JPG]: FileUtil.readJpgFileData, //class can be extended to use with different file types + [FileType.JPG]: FileUtil.readPlainFileData, }; public async assertDownloadFileExtension( @@ -29,25 +30,74 @@ export class DownloadAssertion { public async assertFileIsDownloaded( downloadedData: UploadDownloadData, fileType: FileType, + expectedFilename?: string, ) { + let fileReader; + let fileContent; const downloadedFiles = FileUtil.getExportedFiles(); const fileExists = downloadedFiles?.some((file) => file.includes(downloadedData.path), ); expect.soft(fileExists, ExpectedMessages.dataIsExported).toBeTruthy(); if (fileExists) { - const fileReader = DownloadAssertion.fileReaders[fileType]; - const fileContent = fileReader(downloadedData.path); + fileReader = DownloadAssertion.fileReaders[fileType]; + fileContent = fileReader(downloadedData.path); expect.soft(fileContent, ExpectedMessages.dataIsExported).toBeDefined(); } + //verify downloaded file equals existing attachment + if (expectedFilename) { + //verify file name + expect + .soft( + downloadedFiles?.find((f) => f.includes(expectedFilename)), + ExpectedMessages.dataIsExported, + ) + .toBeDefined(); + //verify file content + if (fileReader) { + const expectedFileContent = fileReader( + path.join(Attachment.attachmentPath, expectedFilename), + ); + expect + .soft(fileContent, ExpectedMessages.fileContentIsValid) + .toStrictEqual(expectedFileContent); + } else { + throw new Error('File reader is not defined for the specified type!'); + } + } } - public async assertJsonFileIsDownloaded(downloadedData: UploadDownloadData) { - await this.assertFileIsDownloaded(downloadedData, FileType.JSON); + public async assertJsonFileIsDownloaded( + downloadedData: UploadDownloadData, + expectedFilename?: string, + ) { + await this.assertFileIsDownloaded( + downloadedData, + FileType.JSON, + expectedFilename, + ); } - public async assertPlainFileIsDownloaded(downloadedData: UploadDownloadData) { - await this.assertFileIsDownloaded(downloadedData, FileType.PLAIN); + public async assertPlainFileIsDownloaded( + downloadedData: UploadDownloadData, + expectedFilename?: string, + ) { + await this.assertFileIsDownloaded( + downloadedData, + FileType.PLAIN, + expectedFilename, + ); + } + + public async assertJpgFileIsDownloaded( + downloadedData: UploadDownloadData, + expectedFilename?: string, + ) { + await this.assertFileIsDownloaded( + downloadedData, + FileType.JPG, + expectedFilename, + ); } public async assertEntitiesAreNotExported( diff --git a/apps/chat-e2e/src/testData/expectedMessages.ts b/apps/chat-e2e/src/testData/expectedMessages.ts index 913574d3e0..80b458bd73 100644 --- a/apps/chat-e2e/src/testData/expectedMessages.ts +++ b/apps/chat-e2e/src/testData/expectedMessages.ts @@ -287,6 +287,7 @@ export enum ExpectedMessages { fileIsAttached = 'File is attached to message box', fileIsNotHighlighted = 'File is not highlighted', fileIsNotAttached = 'File is removed from message box', + fileContentIsValid = 'File content is valid', attachedFilesCountIsValid = 'Attached files count is valid', removeAttachmentIconIsHighlighted = 'Remove attachment icon is highlighted', attachmentsAreGrouped = 'Attachments are grouped', diff --git a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts index c1e77b19c4..7faa11a9d0 100644 --- a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts @@ -375,6 +375,11 @@ dialAdminTest( defaultFolderName, ); await selectFolders.getEditFolderInputActions().clickTickButton(); + //verify new folder was created not under the nested structure + await baseAssertion.assertElementsCount( + selectFolders.getFolderGroupNodes(cutNewFolderName), + maxNestedLevel - 1, + ); }, ); diff --git a/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts index 51c32f4fd4..61084ad5b5 100644 --- a/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationWithAttachment.test.ts @@ -16,11 +16,13 @@ import { FileModalSection } from '@/src/ui/webElements'; import { FileUtil, GeneratorUtil, ModelsUtil } from '@/src/utils'; import { expect } from '@playwright/test'; -let defaultModel: DialAIEntityModel; +let modelWithInputAttachments: DialAIEntityModel; const publicationsToUnpublish: Publication[] = []; dialTest.beforeAll(async () => { - defaultModel = ModelsUtil.getDefaultModel()!; + modelWithInputAttachments = GeneratorUtil.randomArrayElement( + ModelsUtil.getLatestModelsWithAttachment(), + ); }); dialAdminTest( @@ -57,6 +59,7 @@ dialAdminTest( adminFilesToApprove, adminChatMessages, organizationConversationAssertion, + downloadAssertion, adminApproveRequiredConversationsAssertion, adminOrganizationConversationAssertion, adminPublishingApprovalModalAssertion, @@ -77,7 +80,7 @@ dialAdminTest( 'EPMRTC-3457', ); let imageUrl: string; - const filePath = API.modelFilePath(defaultModel.id); + const filePath = API.modelFilePath(modelWithInputAttachments.id); let conversation: Conversation; let secondConversation: Conversation; const requestName = GeneratorUtil.randomPublicationRequestName(); @@ -96,7 +99,7 @@ dialAdminTest( ); conversation = conversationData.prepareConversationWithAttachmentsInRequest( - defaultModel, + modelWithInputAttachments, true, imageUrl, ); @@ -227,7 +230,7 @@ dialAdminTest( adminFilesToApprove.getFileDownloadIcon(Attachment.cloudImageName), 'visible', ); - await adminDialHomePage.downloadData(() => + const downloadedData = await adminDialHomePage.downloadData(() => adminFilesToApprove .getFileDownloadIcon(Attachment.cloudImageName) .click(), @@ -239,6 +242,10 @@ dialAdminTest( ExpectedMessages.dataIsExported, ) .toBeDefined(); + await downloadAssertion.assertJpgFileIsDownloaded( + downloadedData, + Attachment.cloudImageName, + ); }, ); @@ -281,7 +288,7 @@ dialAdminTest( )!; secondConversation = conversationData.prepareConversationWithAttachmentsInRequest( - defaultModel, + modelWithInputAttachments, true, fileResource.targetUrl, ); @@ -429,12 +436,12 @@ dialAdminTest( async () => { plotlyImageUrl = await fileApiHelper.putFile( Attachment.plotlyName, - API.modelFilePath(defaultModel.id), + API.modelFilePath(modelWithInputAttachments.id), ); plotlyConversation = conversationData.prepareConversationWithAttachmentInResponse( plotlyImageUrl, - defaultModel, + modelWithInputAttachments, ); await dataInjector.createConversations([plotlyConversation]); }, diff --git a/apps/chat-e2e/src/ui/webElements/entityTree/folders.ts b/apps/chat-e2e/src/ui/webElements/entityTree/folders.ts index a65fbca58c..5cab449763 100644 --- a/apps/chat-e2e/src/ui/webElements/entityTree/folders.ts +++ b/apps/chat-e2e/src/ui/webElements/entityTree/folders.ts @@ -173,6 +173,12 @@ export class Folders extends BaseElement { ); }; + public getFolderGroupNodes(parentFolderName: string) { + return this.foldersGroup(parentFolderName).getChildElementBySelector( + FolderSelectors.folder, + ); + } + public async waitForFolderGroupIsHighlighted(parentFolderName: string) { await this.getChildElementBySelector( `${FolderSelectors.folderGroup}.${ExpectedConstants.backgroundAccentAttribute}`, From 113efb738cc05a7360b8e611425ff1029d935ae5 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 27 Jan 2025 09:02:16 +0100 Subject: [PATCH 35/44] feat/publish-file-tests: updated test step description --- .../src/tests/publishConversationToOrganisation.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts index 7faa11a9d0..05682f59a1 100644 --- a/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts +++ b/apps/chat-e2e/src/tests/publishConversationToOrganisation.test.ts @@ -361,7 +361,7 @@ dialAdminTest( ); await dialTest.step( - 'Delete low-level folder and verify a new one is created in edit mode', + 'Delete low-level folder and verify a new one is created in edit mode in the root', async () => { await selectFolders.openFolderDropdownMenu( defaultFolderName, From 43809dc37089ef6c5852eef604ccd798c16349bd Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 31 Jan 2025 10:13:34 +0100 Subject: [PATCH 36/44] feat/overlay-events-tests: renamed method --- apps/chat-e2e/src/assertions/agentInfoAssertion.ts | 2 +- apps/chat-e2e/src/tests/overlay/events.test.ts | 2 +- apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts index 5114d7cad6..b401eeb6b9 100644 --- a/apps/chat-e2e/src/assertions/agentInfoAssertion.ts +++ b/apps/chat-e2e/src/assertions/agentInfoAssertion.ts @@ -19,7 +19,7 @@ export class AgentInfoAssertion extends BaseAssertion { ); } - public async assertDescription(expectedModel: DialAIEntityModel) { + public async assertShortDescription(expectedModel: DialAIEntityModel) { const description = await this.agentInfo.getAgentDescription(); expect .soft(description, ExpectedMessages.agentDescriptionIsValid) diff --git a/apps/chat-e2e/src/tests/overlay/events.test.ts b/apps/chat-e2e/src/tests/overlay/events.test.ts index 860d190692..7e44ed17f1 100644 --- a/apps/chat-e2e/src/tests/overlay/events.test.ts +++ b/apps/chat-e2e/src/tests/overlay/events.test.ts @@ -177,7 +177,7 @@ dialOverlayTest( overlayAgentInfo.agentName, expectedModel.name, ); - await overlayAgentInfoAssertion.assertDescription(expectedModel); + await overlayAgentInfoAssertion.assertShortDescription(expectedModel); await overlayAgentInfoAssertion.assertAgentIcon( overlayIconApiHelper.getEntityIcon(expectedModel), ); diff --git a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts index 8bc7eeaace..b617e9215d 100644 --- a/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts +++ b/apps/chat-e2e/src/tests/overlay/modelIdFeature.test.ts @@ -80,7 +80,7 @@ dialOverlayTest( overlayAgentInfo.agentName, expectedModel.name, ); - await overlayAgentInfoAssertion.assertDescription(expectedModel); + await overlayAgentInfoAssertion.assertShortDescription(expectedModel); await overlayAgentInfoAssertion.assertAgentIcon(expectedModelIcon); }, ); From 69f1b67c09026401240f651cabbc2707a0b7239d Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Fri, 31 Jan 2025 12:55:24 +0100 Subject: [PATCH 37/44] feat/overlay-events-tests: used ternary operator --- apps/chat-e2e/src/core/localStorageManager.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/apps/chat-e2e/src/core/localStorageManager.ts b/apps/chat-e2e/src/core/localStorageManager.ts index 5593e6e581..9e98288310 100644 --- a/apps/chat-e2e/src/core/localStorageManager.ts +++ b/apps/chat-e2e/src/core/localStorageManager.ts @@ -183,17 +183,10 @@ export class LocalStorageManager { } private async getKey(key: string, originHost?: string) { - let value; const storage = await this.page.context().storageState(); - let origin; - if (originHost) { - origin = storage.origins.find((o) => o.origin === originHost); - } else { - origin = storage.origins[0]; - } - if (origin) { - value = origin.localStorage.find((s) => s.name === key)?.value; - } - return value; + const origin = originHost + ? storage.origins.find((o) => o.origin === originHost) + : storage.origins[0]; + return origin?.localStorage.find((s) => s.name === key)?.value; } } From 15b8e8eedf26f454c9379d1b015a8953c63a06a8 Mon Sep 17 00:00:00 2001 From: Irina_Kartun Date: Mon, 3 Feb 2025 10:09:31 +0100 Subject: [PATCH 38/44] feat/overlay-events-tests: prettier --- .../app/cases/components/chatOverlayWrapper.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx index 1a6d1dc6a6..2f3e483f72 100644 --- a/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx +++ b/apps/overlay-sandbox/app/cases/components/chatOverlayWrapper.tsx @@ -181,7 +181,8 @@ export const ChatOverlayWrapper: React.FC = ({
-