108 lines
3.8 KiB
TypeScript
108 lines
3.8 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import { createFixtureVaultCopy, openFixtureVaultDesktopHarness, removeFixtureVaultCopy } from '../helpers/fixtureVault'
|
|
|
|
let tempVaultDir: string
|
|
|
|
const SELECT_ALL_SHORTCUT = process.platform === 'darwin' ? 'Meta+A' : 'Control+A'
|
|
const BODY_ONLY_NOTE_TITLE = 'Body Only Search Target'
|
|
const BODY_ONLY_NOTE_FILENAME = 'body-only-search-target'
|
|
const BODY_ONLY_QUERY = 'citrine-backlog-marker'
|
|
|
|
function addBodyOnlySearchNote(vaultDir: string) {
|
|
const noteDir = path.join(vaultDir, 'note')
|
|
fs.mkdirSync(noteDir, { recursive: true })
|
|
fs.writeFileSync(
|
|
path.join(noteDir, `${BODY_ONLY_NOTE_FILENAME}.md`),
|
|
[
|
|
'---',
|
|
'Is A: Note',
|
|
'Status: Active',
|
|
'---',
|
|
'',
|
|
`# ${BODY_ONLY_NOTE_TITLE}`,
|
|
'',
|
|
'This opening paragraph deliberately omits the search phrase so the note list cannot match the local snippet.',
|
|
'',
|
|
'## Research Log',
|
|
'',
|
|
`The hidden body term is ${BODY_ONLY_QUERY}, which should still make this note discoverable.`,
|
|
'',
|
|
].join('\n'),
|
|
)
|
|
}
|
|
|
|
async function showInboxPropertyColumn(
|
|
page: import('@playwright/test').Page,
|
|
propertyName: string,
|
|
visibleValue: string,
|
|
) {
|
|
await page.getByTitle('Customize Inbox columns').click()
|
|
const propertyCheckbox = page.getByRole('checkbox', { name: propertyName })
|
|
await expect(propertyCheckbox).toBeVisible()
|
|
await propertyCheckbox.click()
|
|
await page.keyboard.press('Escape')
|
|
await expect(page.getByTestId('note-list-container').getByText(visibleValue, { exact: true })).toBeVisible()
|
|
}
|
|
|
|
async function showNoteListSearch(page: import('@playwright/test').Page) {
|
|
const toggle = page.getByTitle('Search notes')
|
|
await expect(toggle).toBeVisible()
|
|
await toggle.click()
|
|
await expect(page.getByPlaceholder('Search notes...')).toBeVisible()
|
|
}
|
|
|
|
async function searchAndOpenByKeyboard(
|
|
page: import('@playwright/test').Page,
|
|
query: string,
|
|
expectedTitle: string,
|
|
expectedFilenameStem: string,
|
|
) {
|
|
const noteList = page.getByTestId('note-list-container')
|
|
const searchInput = page.getByPlaceholder('Search notes...')
|
|
await searchInput.focus()
|
|
await page.keyboard.press(SELECT_ALL_SHORTCUT)
|
|
await page.keyboard.type(query)
|
|
await expect(page.getByTestId('note-list-search-loading')).toBeVisible()
|
|
await expect(page.getByTestId('note-list-search-loading')).toHaveCount(0)
|
|
await expect(noteList.getByText(expectedTitle, { exact: true })).toBeVisible()
|
|
await page.keyboard.press('Tab')
|
|
await page.keyboard.press('ArrowDown')
|
|
await page.keyboard.press('Enter')
|
|
await expect(page.getByTestId('breadcrumb-filename-trigger')).toContainText(expectedFilenameStem, { timeout: 5_000 })
|
|
}
|
|
|
|
test.describe('Note-list search visible content', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
tempVaultDir = createFixtureVaultCopy()
|
|
addBodyOnlySearchNote(tempVaultDir)
|
|
await openFixtureVaultDesktopHarness(page, tempVaultDir)
|
|
await page.setViewportSize({ width: 1600, height: 900 })
|
|
})
|
|
|
|
test.afterEach(() => {
|
|
removeFixtureVaultCopy(tempVaultDir)
|
|
})
|
|
|
|
test('keyboard note-list search matches title, snippet, and visible property values @smoke', async ({ page }) => {
|
|
await showInboxPropertyColumn(page, 'Attendees', 'Test User')
|
|
await showNoteListSearch(page)
|
|
|
|
await searchAndOpenByKeyboard(page, 'Team Meeting', 'Team Meeting', 'team-meeting')
|
|
await searchAndOpenByKeyboard(page, 'referenced by Alpha Project', 'Note B', 'note-b')
|
|
await searchAndOpenByKeyboard(page, 'Test User', 'Team Meeting', 'team-meeting')
|
|
})
|
|
|
|
test('keyboard note-list search finds body-only content matches @smoke', async ({ page }) => {
|
|
await showNoteListSearch(page)
|
|
|
|
await searchAndOpenByKeyboard(
|
|
page,
|
|
BODY_ONLY_QUERY,
|
|
BODY_ONLY_NOTE_TITLE,
|
|
BODY_ONLY_NOTE_FILENAME,
|
|
)
|
|
})
|
|
})
|