diff --git a/apps/meteor/tests/e2e/omnichannel-auto-onhold-chat-closing.spec.ts b/apps/meteor/tests/e2e/omnichannel-auto-onhold-chat-closing.spec.ts index 773d65164f625..d6a71c91c2f36 100644 --- a/apps/meteor/tests/e2e/omnichannel-auto-onhold-chat-closing.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-auto-onhold-chat-closing.spec.ts @@ -23,21 +23,12 @@ test.describe('omnichannel-auto-onhold-chat-closing', () => { let agent: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - // make "user-1" an agent and manager - let statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); - - // turn on auto selection routing - statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' })).status(); - await expect(statusCode).toBe(200); - - // make auto close on-hold chats timeout to be 5 seconds - statusCode = (await api.post('/settings/Livechat_auto_close_on_hold_chats_timeout', { value: 5 })).status(); - await expect(statusCode).toBe(200); - - // allow agents to manually place chats on-hold - statusCode = (await api.post('/settings/Livechat_allow_manual_on_hold', { value: true })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_auto_close_on_hold_chats_timeout', { value: 5 }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_allow_manual_on_hold', { value: true }).then((res) => expect(res.status()).toBe(200)), + ]); agent = await createAuxContext(browser, 'user1-session.json'); }); @@ -88,16 +79,12 @@ test.describe('omnichannel-auto-onhold-chat-closing', () => { }); test.afterAll(async ({ api }) => { - // delete "user-1" from agents - let statusCode = (await api.delete('/livechat/users/agent/user1')).status(); - await expect(statusCode).toBe(200); - - // reset auto close on-hold chats timeout - statusCode = (await api.post('/settings/Livechat_auto_close_on_hold_chats_timeout', { value: 3600 })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_auto_close_on_hold_chats_timeout', { value: 3600 }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_allow_manual_on_hold', { value: false }).then((res) => expect(res.status()).toBe(200)), + ]); - // reset setting which allows agents to manually place chats on-hold - statusCode = (await api.post('/settings/Livechat_allow_manual_on_hold', { value: false })).status(); - await expect(statusCode).toBe(200); + await agent.page.close(); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel-auto-transfer-unanswered-chat.spec.ts b/apps/meteor/tests/e2e/omnichannel-auto-transfer-unanswered-chat.spec.ts index 8f4f14ee60dcf..9a441d51d579b 100644 --- a/apps/meteor/tests/e2e/omnichannel-auto-transfer-unanswered-chat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-auto-transfer-unanswered-chat.spec.ts @@ -24,19 +24,12 @@ test.describe('omnichannel-auto-transfer-unanswered-chat', () => { let agent2: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - // make "user-1" & "user-2" an agent - let statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); - statusCode = (await api.post('/livechat/users/agent', { username: 'user2' })).status(); - await expect(statusCode).toBe(200); - - // turn on auto selection routing - statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' })).status(); - await expect(statusCode).toBe(200); - - // make auto close on-hold chats timeout to be 5 seconds - statusCode = (await api.post('/settings/Livechat_auto_transfer_chat_timeout', { value: 5 })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), + api.post('/livechat/users/agent', { username: 'user2' }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_auto_transfer_chat_timeout', { value: 5 }).then((res) => expect(res.status()).toBe(200)), + ]); agent1 = await createAuxContext(browser, 'user1-session.json'); agent2 = await createAuxContext(browser, 'user2-session.json'); @@ -72,16 +65,13 @@ test.describe('omnichannel-auto-transfer-unanswered-chat', () => { }); test.afterAll(async ({ api }) => { - // delete "user-1" from agents - let statusCode = (await api.delete('/livechat/users/agent/user1')).status(); - await expect(statusCode).toBe(200); - - // delete "user-2" from agents - statusCode = (await api.delete('/livechat/users/agent/user2')).status(); - await expect(statusCode).toBe(200); - - // reset auto close on-hold chats timeout - statusCode = (await api.post('/settings/Livechat_auto_transfer_chat_timeout', { value: 0 })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), + api.delete('/livechat/users/agent/user2').then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_auto_transfer_chat_timeout', { value: 0 }).then((res) => expect(res.status()).toBe(200)), + ]); + + await agent1.page.close(); + await agent2.page.close(); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel-canned-responses-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel-canned-responses-sidebar.spec.ts index 78a8536e435cb..5a959b5528569 100644 --- a/apps/meteor/tests/e2e/omnichannel-canned-responses-sidebar.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-canned-responses-sidebar.spec.ts @@ -40,6 +40,7 @@ test.describe('Omnichannel Canned Responses Sidebar', () => { test.afterAll(async ({ api }) => { await api.delete('/livechat/users/agent/user1'); await api.delete('/livechat/users/manager/user1'); + await agent.page.close(); }); test('Receiving a message from visitor', async ({ page }) => { diff --git a/apps/meteor/tests/e2e/omnichannel-chat-history.spec.ts b/apps/meteor/tests/e2e/omnichannel-chat-history.spec.ts index cc4ba1958ed36..7b22033083a29 100644 --- a/apps/meteor/tests/e2e/omnichannel-chat-history.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-chat-history.spec.ts @@ -37,6 +37,7 @@ test.describe('Omnichannel chat histr', () => { test.afterAll(async ({ api }) => { await api.delete('/livechat/users/agent/user1'); await api.delete('/livechat/users/manager/user1'); + await agent.page.close(); }); test('Receiving a message from visitor', async ({ page }) => { diff --git a/apps/meteor/tests/e2e/omnichannel-contact-info.spec.ts b/apps/meteor/tests/e2e/omnichannel-contact-info.spec.ts index 8417ee1a2c79d..cf92363561b82 100644 --- a/apps/meteor/tests/e2e/omnichannel-contact-info.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-contact-info.spec.ts @@ -37,6 +37,7 @@ test.describe('Omnichannel contact info', () => { test.afterAll(async ({ api }) => { await api.delete('/livechat/users/agent/user1'); await api.delete('/livechat/users/manager/user1'); + await agent.page.close(); }); test('Receiving a message from visitor, and seeing its information', async ({ page }) => { diff --git a/apps/meteor/tests/e2e/omnichannel-departaments-ce.spec.ts b/apps/meteor/tests/e2e/omnichannel-departaments-ce.spec.ts new file mode 100644 index 0000000000000..37e136bad53ed --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel-departaments-ce.spec.ts @@ -0,0 +1,47 @@ +import { faker } from '@faker-js/faker'; +import type { Page } from '@playwright/test'; + +import { IS_EE } from './config/constants'; +import { OmnichannelDepartments } from './page-objects'; +import { test, expect } from './utils/test'; + +test.use({ storageState: 'admin-session.json' }); + +test.describe.serial('omnichannel-departments', () => { + test.skip(IS_EE, 'Community Edition Only'); + let poOmnichannelDepartments: OmnichannelDepartments; + + let departmentName: string; + + test.beforeAll(async () => { + departmentName = faker.datatype.uuid(); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannelDepartments = new OmnichannelDepartments(page); + + await page.goto('/omnichannel'); + await poOmnichannelDepartments.sidenav.linkDepartments.click(); + }); + + test('CE departments', async () => { + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.btnNew.click(); + await poOmnichannelDepartments.btnEnabled.click(); + await poOmnichannelDepartments.inputName.fill(departmentName); + await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); + await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.btnCloseToastSuccess.click(); + + await poOmnichannelDepartments.inputSearch.fill(departmentName); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); + await test.step('expect to not be possible adding a second department ', async () => { + await poOmnichannelDepartments.btnNew.click(); + + await expect(poOmnichannelDepartments.upgradeDepartmentsModal).toBeVisible(); + + await poOmnichannelDepartments.btnUpgradeDepartmentsModalClose.click(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel-departaments.spec.ts b/apps/meteor/tests/e2e/omnichannel-departaments.spec.ts index 3450e64273f2a..ce67550e8ee02 100644 --- a/apps/meteor/tests/e2e/omnichannel-departaments.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-departaments.spec.ts @@ -13,8 +13,6 @@ test.describe.serial('omnichannel-departments', () => { let departmentName: string; - let url: string; - test.beforeAll(async ({ api }) => { departmentName = faker.datatype.uuid(); // turn on department removal @@ -29,69 +27,136 @@ test.describe.serial('omnichannel-departments', () => { await poOmnichannelDepartments.sidenav.linkDepartments.click(); }); - test('expect page to be empty', async ({ page }) => { - await page.goto('/omnichannel/departments/edit/this-department-dont-exist'); - await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); - }); + test('Manage departments', async ({ page }) => { + let url: string; + await test.step('expect page to be empty', async () => { + await page.goto('/omnichannel/departments/edit/this-department-dont-exist'); + await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); + await page.goBack(); + }); + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.btnNew.click(); + await poOmnichannelDepartments.btnEnabled.click(); + await poOmnichannelDepartments.inputName.fill(departmentName); + await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); + await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.btnCloseToastSuccess.click(); - test('expect create new department', async () => { - await poOmnichannelDepartments.btnNew.click(); - await poOmnichannelDepartments.btnEnabled.click(); - await poOmnichannelDepartments.inputName.fill(departmentName); - await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); - await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.inputSearch.fill(departmentName); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await poOmnichannelDepartments.inputSearch.fill(departmentName); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - }); + await test.step('expect update department name', async () => { + await poOmnichannelDepartments.inputSearch.fill(departmentName); + + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); - test('expect to not be possible adding a second department ', async () => { - test.skip(IS_EE, 'Community Edition Only'); + url = await page.url(); - await poOmnichannelDepartments.btnNew.click(); + await poOmnichannelDepartments.inputName.fill(`edited-${departmentName}`); + await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.btnCloseToastSuccess.click(); - await expect(poOmnichannelDepartments.upgradeDepartmentsModal).toBeVisible(); + await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await poOmnichannelDepartments.btnUpgradeDepartmentsModalClose.click(); - }); + await test.step('expect archive department', async () => { + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - test('expect update department name', async ({ page }) => { - await poOmnichannelDepartments.inputSearch.fill(departmentName); + await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); + await poOmnichannelDepartments.firstRowInTableMenu.click(); - url = await page.url(); + await poOmnichannelDepartments.menuArchiveOption.click(); - await poOmnichannelDepartments.inputName.fill(`edited-${departmentName}`); - await poOmnichannelDepartments.btnSave.click(); + await expect(poOmnichannelDepartments.toastSuccess).toBeVisible(); + }); - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - }); + await test.step('expect archived department to not be editable', async () => { + // Try to edit + await page.goto(url); + + await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); + + await page.goBack(); + }); + + await test.step('expect unarchive department', async () => { + await poOmnichannelDepartments.archivedDepartmentsTab.click(); + + await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - test.describe('Tags', () => { - test.beforeEach(async () => { - await poOmnichannelDepartments.inputSearch.fill(departmentName); await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); + + await poOmnichannelDepartments.menuUnarchiveOption.click(); + + await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); + }); + + await test.step('expect delete department', async () => { + await poOmnichannelDepartments.allDepartmentsTab.click(); + + await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); + + await poOmnichannelDepartments.selectedDepartmentMenu(`edited-${departmentName}`).click(); + + await poOmnichannelDepartments.menuDeleteOption.click(); + + await poOmnichannelDepartments.inputModalConfirmDelete.fill(`edited-${departmentName}`); + + await poOmnichannelDepartments.btnModalConfirmDelete.click(); + + await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); + + await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); + }); + }); + + test('Tags', async () => { + const tagsDepartmentName = faker.datatype.uuid(); + + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.btnNew.click(); + await poOmnichannelDepartments.btnEnabled.click(); + await poOmnichannelDepartments.inputName.fill(tagsDepartmentName); + await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); + await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.btnCloseToastSuccess.click(); + + await poOmnichannelDepartments.inputSearch.fill(tagsDepartmentName); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); }); - test('expect save form button be disabled', async () => { + await test.step('expect save form button be disabled', async () => { + await poOmnichannelDepartments.inputSearch.fill(tagsDepartmentName); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); + await poOmnichannelDepartments.btnBack.click(); }); - test('Disabled tags state', async () => { + await test.step('Disabled tags state', async () => { + await poOmnichannelDepartments.inputSearch.fill(tagsDepartmentName); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); + await test.step('expect to have department tags toggle button', async () => { await expect(poOmnichannelDepartments.toggleRequestTags).toBeVisible(); }); await test.step('expect have no add tag to department', async () => { await expect(poOmnichannelDepartments.inputTags).not.toBeVisible(); await expect(poOmnichannelDepartments.btnTagsAdd).not.toBeVisible(); + await poOmnichannelDepartments.btnBack.click(); }); }); - test('Enabled tags state', async ({ page }) => { + await test.step('Enabled tags state', async () => { + await poOmnichannelDepartments.inputSearch.fill(tagsDepartmentName); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); + await test.step('expect to have form save option disabled', async () => { await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); }); @@ -116,11 +181,11 @@ test.describe.serial('omnichannel-departments', () => { await poOmnichannelDepartments.inputTags.fill(tagName); await poOmnichannelDepartments.btnTagsAdd.click(); - await expect(page.locator(`button`, { hasText: tagName })).toBeVisible(); + await expect(poOmnichannelDepartments.btnTag(tagName)).toBeVisible(); await expect(poOmnichannelDepartments.btnSave).toBeEnabled(); - await page.locator(`button`, { hasText: tagName }).click(); + await poOmnichannelDepartments.btnTag(tagName).click(); await expect(poOmnichannelDepartments.invalidInputTags).toBeVisible(); await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); }); @@ -133,56 +198,4 @@ test.describe.serial('omnichannel-departments', () => { }); }); }); - - test('expect archive and unarchive department', async ({ page }) => { - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - - await poOmnichannelDepartments.firstRowInTableMenu.click(); - - await poOmnichannelDepartments.menuArchiveOption.click(); - - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); - - // Try to edit - - await page.goto(url); - - await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); - - await page.goBack(); - - await poOmnichannelDepartments.archivedDepartmentsTab.click(); - - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - - await poOmnichannelDepartments.firstRowInTableMenu.click(); - - await poOmnichannelDepartments.menuUnarchiveOption.click(); - - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); - - await poOmnichannelDepartments.allDepartmentsTab.click(); - }); - - test('expect delete department', async () => { - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - - await poOmnichannelDepartments.firstRowInTableMenu.click(); - - await poOmnichannelDepartments.menuDeleteOption.click(); - - await poOmnichannelDepartments.inputModalConfirmDelete.fill(`edited-${departmentName}`); - - await poOmnichannelDepartments.btnModalConfirmDelete.click(); - - await poOmnichannelDepartments.inputSearch.fill(`edited-${departmentName}`); - - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); - }); }); diff --git a/apps/meteor/tests/e2e/omnichannel-livechat.spec.ts b/apps/meteor/tests/e2e/omnichannel-livechat.spec.ts index bdfa87a3736b2..6dcfa775d2126 100644 --- a/apps/meteor/tests/e2e/omnichannel-livechat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-livechat.spec.ts @@ -12,7 +12,7 @@ const createAuxContext = async (browser: Browser, storageState: string): Promise }; const newUser = { - name: faker.name.firstName(), + name: `${faker.name.firstName()} ${faker.datatype.uuid()}}`, email: faker.internet.email(), }; test.describe('Livechat', () => { diff --git a/apps/meteor/tests/e2e/omnichannel-manager.spec.ts b/apps/meteor/tests/e2e/omnichannel-manager.spec.ts index ce83ebb696786..0f81512ec13fa 100644 --- a/apps/meteor/tests/e2e/omnichannel-manager.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-manager.spec.ts @@ -13,18 +13,19 @@ test.describe.serial('omnichannel-manager', () => { await poOmnichannelManagers.sidenav.linkManagers.click(); }); - test('expect add "user1" as manager', async ({ page }) => { - await poOmnichannelManagers.inputUsername.type('user1 ', { delay: 1000 }); - await page.keyboard.press('Enter'); - await poOmnichannelManagers.btnAdd.click(); - - await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); - }); - - test('expect remove "user1" as manager', async () => { - await poOmnichannelManagers.btnDeleteFirstRowInTable.click(); - await poOmnichannelManagers.btnModalRemove.click(); - - await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeHidden(); + test('Managers', async ({ page }) => { + await test.step('expect add "user1" as manager', async () => { + await poOmnichannelManagers.inputUsername.type('user1 ', { delay: 1000 }); + await page.keyboard.press('Enter'); + await poOmnichannelManagers.btnAdd.click(); + + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); + }); + await test.step('expect remove "user1" as manager', async () => { + await poOmnichannelManagers.btnDeleteSelectedAgent('user1').click(); + await poOmnichannelManagers.btnModalRemove.click(); + + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeHidden(); + }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel-priorities.spec.ts b/apps/meteor/tests/e2e/omnichannel-priorities.spec.ts index 5066ccb7a576c..087a25ea1309b 100644 --- a/apps/meteor/tests/e2e/omnichannel-priorities.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-priorities.spec.ts @@ -18,8 +18,10 @@ test.describe.serial('Omnichannel Priorities', () => { let poOmnichannelPriorities: OmnichannelPriorities; test.beforeAll(async ({ api }) => { - await api.post('/livechat/users/agent', { username: 'user1' }); - await api.post('/livechat/users/manager', { username: 'user1' }); + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }), + api.post('/livechat/users/manager', { username: 'user1' }), + ]); }); test.beforeEach(async ({ page }) => { @@ -30,17 +32,18 @@ test.describe.serial('Omnichannel Priorities', () => { }); test.afterAll(async ({ api }) => { - await api.delete('/livechat/users/agent/user1'); - await api.delete('/livechat/users/manager/user1'); + await Promise.all([api.delete('/livechat/users/agent/user1'), api.delete('/livechat/users/manager/user1')]); }); test('Manage Priorities', async () => { await test.step('All default priorities should be visible', async () => { - await expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('High')).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Medium')).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Low')).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Lowest')).toBeVisible(); + await Promise.all([ + expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('High')).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Medium')).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Low')).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Lowest')).toBeVisible(), + ]); }); await test.step('Add new priority', async () => { @@ -48,9 +51,11 @@ test.describe.serial('Omnichannel Priorities', () => { await poOmnichannelPriorities.findPriority('Highest').click(); await test.step('default state', async () => { - await expect(poOmnichannelPriorities.managePriority.btnSave).toBeDisabled(); - await expect(poOmnichannelPriorities.managePriority.btnReset).not.toBeVisible(); - await expect(poOmnichannelPriorities.managePriority.inputName).toHaveValue('Highest'); + await Promise.all([ + expect(poOmnichannelPriorities.managePriority.btnSave).toBeDisabled(), + expect(poOmnichannelPriorities.managePriority.btnReset).not.toBeVisible(), + expect(poOmnichannelPriorities.managePriority.inputName).toHaveValue('Highest'), + ]); }); await test.step('field name is required', async () => { @@ -63,13 +68,18 @@ test.describe.serial('Omnichannel Priorities', () => { await test.step('edit and save priority', async () => { await poOmnichannelPriorities.managePriority.inputName.fill(PRIORITY_NAME); - await expect(poOmnichannelPriorities.managePriority.btnReset).toBeVisible(); - await expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(); + await Promise.all([ + expect(poOmnichannelPriorities.managePriority.btnReset).toBeVisible(), + expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(), + ]); await poOmnichannelPriorities.managePriority.btnSave.click(); - await expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(); - await expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Highest')).not.toBeVisible(); + await Promise.all([ + poOmnichannelPriorities.btnCloseToastSuccess.click(), + expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(), + expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Highest')).not.toBeVisible(), + ]); }); }); @@ -78,11 +88,14 @@ test.describe.serial('Omnichannel Priorities', () => { await poOmnichannelPriorities.findPriority(PRIORITY_NAME).click(); await expect(poOmnichannelPriorities.managePriority.btnReset).toBeVisible(); await poOmnichannelPriorities.managePriority.btnReset.click(); - await expect(poOmnichannelPriorities.managePriority.inputName).toHaveValue('Highest'); - await expect(poOmnichannelPriorities.managePriority.btnReset).not.toBeVisible(); + await Promise.all([ + expect(poOmnichannelPriorities.managePriority.inputName).toHaveValue('Highest'), + expect(poOmnichannelPriorities.managePriority.btnReset).not.toBeVisible(), + ]); await expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(); await poOmnichannelPriorities.managePriority.btnSave.click(); + await poOmnichannelPriorities.btnCloseToastSuccess.click(); await expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(); await expect(poOmnichannelPriorities.btnReset).not.toBeEnabled(); }); @@ -91,22 +104,28 @@ test.describe.serial('Omnichannel Priorities', () => { await poOmnichannelPriorities.findPriority('Highest').click(); await poOmnichannelPriorities.managePriority.inputName.fill(PRIORITY_NAME); - await expect(poOmnichannelPriorities.managePriority.btnReset).toBeVisible(); - await expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(); + await Promise.all([ + expect(poOmnichannelPriorities.managePriority.btnReset).toBeVisible(), + expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(), + ]); await poOmnichannelPriorities.managePriority.btnSave.click(); - - await expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(); - await expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Highest')).not.toBeVisible(); + await poOmnichannelPriorities.btnCloseToastSuccess.click(); + await Promise.all([ + expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(), + expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Highest')).not.toBeVisible(), + ]); await expect(poOmnichannelPriorities.btnReset).toBeEnabled(); await poOmnichannelPriorities.btnReset.click(); await poOmnichannelPriorities.btnResetConfirm.click(); - await expect(poOmnichannelPriorities.toastSuccess).toBeVisible(); - await expect(poOmnichannelPriorities.btnReset).not.toBeEnabled(); - await expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).not.toBeVisible(); - await expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(); + await Promise.all([ + expect(poOmnichannelPriorities.toastSuccess).toBeVisible(), + expect(poOmnichannelPriorities.btnReset).not.toBeEnabled(), + expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).not.toBeVisible(), + expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(), + ]); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel-takeChat.spec.ts b/apps/meteor/tests/e2e/omnichannel-takeChat.spec.ts index abee7cd4b023c..39b91efb57e98 100644 --- a/apps/meteor/tests/e2e/omnichannel-takeChat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-takeChat.spec.ts @@ -20,17 +20,11 @@ test.describe('omnichannel-takeChat', () => { let agent: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - // make "user-1" an agent and manager - let statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); - - // turn on manual selection routing - statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' })).status(); - await expect(statusCode).toBe(200); - - // turn off setting which allows offline agents to chat - statusCode = (await api.post('/settings/Livechat_enabled_when_agent_idle', { value: false })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + await api.post('/livechat/users/agent', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), + await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }).then((res) => expect(res.status()).toBe(200)), + await api.post('/settings/Livechat_enabled_when_agent_idle', { value: false }).then((res) => expect(res.status()).toBe(200)), + ]); agent = await createAuxContext(browser, 'user1-session.json'); }); @@ -41,7 +35,7 @@ test.describe('omnichannel-takeChat', () => { // start a new chat for each test newVisitor = { - name: faker.name.firstName(), + name: `${faker.name.firstName()} ${faker.datatype.uuid()}`, email: faker.internet.email(), }; poLiveChat = new OmnichannelLiveChat(page); @@ -53,17 +47,13 @@ test.describe('omnichannel-takeChat', () => { }); test.afterAll(async ({ api }) => { - // turn off manual selection routing - let statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' })).status(); - await expect(statusCode).toBe(200); - - // turn on setting which allows offline agents to chat - statusCode = (await api.post('/settings/Livechat_enabled_when_agent_idle', { value: true })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }).then((res) => expect(res.status()).toBe(200)), + await api.post('/settings/Livechat_enabled_when_agent_idle', { value: false }).then((res) => expect(res.status()).toBe(200)), + await api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), + ]); - // delete "user-1" from agents - statusCode = (await api.delete('/livechat/users/agent/user1')).status(); - await expect(statusCode).toBe(200); + await agent.page.close(); }); test('expect "user1" to be able to take the chat from the queue', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel-transfer-to-another-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel-transfer-to-another-agents.spec.ts index 407bff44cd8c7..1132a355cf9eb 100644 --- a/apps/meteor/tests/e2e/omnichannel-transfer-to-another-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-transfer-to-another-agents.spec.ts @@ -20,21 +20,17 @@ test.describe('omnichannel-transfer-to-another-agent', () => { let agent1: { page: Page; poHomeOmnichannel: HomeOmnichannel }; let agent2: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - // Set user user 1 as manager and agent - let statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); - statusCode = (await api.post('/livechat/users/agent', { username: 'user2' })).status(); - await expect(statusCode).toBe(200); - statusCode = (await api.post('/livechat/users/manager', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); - - // turn off setting which allows offline agents to chat - statusCode = (await api.post('/settings/Livechat_enabled_when_agent_idle', { value: false })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), + api.post('/livechat/users/agent', { username: 'user2' }).then((res) => expect(res.status()).toBe(200)), + api.post('/livechat/users/manager', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_enabled_when_agent_idle', { value: false }).then((res) => expect(res.status()).toBe(200)), + ]); agent1 = await createAuxContext(browser, 'user1-session.json'); agent2 = await createAuxContext(browser, 'user2-session.json'); }); + test.beforeEach(async ({ page }) => { // make "user-1" online & "user-2" offline so that chat can be automatically routed to "user-1" await agent1.poHomeOmnichannel.sidenav.switchStatus('online'); @@ -54,17 +50,15 @@ test.describe('omnichannel-transfer-to-another-agent', () => { }); test.afterAll(async ({ api }) => { - // delete "user-1" & "user-2" from agents & managers - let statusCode = (await api.delete('/livechat/users/agent/user1')).status(); - await expect(statusCode).toBe(200); - statusCode = (await api.delete('/livechat/users/manager/user1')).status(); - await expect(statusCode).toBe(200); - statusCode = (await api.delete('/livechat/users/agent/user2')).status(); - await expect(statusCode).toBe(200); - - // turn on setting which allows offline agents to chat - statusCode = (await api.post('/settings/Livechat_enabled_when_agent_idle', { value: true })).status(); - await expect(statusCode).toBe(200); + await Promise.all([ + api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), + api.delete('/livechat/users/manager/user1').then((res) => expect(res.status()).toBe(200)), + api.delete('/livechat/users/agent/user2').then((res) => expect(res.status()).toBe(200)), + api.post('/settings/Livechat_enabled_when_agent_idle', { value: true }).then((res) => expect(res.status()).toBe(200)), + ]); + + await agent1.page.close(); + await agent2.page.close(); }); test('transfer omnichannel chat to another agent', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts b/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts index 5b3a5e308f9ac..3de3e7a3ae5fe 100644 --- a/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel-triggers.spec.ts @@ -27,8 +27,10 @@ test.describe.serial('omnichannel-triggers', () => { }; 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' }); + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }), + api.post('/livechat/users/manager', { username: 'user1' }), + ]); agent = await createAuxContext(browser, 'user1-session.json'); }); @@ -37,37 +39,37 @@ test.describe.serial('omnichannel-triggers', () => { }); test.afterAll(async ({ api }) => { - await api.delete('/livechat/users/agent/user1'); - await api.delete('/livechat/users/manager/user1'); + await Promise.all([api.delete('/livechat/users/agent/user1'), api.delete('/livechat/users/manager/user1')]); + await agent.page.close(); }); - 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('Triggers', async ({ page }) => { + await test.step('expect create new trigger', async () => { + await agent.poHomeOmnichannel.triggers.createTrigger(triggersName, triggerMessage); + await expect(agent.poHomeOmnichannel.triggers.toastMessage).toBeVisible(); + }); + await test.step('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(); + }); + await test.step('expect triggers to be displaye on Livechat', async () => { + 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(); + await page.goBack(); + }); + }); + await test.step('expect deleting trigger', async () => { + await agent.poHomeOmnichannel.triggers.btnDeletefirstRowInTable.click(); + await agent.poHomeOmnichannel.triggers.btnModalRemove.click(); + await expect(agent.poHomeOmnichannel.triggers.removeToastMessage).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/omnichannel-departments.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts index 558997e2f39b2..f4c20bd078e8a 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts @@ -1,4 +1,4 @@ -import type { Page } from '@playwright/test'; +import type { Page, Locator } from '@playwright/test'; import { OmnichannelSidenav } from './fragments'; @@ -52,6 +52,10 @@ export class OmnichannelDepartments { return this.page.locator('button.rcx-button--primary.rcx-button >> text="Save"'); } + get btnBack() { + return this.page.locator('button.rcx-button >> text=" Back"'); + } + get allDepartmentsTab() { return this.page.locator('[role="tab"]:first-child'); } @@ -68,6 +72,14 @@ export class OmnichannelDepartments { return this.page.locator('table tr:first-child [data-testid="menu"]'); } + findDepartment(name: string) { + return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}`) }); + } + + selectedDepartmentMenu(name: string) { + return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}"`) }).locator('[data-testid="menu"]'); + } + get menuEditOption() { return this.page.locator('[role=option][value="edit"]'); } @@ -107,4 +119,16 @@ export class OmnichannelDepartments { get btnUpgradeDepartmentsModalUpgrade() { return this.page.locator('[data-qa-id="upgrade-now"]'); } + + get toastSuccess(): Locator { + return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); + } + + get btnCloseToastSuccess(): Locator { + return this.toastSuccess.locator('button'); + } + + btnTag(tagName: string) { + return this.page.locator('button', { hasText: tagName }); + } } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts index 8f0406800ed45..78ff9bcab6524 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts @@ -28,6 +28,10 @@ export class OmnichannelManager { return this.page.locator('button[title="Remove"]'); } + btnDeleteSelectedAgent(text: string) { + return this.page.locator('tr', { has: this.page.locator(`td >> text="${text}"`) }).locator('button[title="Remove"]'); + } + get btnModalRemove(): Locator { return this.page.locator('#modal-root dialog .rcx-modal__inner .rcx-modal__footer .rcx-button--danger'); } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts index 1941c78f92ca1..e48ac60084bee 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts @@ -59,6 +59,10 @@ export class OmnichannelPriorities { return this.page.locator('.rcx-modal').locator('role=button[name="Reset"]'); } + get btnCloseToastSuccess(): Locator { + return this.toastSuccess.locator('button'); + } + findPriority(name: string) { return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}"`) }); }