Skip to content

Commit

Permalink
e2e: search_entity (#221)
Browse files Browse the repository at this point in the history
* e2e/search_entity: added tests for entities search

* e2e/search_entity: altered test verification to avoid buggy behavior

---------

Co-authored-by: Irina_Kartun <[email protected]>
  • Loading branch information
irinakartun and irinakartun authored Nov 27, 2023
1 parent 9c58b0a commit 1a3cd2c
Show file tree
Hide file tree
Showing 19 changed files with 559 additions and 40 deletions.
1 change: 1 addition & 0 deletions e2e/src/testData/expectedConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export const ExpectedConstants = {
backgroundColorPattern: /(rgba\(\d+,\s*\d+,\s*\d+),\s*\d+\.*\d+\)/,
sendMessageTooltip: 'Please type a message',
selectedPromptOptionAttribute: 'bg-blue-500/20',
noResults: 'No results found',
};

export enum Groups {
Expand Down
2 changes: 2 additions & 0 deletions e2e/src/testData/expectedMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,4 +156,6 @@ export enum ExpectedMessages {
playbackMessageIsInViewport = 'Playback message is in viewport',
playbackNextMessageIsScrollable = 'Playback next message is scrollable',
playbackNextMessageIsHidden = 'Playback next message is hidden',
searchResultCountIsValid = 'Search results count is valid',
noResultsFound = 'No results found is displayed',
}
6 changes: 4 additions & 2 deletions e2e/src/testData/prompts/promptData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ export class PromptData extends FolderData {
this.resetFolderData();
}

public prepareDefaultPrompt() {
return this.promptBuilder.withName(GeneratorUtil.randomString(10)).build();
public prepareDefaultPrompt(name?: string) {
return this.promptBuilder
.withName(name ?? GeneratorUtil.randomString(10))
.build();
}

public prepareNestedFolder(nestedLevel: number) {
Expand Down
100 changes: 90 additions & 10 deletions e2e/src/tests/chatBarConversation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ import {
ExpectedConstants,
ExpectedMessages,
MenuOptions,
ModelIds,
} from '@/e2e/src/testData';
import { Colors } from '@/e2e/src/ui/domData';
import { GeneratorUtil } from '@/e2e/src/utils';
import { expect } from '@playwright/test';

let gpt35Model: OpenAIEntityModel;
let gpt4Model: OpenAIEntityModel;
let bisonModel: OpenAIEntityModel;

test.beforeAll(async () => {
gpt35Model = ModelsUtil.getDefaultModel()!;
gpt4Model = ModelsUtil.getModel(ModelIds.GPT_4)!;
bisonModel = ModelsUtil.getModel(ModelIds.BISON_001)!;
});

test(
Expand Down Expand Up @@ -371,23 +376,17 @@ test(
await chat.regenerateResponse();
let todayConversations = await conversations.getTodayConversations();
expect
.soft(
todayConversations.includes(yesterdayConversation.name),
ExpectedMessages.conversationOfToday,
)
.toBeTruthy();
.soft(todayConversations.length, ExpectedMessages.conversationOfToday)
.toBe(1);

const messageToEdit = lastWeekConversation.messages[0].content;
await conversations.selectConversation(lastWeekConversation.name);
await chatMessages.openEditMessageMode(messageToEdit);
await chatMessages.editMessage('updated message');
todayConversations = await conversations.getTodayConversations();
expect
.soft(
todayConversations.includes(lastWeekConversation.name),
ExpectedMessages.conversationOfToday,
)
.toBeTruthy();
.soft(todayConversations.length, ExpectedMessages.conversationOfToday)
.toBe(2);

await conversations.selectConversation(lastMonthConversation.name);
await chat.sendRequestWithButton('one more test message');
Expand Down Expand Up @@ -785,3 +784,84 @@ test('Chat sorting. Sections can be collapsed and expanded', async ({
.toBe(1);
});
});

test('Search conversation when no folders', async ({
dialHomePage,
conversations,
conversationData,
localStorageManager,
chatBar,
setTestIds,
}) => {
setTestIds('EPMRTC-1188');
const request = 'What is epam official name?';
const notMatchingSearchTerm = 'abc';
const firstSearchTerm = 'EPAM';
const secondSearchTerm = 'epam official';
const specialSymbolsSearchTerm = '@';

await test.step('Prepare conversations with different content', async () => {
const firstConversation =
conversationData.prepareModelConversationBasedOnRequests(gpt35Model, [
request,
]);
conversationData.resetData();

const secondConversation =
conversationData.prepareModelConversationBasedOnRequests(
gpt4Model,
['What is AI?'],
'epam official name',
);
conversationData.resetData();

const thirdConversation =
conversationData.prepareModelConversationBasedOnRequests(
bisonModel,
[request],
'Chat_!@#$%^&*()+=\':",.<>',
);

await localStorageManager.setConversationHistory(
firstConversation,
secondConversation,
thirdConversation,
);
});

await test.step('Type not matching search term is "Search chat..." field and verify no results found', async () => {
await dialHomePage.openHomePage();
await dialHomePage.waitForPageLoaded({ isNewConversationVisible: true });
await chatBar.searchChat.fill(notMatchingSearchTerm);
const noResult = await chatBar.noResultFoundIcon.getElementInnerContent();
expect
.soft(noResult, ExpectedMessages.noResultsFound)
.toBe(ExpectedConstants.noResults);
});

await test.step('Clear search field and verify all conversations are displayed', async () => {
await chatBar.searchChat.fill('');
const results = await conversations.getTodayConversations();
expect
.soft(results.length, ExpectedMessages.searchResultCountIsValid)
.toBe(4);
});

await test.step('Search by first term and verify search results are correct', async () => {
for (const term of [firstSearchTerm, secondSearchTerm]) {
await chatBar.searchChat.fill(term);
const results = await conversations.getTodayConversations();
expect
.soft(results.length, ExpectedMessages.searchResultCountIsValid)
.toBe(3);
}
});

await test.step('Search by special symbol and verify search results are correct', async () => {
await chatBar.searchChat.fill(specialSymbolsSearchTerm);
const results = await conversations.getTodayConversations();
expect
.soft(results.length, ExpectedMessages.searchResultCountIsValid)
.toBe(1);
});
});
208 changes: 197 additions & 11 deletions e2e/src/tests/compareMode.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ test(
);
await conversationDropdownMenu.selectMenuOption(MenuOptions.compare);

const chatsCount = await compare.gerChatMessagesCount();
const chatsCount = await compare.getChatMessagesCount();
expect.soft(chatsCount, ExpectedMessages.compareModeOpened).toBe(1);

const isConversationToCompareVisible =
Expand Down Expand Up @@ -464,16 +464,22 @@ test('Generate new response for two chats in compare mode. Bison and GPT-4-32 wh
localStorageManager,
}) => {
setTestIds('EPMRTC-553');

const request = ['beautiful'];
let firstConversation: Conversation;
let secondConversation: Conversation;

await test.step('Prepare two conversations for comparing', async () => {
firstConversation = conversationData.prepareDefaultConversation(bisonModel);
firstConversation =
conversationData.prepareModelConversationBasedOnRequests(
bisonModel,
request,
);
conversationData.resetData();
secondConversation = conversationData.prepareDefaultConversation(
ModelsUtil.getModel(ModelIds.GPT_4_32K),
);
secondConversation =
conversationData.prepareModelConversationBasedOnRequests(
ModelsUtil.getModel(ModelIds.GPT_4_32K)!,
request,
);
await localStorageManager.setConversationHistory(
firstConversation,
secondConversation,
Expand All @@ -487,11 +493,15 @@ test('Generate new response for two chats in compare mode. Bison and GPT-4-32 wh
await test.step('Send new message in compare chat and verify regenerate is not available until both responses received', async () => {
await dialHomePage.openHomePage();
await dialHomePage.waitForPageLoaded();
await chat.sendRequestInCompareMode('write down 20 adjectives', {
rightEntity: firstConversation.model.id,
leftEntity: secondConversation.model.id,
});
await chatMessages.waitForOneCompareConversationResponseReceived();

await chat.sendRequestInCompareMode(
'write down 20 adjectives about person',
{
rightEntity: firstConversation.model.id,
leftEntity: secondConversation.model.id,
},
);
await chatMessages.waitForCompareMessageJumpingIconDisappears(Side.left);
const isRegenerateButtonVisible = await chat.regenerate.isVisible();
expect
.soft(isRegenerateButtonVisible, ExpectedMessages.regenerateNotAvailable)
Expand Down Expand Up @@ -764,3 +774,179 @@ test(
});
},
);

test(
'Search chat in Select conversation drop down.\n' +
'Select chat from search results in Select conversation drop down',
async ({
dialHomePage,
setTestIds,
conversationDropdownMenu,
conversations,
conversationData,
localStorageManager,
compareConversationSelector,
rightChatHeader,
}) => {
setTestIds('EPMRTC-536', 'EPMRTC-1168');
const request = 'What is epam official name?';
const firstSearchTerm = 'epam';
const secondSearchTerm = 'systems';
const thirdSearchTerm = 'epam official';
const underscoreSearchTerm = '_';
const noResultSearchTerm = 'epaQ';

let firstConversation: Conversation;
let secondConversation: Conversation;
let thirdConversation: Conversation;
let fourthConversation: Conversation;
const matchedConversations: string[] = [];

await test.step('Prepare 4 conversations with the same request but different names', async () => {
firstConversation =
conversationData.prepareModelConversationBasedOnRequests(
defaultModel,
[request],
request,
);
conversationData.resetData();
secondConversation =
conversationData.prepareModelConversationBasedOnRequests(
defaultModel,
[request],
request,
);
conversationData.resetData();
thirdConversation =
conversationData.prepareModelConversationBasedOnRequests(
defaultModel,
[request],
'Renamed epam systems',
);
conversationData.resetData();
fourthConversation =
conversationData.prepareModelConversationBasedOnRequests(
defaultModel,
[request],
'epam_systems !@#$%^&*()+=\':",.<>',
);

await localStorageManager.setConversationHistory(
firstConversation,
secondConversation,
thirdConversation,
fourthConversation,
);
await localStorageManager.setSelectedConversation(firstConversation);
matchedConversations.push(
secondConversation.name,
thirdConversation.name,
fourthConversation.name,
);
});

await test.step('Open compare mode for the 1st chat and verify all chats are available for comparison in dropdown list', async () => {
await dialHomePage.openHomePage();
await dialHomePage.waitForPageLoaded();
await conversations.openConversationDropdownMenu(firstConversation.name);
await conversationDropdownMenu.selectMenuOption(MenuOptions.compare);
await compareConversationSelector.click();
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual(matchedConversations);
});

await test.step('Type first search term and verify all chats are available for comparison in dropdown list', async () => {
for (const term of [firstSearchTerm, firstSearchTerm.toUpperCase()]) {
await compareConversationSelector.fillInput(term);
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual(matchedConversations);
}
});

await test.step('Type second search term and verify chat 3 and 4 are available for comparison in dropdown list', async () => {
await compareConversationSelector.fillInput(secondSearchTerm);
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual([thirdConversation.name, fourthConversation.name]);
});

await test.step('Type third search term and verify chat 2 is available for comparison in dropdown list', async () => {
await compareConversationSelector.fillInput(thirdSearchTerm);
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual([secondConversation.name]);
});

await test.step('Type underscore and verify chat 4 is available for comparison in dropdown list', async () => {
await compareConversationSelector.fillInput(underscoreSearchTerm);
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual([fourthConversation.name]);
});

await test.step('Type not matching search term and verify no chats available for comparison in dropdown list', async () => {
await compareConversationSelector.fillInput(noResultSearchTerm);
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual([]);
});

await test.step('Delete search term and verify all chats are available for comparison in dropdown list', async () => {
await compareConversationSelector.fillInput('');
const conversationsList =
await compareConversationSelector.getListOptions();
expect
.soft(
conversationsList,
ExpectedMessages.conversationsToCompareOptionsValid,
)
.toEqual(matchedConversations);
});

await test.step('Select any chat and verify it shown in the input, dropdown list is closed', async () => {
const chatToSelect =
GeneratorUtil.randomArrayElement(matchedConversations);
await compareConversationSelector.selectModel(chatToSelect, true);
await compareConversationSelector.waitForState({
state: 'hidden',
});
const rightHeaderTitle =
await rightChatHeader.chatTitle.getElementContent();
expect
.soft(rightHeaderTitle, ExpectedMessages.headerTitleCorrespondRequest)
.toBe(chatToSelect);
});
},
);
Loading

0 comments on commit 1a3cd2c

Please sign in to comment.