hololake-platform/tests/smoke/note-list-search-visible-content.spec.ts

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,
)
})
})