Skip to content

Commit

Permalink
Add basic e2e-tests for new sidebar with channels
Browse files Browse the repository at this point in the history
Signed-off-by: Rostislav Nazmeev <[email protected]>
  • Loading branch information
kakRostropovich committed Sep 18, 2024
1 parent 78e601f commit e9d0d8b
Show file tree
Hide file tree
Showing 3 changed files with 205 additions and 1 deletion.
105 changes: 105 additions & 0 deletions tests/sanity/tests/chat/chat.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ApiEndpoint } from '../API/Api'
import { ChannelPage } from '../model/channel-page'
import { ChunterPage } from '../model/chunter-page'
import { SignUpData } from '../model/common-types'
import { SidebarPage } from '../model/sidebar-page'
import { LeftSideMenuPage } from '../model/left-side-menu-page'
import { LoginPage } from '../model/login-page'
import { SelectWorkspacePage } from '../model/select-workspace-page'
Expand All @@ -20,6 +21,7 @@ test.describe('Channel tests', () => {
let chunterPage: ChunterPage
let channelPage: ChannelPage
let loginPage: LoginPage
let sidebarPage: SidebarPage
let api: ApiEndpoint
let newUser2: SignUpData
let data: { workspaceName: string, userName: string, firstName: string, lastName: string, channelName: string }
Expand All @@ -32,6 +34,7 @@ test.describe('Channel tests', () => {
chunterPage = new ChunterPage(page)
channelPage = new ChannelPage(page)
loginPage = new LoginPage(page)
sidebarPage = new SidebarPage(page)
api = new ApiEndpoint(request)
await api.createAccount(data.userName, '1234', data.firstName, data.lastName)
await api.createWorkspaceWithLogin(data.workspaceName, data.userName, '1234')
Expand Down Expand Up @@ -512,4 +515,106 @@ test.describe('Channel tests', () => {
await channelPage.checkIfChannelTableExist('general', true)
})
})

test('User is able to work with a channel in a sidebar', async () => {
await test.step('Prepare channel', async () => {
await leftSideMenuPage.clickChunter()
await chunterPage.clickChannelBrowser()
await chunterPage.clickNewChannelHeader()
await chunterPage.createPrivateChannel(data.channelName, false)
await channelPage.checkIfChannelDefaultExist(true, data.channelName)

await leftSideMenuPage.clickChunter()
await channelPage.clickChooseChannel(data.channelName)
await channelPage.sendMessage('Test message')
})

await test.step('Open channel in sidebar', async () => {
await channelPage.makeActionWithChannelInMenu(data.channelName, 'Open in sidebar new tab')
await sidebarPage.checkIfSidebarHasVerticalTab(true, data.channelName)
await sidebarPage.checkIfSidebarIsOpen(true)
await sidebarPage.checkIfSidebarTabIsOpen('chat', data.channelName)
})

await test.step('Go to another page and check if sidebar will be keeping', async () => {
await leftSideMenuPage.clickTracker()
await sidebarPage.checkIfSidebarIsOpen(true)
await sidebarPage.checkIfSidebarTabIsOpen('chat', data.channelName)
await leftSideMenuPage.clickChunter()
})

await test.step('Close channel in sidebar', async () => {
await sidebarPage.closeOpenedVerticalTab()
await sidebarPage.checkIfSidebarHasVerticalTab(false, data.channelName)
await sidebarPage.checkIfSidebarIsOpen(false)
})

await test.step('Reopen channel in sidebar', async () => {
await channelPage.makeActionWithChannelInMenu(data.channelName, 'Open in sidebar new tab')
await sidebarPage.checkIfSidebarHasVerticalTab(true, data.channelName)
await sidebarPage.checkIfSidebarTabIsOpen('chat', data.channelName)
})

await test.step('Open general in sidebar too', async () => {
await channelPage.makeActionWithChannelInMenu('general', 'Open in sidebar new tab')
await sidebarPage.checkIfSidebarHasVerticalTab(true, data.channelName)
await sidebarPage.checkIfSidebarHasVerticalTab(true, 'general')
await sidebarPage.checkIfSidebarTabIsOpen('chat', 'general')
})

await test.step('Pin and unpin channel tab', async () => {
await sidebarPage.pinVerticalTab(data.channelName)
await sidebarPage.checkIfVerticalTabIsPinned(true, data.channelName)

await sidebarPage.unpinVerticalTab(data.channelName)
await sidebarPage.checkIfVerticalTabIsPinned(false, data.channelName)
})

await test.step('Close sidebar tab by close button in vertical tab', async () => {
await sidebarPage.clickVerticalTab(data.channelName)
await sidebarPage.closeVerticalTabByCloseButton(data.channelName)
await sidebarPage.checkIfSidebarHasVerticalTab(false, data.channelName)
await sidebarPage.checkIfSidebarTabIsOpen('chat', 'general')
})

await test.step('Close sidebar tab by context menu', async () => {
await channelPage.makeActionWithChannelInMenu('random', 'Open in sidebar new tab')
await sidebarPage.closeVerticalTabByRightClick('random')
await sidebarPage.checkIfSidebarHasVerticalTab(false, 'random')
await sidebarPage.checkIfSidebarTabIsOpen('chat', 'general')
})

await test.step('Close the last channel tab in sidebar', async () => {
await sidebarPage.closeVerticalTabByCloseButton('general')
await sidebarPage.checkIfSidebarIsOpen(false)
})
})

test.only('User is able to create sidebar thread automatically in a sidebar', async () => {
await test.step('Prepare channel', async () => {
await leftSideMenuPage.clickChunter()
await chunterPage.clickChannelBrowser()
await chunterPage.clickNewChannelHeader()
await chunterPage.createPrivateChannel(data.channelName, false)
await channelPage.checkIfChannelDefaultExist(true, data.channelName)

await leftSideMenuPage.clickChunter()
await channelPage.clickChooseChannel(data.channelName)
await channelPage.sendMessage('Test message')
})

await test.step('Open channel in sidebar', async () => {
await channelPage.replyToMessage('Test message', 'Reply message')

await sidebarPage.checkIfSidebarIsOpen(true)
await sidebarPage.checkIfSidebarHasVerticalTab(true, data.channelName)
await sidebarPage.checkIfSidebarTabIsOpen('chat', data.channelName)
await sidebarPage.checkIfSidebarTabIsOpen('chat', 'Thread')
})

await test.step('User go to another chat and sidebar with tread disappears', async () => {
await channelPage.clickChannel('random')
await sidebarPage.checkIfSidebarIsOpen(false)
})
})
})
2 changes: 1 addition & 1 deletion tests/sanity/tests/model/common-page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class CommonPage {
selectPopupButton = (): Locator => this.page.locator('div.selectPopup button')
selectPopupExpandButton = (): Locator => this.page.locator('div.selectPopup button[data-id="btnExpand"]')
popupSpanLabel = (point: string): Locator =>
this.page.locator('div[class$="opup"] span[class*="label"]', { hasText: point })
this.page.locator(`div[class$="opup"] span[class*="label"]:has-text("${point}")`)

readonly inputSearchIcon = (): Locator => this.page.locator('.searchInput-icon')

Expand Down
99 changes: 99 additions & 0 deletions tests/sanity/tests/model/sidebar-page.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { expect, Locator, Page } from '@playwright/test'
import { CommonPage } from './common-page'

export type SidebarTabTypes = 'calendar' | 'office' | 'chat'

export class SidebarPage extends CommonPage {
readonly page: Page

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

sidebar = (): Locator => this.page.locator('#sidebar')
content = (): Locator => this.sidebar().locator('.content')
contentHeaderByTitle = (title: string): Locator => this.content().locator(`.hulyHeader-titleGroup:has-text("${title}")`)
contentCloseButton = (): Locator => this.content().locator('.hulyHeader-container button.iconOnly').last()

calendarSidebarButton = (): Locator => this.sidebar().locator('button[id$="Calendar"]')
officeSidebarButton = (): Locator => this.sidebar().locator('button[id$="Office"]')
chatSidebutButton = (): Locator => this.sidebar().locator('button[id$="Chat"]')

verticalTabs = (): Locator => this.sidebar().locator('.tabs').locator('.container')
verticalTabByName = (name: string): Locator => this.sidebar().locator('.tabs').locator(`.container:has-text("${name}")`)
verticalTabCloseButton = (name: string): Locator => this.verticalTabByName(name).locator('.close-button button')

// buttonOpenChannelInSidebar =

// Actions
async checkIfSidebarIsOpen (needBeOpened: boolean): Promise<void> {
if (needBeOpened) {
await expect(this.content()).toBeVisible()
} else {
await expect(this.content()).toBeHidden()
}
}

async checkIfSidebarHasVerticalTab (needBeExist: boolean, tabName: string): Promise<void> {
if (needBeExist) {
await expect(this.verticalTabByName(tabName)).toBeVisible()
} else {
await expect(this.verticalTabByName(tabName)).toBeHidden()
}
}

async clickVerticalTab (tabName: string): Promise<void> {
await this.verticalTabByName(tabName).click()
}

async closeVerticalTabByCloseButton (tabName: string): Promise<void> {
await this.verticalTabCloseButton(tabName).click()
}

async closeOpenedVerticalTab (): Promise<void> {
await this.contentCloseButton().click()
}

async pinVerticalTab (tabName: string): Promise<void> {
await this.verticalTabByName(tabName).click({button: 'right'})
await this.page.locator('.popup').locator('button:has-text("Pin")').click()
}

async unpinVerticalTab (tabName: string): Promise<void> {
await this.verticalTabByName(tabName).click({button: 'right'})
await this.page.locator('.popup').locator('button:has-text("Unpin")').click()
}

async closeVerticalTabByRightClick (tabName: string): Promise<void> {
await this.verticalTabByName(tabName).click({button: 'right'})
await this.page.locator('.popup').locator('button:has-text("Close")').click()
}

async checkIfVerticalTabIsPinned (needBePinned: boolean, tabName: string): Promise<void> {
if (needBePinned) {
await expect(this.verticalTabCloseButton(tabName)).toBeHidden()
} else {
await expect(this.verticalTabCloseButton(tabName)).toBeVisible()
}
}

async checkNumberOfVerticalTabs (count: number): Promise<void> {
await expect(this.verticalTabs()).toHaveCount(count)
}

async checkIfSidebarTabIsOpen (type: SidebarTabTypes, tabName: string): Promise<void> {
switch (type) {
case 'chat':
await expect(this.contentHeaderByTitle(tabName)).toBeVisible()
break
case 'office':
await expect(this.contentHeaderByTitle('Office')).toBeVisible()
break
case 'calendar':
const currentYear = new Date().getFullYear()
await expect(this.contentHeaderByTitle(tabName)).toBeVisible()
break
}
}
}

0 comments on commit e9d0d8b

Please sign in to comment.