Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import type { Locator, Page } from '@playwright/test';

export class HomeFlextabChannels {
private readonly page: Page;

constructor(page: Page) {
this.page = page;
}

get btnAddExisting(): Locator {
return this.page.locator('button >> text="Add Existing"');
}

get inputChannels(): Locator {
return this.page.locator('#modal-root input').first();
}

get btnAdd(): Locator {
return this.page.locator('#modal-root button:has-text("Add")');
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Page } from '@playwright/test';
import type { Locator, Page } from '@playwright/test';

export class HomeFlextabRoom {
private readonly page: Page;
Expand All @@ -7,27 +7,31 @@ export class HomeFlextabRoom {
this.page = page;
}

get btnEdit() {
get btnEdit(): Locator {
return this.page.locator('//aside//button[contains(text(), "Edit")]');
}

get inputName() {
get inputName(): Locator {
return this.page.locator('//aside//label[contains(text(), "Name")]/..//input');
}

get inputTopic() {
get inputTopic(): Locator {
return this.page.locator('//main//aside//label[contains(text(), "Topic")]/..//textarea');
}

get inputAnnouncement() {
get inputAnnouncement(): Locator {
return this.page.locator('//main//aside//label[contains(text(), "Announcement")]/..//textarea');
}

get inputDescription() {
get inputDescription(): Locator {
return this.page.locator('//main//aside//label[contains(text(), "Description")]/..//textarea');
}

get btnSave() {
get checkboxReadOnly(): Locator {
return this.page.locator('text=Read OnlyOnly authorized users can write new messages >> i');
}

get btnSave(): Locator {
return this.page.locator('//aside//button[contains(text(), "Save")]');
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Locator, Page } from '@playwright/test';

import { HomeFlextabChannels } from './home-flextab-channels';
import { HomeFlextabMembers } from './home-flextab-members';
import { HomeFlextabNotificationPreferences } from './home-flextab-notificationPreferences';
import { HomeFlextabRoom } from './home-flextab-room';
Expand All @@ -11,12 +12,15 @@ export class HomeFlextab {

readonly room: HomeFlextabRoom;

readonly channels: HomeFlextabChannels;

readonly notificationPreferences: HomeFlextabNotificationPreferences;

constructor(page: Page) {
this.page = page;
this.members = new HomeFlextabMembers(page);
this.room = new HomeFlextabRoom(page);
this.channels = new HomeFlextabChannels(page);
this.notificationPreferences = new HomeFlextabNotificationPreferences(page);
}

Expand All @@ -28,6 +32,10 @@ export class HomeFlextab {
return this.page.locator('[data-qa-id=ToolBoxAction-info-circled]');
}

get btnChannels(): Locator {
return this.page.locator('[data-qa-id="ToolBoxAction-hash"]');
}

get kebab(): Locator {
return this.page.locator('[data-qa-id=ToolBox-Menu]');
}
Expand Down
33 changes: 33 additions & 0 deletions apps/meteor/tests/e2e/page-objects/home-team.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { Locator, Page } from '@playwright/test';

import { HomeContent, HomeSidenav, HomeFlextab } from './fragments';

export class HomeTeam {
private readonly page: Page;

readonly content: HomeContent;

readonly sidenav: HomeSidenav;

readonly tabs: HomeFlextab;

constructor(page: Page) {
this.page = page;
this.content = new HomeContent(page);
this.sidenav = new HomeSidenav(page);
this.tabs = new HomeFlextab(page);
}

get inputTeamName(): Locator {
return this.page.locator('.rcx-field-group__item:nth-child(1) input');
}

async addMember(memberName: string): Promise<void> {
await this.page.locator('.rcx-field-group__item:nth-child(7) input').type(memberName, { delay: 100 });
await this.page.locator(`.rcx-option__content:has-text("${memberName}")`).click();
}

get btnTeamCreate(): Locator {
return this.page.locator('#modal-root button:has-text("Create")');
}
}
1 change: 1 addition & 0 deletions apps/meteor/tests/e2e/page-objects/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export * from './admin';
export * from './auth';
export * from './home-channel';
export * from './home-discussion';
export * from './home-team';
export * from './omnichannel-agents';
export * from './omnichannel-departments';
export * from './omnichannel-livechat';
68 changes: 68 additions & 0 deletions apps/meteor/tests/e2e/team-management.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { faker } from '@faker-js/faker';

import { test, expect } from './utils/test';
import { createTargetChannel } from './utils';
import { HomeTeam } from './page-objects';

test.use({ storageState: 'admin-session.json' });

test.describe.serial('teams-management', () => {
let poHomeTeam: HomeTeam;
let targetChannel: string;
const targetTeam = faker.datatype.uuid();

test.beforeAll(async ({ api }) => {
targetChannel = await createTargetChannel(api);
});

test.beforeEach(async ({ page }) => {
poHomeTeam = new HomeTeam(page);

await page.goto('/home');
});

test('expect create "targetTeam"', async ({ page }) => {
await poHomeTeam.sidenav.openNewByLabel('Team');
await poHomeTeam.inputTeamName.type(targetTeam);
await poHomeTeam.addMember('user1');
await poHomeTeam.btnTeamCreate.click();

await expect(page).toHaveURL(`/group/${targetTeam}`);
});

test('expect throw validation error if team name already exists', async () => {
await poHomeTeam.sidenav.openNewByLabel('Team');
await poHomeTeam.inputTeamName.type(targetTeam);

await expect(poHomeTeam.btnTeamCreate).toBeDisabled();
});

test('expect send hello in the "targetTeam" and reply in a thread', async ({ page }) => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.content.sendMessage('hello');
await poHomeTeam.content.openLastMessageMenu();

await page.locator('[data-qa-id="reply-in-thread"]').click();
await page.locator('.rcx-vertical-bar .js-input-message').type('any-reply-message');
await page.keyboard.press('Enter');

await expect(poHomeTeam.tabs.flexTabViewThreadMessage).toHaveText('any-reply-message');
});

test('expect set "targetTeam" as readonly', async () => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.tabs.btnRoomInfo.click();
await poHomeTeam.tabs.room.btnEdit.click();
await poHomeTeam.tabs.room.checkboxReadOnly.click();
await poHomeTeam.tabs.room.btnSave.click();
});

test('expect insert a channel inside "targetTeam"', async ({ page }) => {
await poHomeTeam.sidenav.openChat(targetTeam);
await poHomeTeam.tabs.btnChannels.click();
await poHomeTeam.tabs.channels.btnAddExisting.click();
await poHomeTeam.tabs.channels.inputChannels.type(targetChannel, { delay: 100 });
await page.locator(`.rcx-option__content:has-text("${targetChannel}")`).click();
await poHomeTeam.tabs.channels.btnAdd.click();
});
});