mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.3 KiB
156 lines
5.3 KiB
import { expect } from '@playwright/test'; |
|
import { DashboardPage } from '../..'; |
|
import BasePage from '../../../Base'; |
|
import { TiptapPage } from './Tiptap'; |
|
import { DocsHistoryPage } from './History'; |
|
|
|
export class DocsOpenedPagePage extends BasePage { |
|
readonly dashboard: DashboardPage; |
|
readonly tiptap: TiptapPage; |
|
readonly history: DocsHistoryPage; |
|
|
|
constructor(dashboard: DashboardPage) { |
|
super(dashboard.rootPage); |
|
this.dashboard = dashboard; |
|
this.tiptap = new TiptapPage(this); |
|
this.history = new DocsHistoryPage(this); |
|
} |
|
|
|
get() { |
|
return this.dashboard.get().getByTestId('docs-opened-page'); |
|
} |
|
|
|
async waitForRender() { |
|
await this.get().waitFor({ state: 'visible' }); |
|
await this.get().getByTestId('docs-page-title').waitFor({ state: 'visible' }); |
|
await this.get() |
|
.getByTestId('docs-page-title') |
|
.elementHandle() |
|
.then(async el => { |
|
await el?.waitForElementState('stable'); |
|
}); |
|
} |
|
|
|
async fillTitle({ title }: { title: string }) { |
|
await this.waitForRender(); |
|
|
|
await this.get().getByTestId('docs-page-title').click(); |
|
|
|
await this.get().getByTestId('docs-page-title').press('Meta+A'); |
|
await this.get().getByTestId('docs-page-title').press('Backspace'); |
|
|
|
await this.waitForResponse({ |
|
uiAction: () => this.get().getByTestId('docs-page-title').type(title, { delay: 0 }), |
|
httpMethodsToMatch: ['PUT'], |
|
requestUrlPathToMatch: `api/v1/docs/page`, |
|
}); |
|
} |
|
|
|
async verifyTitle({ title }: { title: string }) { |
|
await expect.poll(() => this.get().getByTestId('docs-page-title').inputValue()).toBe(title); |
|
} |
|
|
|
async verifyPageOutlineOpened({ isOpened }: { isOpened: boolean }) { |
|
if (isOpened) { |
|
await expect(this.rootPage.getByTestId('docs-page-outline-toggle')).toBeVisible(); |
|
await expect(this.rootPage.getByTestId('docs-page-outline-toggle')).toHaveAttribute('aria-expanded', 'true'); |
|
await expect(this.rootPage.getByTestId('docs-page-outline-content')).toBeVisible(); |
|
} else { |
|
await expect(this.rootPage.getByTestId('docs-page-outline-toggle')).toBeVisible(); |
|
await expect(this.rootPage.getByTestId('docs-page-outline-toggle')).toHaveAttribute('aria-expanded', 'false'); |
|
await expect(this.rootPage.getByTestId('docs-page-outline-content')).not.toBeVisible(); |
|
} |
|
} |
|
|
|
async verifyOpenedPageVisible() { |
|
await expect(this.get()).toBeVisible(); |
|
} |
|
|
|
async selectEmoji({ emoji }: { emoji: string }) { |
|
await this.get().getByTestId('nc-doc-opened-page-icon-picker').hover(); |
|
await this.get().getByTestId('nc-doc-opened-page-icon-picker').click(); |
|
|
|
await this.rootPage.getByTestId('nc-emoji-filter').last().type(emoji); |
|
|
|
await this.rootPage.waitForTimeout(500); |
|
|
|
await this.waitForResponse({ |
|
uiAction: () => |
|
this.rootPage.getByTestId('nc-emoji-container').last().locator(`.nc-emoji-item >> svg`).first().click(), |
|
httpMethodsToMatch: ['PUT'], |
|
requestUrlPathToMatch: `api/v1/docs/page`, |
|
}); |
|
} |
|
|
|
async verifyTitleEmoji({ emoji }: { emoji: string }) { |
|
await expect( |
|
this.get().getByTestId('docs-page-title-wrapper').getByTestId(`nc-doc-page-icon-emojione:${emoji}`) |
|
).toBeVisible(); |
|
} |
|
|
|
async verifyChildPage({ title }: { title: string }) { |
|
await this.get() |
|
.locator('.docs-page-child-pages') |
|
.locator(`.docs-page-child-page >> text=${title}`) |
|
.scrollIntoViewIfNeeded(); |
|
|
|
await expect( |
|
this.get().locator('.docs-page-child-pages').locator(`.docs-page-child-page >> text=${title}`) |
|
).toBeVisible(); |
|
} |
|
|
|
async verifyChildPagesNotVisible() { |
|
await expect(this.get().locator('.docs-page-child-pages')).not.toBeVisible(); |
|
} |
|
|
|
async verifyTitleIsReadOnly({ editable }: { editable: boolean }) { |
|
await expect(this.get().getByTestId('docs-page-title')).toBeEditable({ |
|
editable: editable, |
|
}); |
|
} |
|
|
|
async verifyContentIsReadOnly({ editable }: { editable: boolean }) { |
|
await expect(this.get().getByTestId('docs-page-content').locator('.ProseMirror')).toHaveAttribute( |
|
'contenteditable', |
|
editable ? 'true' : 'false' |
|
); |
|
} |
|
|
|
async togglePageOutline() { |
|
await this.rootPage.getByTestId('docs-page-outline-toggle').click(); |
|
} |
|
|
|
async verifyPageOutline({ pages }: { pages: { title: string; active?: boolean; level?: number }[] }) { |
|
for (let index = 0; index < pages.length; index++) { |
|
const { title, active, level } = pages[index]; |
|
await expect(this.rootPage.getByTestId(`docs-page-outline-subheading-${index}`)).toHaveText(title); |
|
|
|
if (active) { |
|
await expect(this.rootPage.getByTestId(`docs-page-outline-subheading-${index}`)).toHaveAttribute( |
|
'aria-current', |
|
'page' |
|
); |
|
} |
|
|
|
if (level) { |
|
await expect(this.rootPage.getByTestId(`docs-page-outline-subheading-${index}`)).toHaveAttribute( |
|
'aria-level', |
|
level.toString() |
|
); |
|
} |
|
} |
|
} |
|
|
|
async verifyBreadcrumb({ pages }: { pages: { title: string; emoji?: string }[] }) { |
|
for (let index = 0; index < pages.length; index++) { |
|
const { title, emoji } = pages[index]; |
|
await expect(this.get().getByTestId(`nc-doc-page-breadcrumb-${index}`)).toHaveText(title); |
|
|
|
if (emoji) { |
|
await expect( |
|
this.get().getByTestId(`nc-doc-page-breadcrumb-${index}`).getByTestId(`nc-doc-page-icon-emojione:${emoji}`) |
|
).toBeVisible(); |
|
} |
|
} |
|
} |
|
}
|
|
|