diff --git a/e2e/docs/.vuepress/theme/client/components/MarkdownContentHooks.vue b/e2e/docs/.vuepress/theme/client/components/MarkdownContentHooks.vue new file mode 100644 index 0000000000..1426d7d702 --- /dev/null +++ b/e2e/docs/.vuepress/theme/client/components/MarkdownContentHooks.vue @@ -0,0 +1,46 @@ + + + diff --git a/e2e/docs/.vuepress/theme/client/layouts/Layout.vue b/e2e/docs/.vuepress/theme/client/layouts/Layout.vue index 07519db48d..7888e994aa 100644 --- a/e2e/docs/.vuepress/theme/client/layouts/Layout.vue +++ b/e2e/docs/.vuepress/theme/client/layouts/Layout.vue @@ -1,5 +1,6 @@ @@ -18,6 +19,8 @@ const siteData = useSiteData()
+ + diff --git a/e2e/docs/content-hooks/content.md b/e2e/docs/content-hooks/content.md new file mode 100644 index 0000000000..a8badd3c11 --- /dev/null +++ b/e2e/docs/content-hooks/content.md @@ -0,0 +1,3 @@ +## title + +content diff --git a/e2e/tests/content-hooks.spec.ts b/e2e/tests/content-hooks.spec.ts new file mode 100644 index 0000000000..c960a0f8cd --- /dev/null +++ b/e2e/tests/content-hooks.spec.ts @@ -0,0 +1,70 @@ +import { expect, test } from '@playwright/test' +import { IS_DEV } from '../utils/env' +import { readSourceMarkdown, writeSourceMarkdown } from '../utils/source' + +let changeCount = 0 + +const updateMarkdownContent = async (): Promise => { + changeCount++ + const content = await readSourceMarkdown('content-hooks/content.md') + await writeSourceMarkdown( + 'content-hooks/content.md', + `${content}\n\nUpdated content`, + ) +} + +const restoreMarkdownContent = async (): Promise => { + changeCount = 0 + await writeSourceMarkdown('content-hooks/content.md', '## title\n\ncontent\n') +} + +if (IS_DEV) { + test.beforeEach(async () => { + await restoreMarkdownContent() + }) + test.afterEach(async () => { + await restoreMarkdownContent() + }) +} + +test('should call content mounted hook', async ({ page }) => { + const mountedLocator = page.locator( + '.markdown-content-hooks .markdown-content-mounted', + ) + await page.goto('content-hooks/content.html') + + await expect(mountedLocator).toHaveText( + 'mounted: /content-hooks/content.html 1', + ) + + // update content but mounted hook should not be called twice + await updateMarkdownContent() + await expect(mountedLocator).toHaveText( + 'mounted: /content-hooks/content.html 1', + ) +}) + +test('should call content change hook', async ({ page }) => { + const changeLocator = page.locator( + '.markdown-content-hooks .markdown-content-change', + ) + await page.goto('content-hooks/content.html') + + await updateMarkdownContent() + await expect(changeLocator).toHaveText(`changedCount: ${changeCount}`) // 1 + + await updateMarkdownContent() + await expect(changeLocator).toHaveText(`changedCount: ${changeCount}`) // 2 +}) + +test('should call content before unmount hook', async ({ page }) => { + const beforeUnmountLocator = page.locator( + '.markdown-content-hooks .markdown-content-before-unmount', + ) + await page.goto('content-hooks/content.html') + await page.locator('.e2e-theme-nav a[href="/"]').click() + + await expect(beforeUnmountLocator).toHaveText( + 'beforeUnmount: /content-hooks/content.html', + ) +})