diff --git a/tests/smoke/wikilink-path-fix.spec.ts b/tests/smoke/wikilink-path-fix.spec.ts new file mode 100644 index 00000000..4c39cbbe --- /dev/null +++ b/tests/smoke/wikilink-path-fix.spec.ts @@ -0,0 +1,83 @@ +import { test, expect } from '@playwright/test' + +test.describe('Wikilink insertion and navigation', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/') + await page.waitForTimeout(500) + + // Select first note to open in editor + const noteItem = page.locator('.app__note-list .cursor-pointer').first() + await noteItem.click() + await page.waitForTimeout(1000) + }) + + test('[[ autocomplete inserts wikilink that is not broken', async ({ page }) => { + // Focus editor and move to a new line + const editor = page.locator('.bn-editor') + await expect(editor).toBeVisible({ timeout: 5000 }) + await editor.click() + await page.keyboard.press('End') + await page.keyboard.press('Enter') + await page.waitForTimeout(200) + + // Type [[ then a query (>= 2 chars for MIN_QUERY_LENGTH) + await page.keyboard.type('[[Ma') + await page.waitForTimeout(800) + + // The wikilink suggestion menu should appear + const suggestionMenu = page.locator('.wikilink-menu') + await expect(suggestionMenu).toBeVisible({ timeout: 5000 }) + + // Select the first suggestion + await page.keyboard.press('Enter') + await page.waitForTimeout(500) + + // A wikilink should have been inserted + const wikilinks = page.locator('.wikilink') + const count = await wikilinks.count() + expect(count).toBeGreaterThanOrEqual(1) + + // The wikilink should NOT be broken + const lastWikilink = wikilinks.last() + const isBroken = await lastWikilink.evaluate( + el => el.classList.contains('wikilink--broken'), + ) + expect(isBroken).toBe(false) + + // The wikilink should have a data-target attribute + const target = await lastWikilink.getAttribute('data-target') + expect(target).toBeTruthy() + }) + + test('clicking an inserted wikilink navigates to the note', async ({ page }) => { + // Insert a wikilink via autocomplete + const editor = page.locator('.bn-editor') + await expect(editor).toBeVisible({ timeout: 5000 }) + await editor.click() + await page.keyboard.press('End') + await page.keyboard.press('Enter') + await page.keyboard.type('[[Ma') + await page.waitForTimeout(800) + + const suggestionMenu = page.locator('.wikilink-menu') + await expect(suggestionMenu).toBeVisible({ timeout: 5000 }) + await page.keyboard.press('Enter') + await page.waitForTimeout(500) + + // Get the wikilink that was just inserted + const wikilink = page.locator('.wikilink').last() + await expect(wikilink).toBeVisible() + const targetTitle = await wikilink.textContent() + + // Click the wikilink to navigate + await wikilink.click() + await page.waitForTimeout(1000) + + // The editor should now show the target note + const heading = page.locator('.bn-editor h1') + await expect(heading).toBeVisible({ timeout: 3000 }) + const headingText = await heading.textContent() + // The heading should match the beginning of the target note's title + expect(headingText?.toLowerCase()).toContain(targetTitle?.toLowerCase().substring(0, 4) || '') + }) +})