diff --git a/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts b/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts new file mode 100644 index 0000000000000..d68936ca4a970 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts @@ -0,0 +1,73 @@ +import { faker } from '@faker-js/faker'; +import type { Browser, Page } from '@playwright/test'; + +import { test, expect } from './utils/test'; +import { OmnichannelLiveChat, HomeOmnichannel } from './page-objects'; + +const createAuxContext = async (browser: Browser, storageState: string): Promise<{ page: Page; poHomeOmnichannel: HomeOmnichannel }> => { + const page = await browser.newPage({ storageState }); + const poHomeOmnichannel = new HomeOmnichannel(page); + await page.goto('/omnichannel/triggers'); + await page.locator('.main-content').waitFor(); + + return { page, poHomeOmnichannel }; +}; + +test.describe.serial('omnichannel-triggers', () => { + let triggersName: string; + let triggerMessage: string; + let poLiveChat: OmnichannelLiveChat; + let newUser: { email: string; name: string }; + let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; + + test.beforeAll(async ({ api, browser }) => { + newUser = { + name: faker.name.firstName(), + email: faker.internet.email(), + }; + triggersName = faker.datatype.uuid(); + triggerMessage = 'Welcome to Rocket.chat'; + await api.post('/livechat/users/agent', { username: 'user1' }); + await api.post('/livechat/users/manager', { username: 'user1' }); + agent = await createAuxContext(browser, 'user1-session.json'); + }); + + test.beforeEach(async ({ page }) => { + poLiveChat = new OmnichannelLiveChat(page); + }); + + test.afterAll(async ({ api }) => { + await api.delete('/livechat/users/agent/user1'); + await api.delete('/livechat/users/manager/user1'); + }); + + test('expect create new trigger', async () => { + await agent.poHomeOmnichannel.triggers.createTrigger(triggersName, triggerMessage); + await expect(agent.poHomeOmnichannel.triggers.toastMessage).toBeVisible(); + }); + + test('expect update trigger', async () => { + const newTriggerName = `edited-${triggersName}`; + await agent.poHomeOmnichannel.triggers.firstRowInTriggerTable(triggersName).click(); + await agent.poHomeOmnichannel.triggers.updateTrigger(newTriggerName); + await expect(agent.poHomeOmnichannel.triggers.toastMessage).toBeVisible(); + }); + + test('expect triggers to be displaye on Livechat', async ({ page }) => { + await test.step('Expect send a message as a visitor', async () => { + await page.goto('/livechat'); + await poLiveChat.btnOpenLiveChat('R').click(); + if (await page.locator('[type="button"] >> text="Chat now"').isVisible()) { + await page.locator('[type="button"] >> text="Chat now"').click(); + } + await poLiveChat.sendMessage(newUser, false); + await expect(page.locator(`text=${triggerMessage} >> nth=0`)).toBeVisible(); + }); + }); + + test('expect deleting trigger', async () => { + await agent.poHomeOmnichannel.triggers.btnDeletefirstRowInTable.click(); + await agent.poHomeOmnichannel.triggers.btnModalRemove.click(); + await expect(agent.poHomeOmnichannel.triggers.removeToastMessage).toBeVisible(); + }); +}); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index e74ca487e595f..1ee25ca90f00c 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -40,6 +40,11 @@ export class HomeSidenav { await this.page.locator(`li.rcx-option >> text="${text}"`).click(); } + async openInstalledApps(): Promise { + await this.page.locator('//button[@title="Administration"]').click(); + await this.page.locator('//div[contains(text(),"Installed")]').click(); + } + async openNewByLabel(text: string): Promise { await this.page.locator('[data-qa="sidebar-create"]').click(); await this.page.locator(`li.rcx-option >> text="${text}"`).click(); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts index c70c235389091..ebca2dc9450fc 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts @@ -27,6 +27,10 @@ export class OmnichannelSidenav { return this.page.locator('a[href="omnichannel/current"]'); } + get linkTriggers(): Locator { + return this.page.locator('a[href="/omnichannel/triggers"]'); + } + get linkSlaPolicies(): Locator { return this.page.locator('a[href="omnichannel/sla-policies"]'); } diff --git a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts index 5992ed2924776..25fa889ff67e8 100644 --- a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts @@ -1,6 +1,7 @@ import type { Locator, Page } from '@playwright/test'; -import { HomeOmnichannelContent, HomeSidenav, HomeFlextab } from './fragments'; +import { HomeOmnichannelContent, HomeSidenav, HomeFlextab, OmnichannelSidenav } from './fragments'; +import { OmnichannelTriggers } from './omnichannel-triggers'; export class HomeOmnichannel { private readonly page: Page; @@ -11,11 +12,17 @@ export class HomeOmnichannel { readonly tabs: HomeFlextab; + readonly triggers: OmnichannelTriggers; + + readonly omnisidenav: OmnichannelSidenav; + constructor(page: Page) { this.page = page; this.content = new HomeOmnichannelContent(page); this.sidenav = new HomeSidenav(page); this.tabs = new HomeFlextab(page); + this.triggers = new OmnichannelTriggers(page); + this.omnisidenav = new OmnichannelSidenav(page); } get toastSuccess(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts index ca5e60c011cfd..510028168013a 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts @@ -45,6 +45,10 @@ export class OmnichannelLiveChat { return this.page.locator('footer div div div:nth-child(3) button'); } + get firstAutoMessage(): Locator { + return this.page.locator('div.message-text__WwYco p'); + } + public async sendMessage(liveChatUser: { name: string; email: string }, isOffline = true): Promise { const buttonLabel = isOffline ? 'Send' : 'Start chat'; await this.inputName.type(liveChatUser.name); diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts new file mode 100644 index 0000000000000..2f21a1bdf69d9 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts @@ -0,0 +1,122 @@ +import type { Locator, Page } from '@playwright/test'; + +import { OmnichannelSidenav } from './fragments'; + +export class OmnichannelTriggers { + private readonly page: Page; + + readonly sidenav: OmnichannelSidenav; + + constructor(page: Page) { + this.page = page; + this.sidenav = new OmnichannelSidenav(page); + } + + get btnNew(): Locator { + return this.page.locator('text= New'); + } + + get Name(): Locator { + return this.page.locator('[placeholder="Name"]'); + } + + get Description(): Locator { + return this.page.locator('[placeholder="Description"]'); + } + + get visitorTimeOnSite(): Locator { + return this.page.locator('text=Visitor time on site'); + } + + get visitorPageURL(): Locator { + return this.page.locator('text=Visitor page URL'); + } + + get chatOpenedByVisitor(): Locator { + return this.page.locator('text=Chat opened by the visitor'); + } + + get addTime(): Locator { + return this.page.locator('[placeholder="Time in seconds"]'); + } + + get impersonateAgent(): Locator { + return this.page.locator('text=Impersonate next agent from queue'); + } + + get impersonateAgentListBox(): Locator { + return this.page.locator('ol[role="listbox"] >> text=Impersonate next agent from queue'); + } + + get customAgent(): Locator { + return this.page.locator('text=Custom agent'); + } + + get agentName(): Locator { + return this.page.locator('[placeholder="Name of agent"]'); + } + + get textArea(): Locator { + return this.page.locator('textarea'); + } + + get saveBtn(): Locator { + return this.page.locator('button >> text="Save"'); + } + + get firstRowInTable() { + return this.page.locator('table tr:first-child td:first-child'); + } + + firstRowInTriggerTable(triggersName1: string) { + return this.page.locator(`text="${triggersName1}"`); + } + + get toastMessage(): Locator { + return this.page.locator('.rcx-toastbar.rcx-toastbar--success >> nth=0'); + } + + get inputSearch() { + return this.page.locator('[placeholder="Search"]'); + } + + get pageTitle() { + return this.page.locator('[data-qa-type="PageHeader-title"]'); + } + + get btnDeletefirstRowInTable() { + return this.page.locator('table tr:first-child td:last-child button'); + } + + get btnModalRemove(): Locator { + return this.page.locator('#modal-root dialog .rcx-modal__inner .rcx-modal__footer .rcx-button--danger'); + } + + get removeToastMessage(): Locator { + return this.page.locator('text=Trigger removed'); + } + + public async createTrigger(triggersName: string, triggerMessage: string) { + await this.btnNew.click(); + await this.Name.fill(triggersName); + await this.Description.fill('Creating a fresh trigger'); + await this.visitorPageURL.click(); + await this.visitorTimeOnSite.click(); + await this.addTime.click(); + await this.addTime.fill('5s'); + await this.impersonateAgent.click(); + await this.textArea.fill(triggerMessage); + await this.saveBtn.click(); + } + + public async updateTrigger(newName: string) { + await this.Name.fill(newName); + await this.Description.fill('Updating the existing trigger'); + await this.visitorTimeOnSite.click(); + await this.chatOpenedByVisitor.click(); + await this.impersonateAgent.click(); + await this.customAgent.click(); + await this.agentName.fill('Rocket.cat'); + await this.saveBtn.click(); + } +}