test: Playwright smoke test for trash → Changes badge

Also track mock frontmatter writes in mockSavedSinceCommit so the
Changes panel updates correctly in browser dev mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
lucaronin
2026-03-06 23:08:18 +01:00
parent 7a7ba6086a
commit ddd65926d8
5 changed files with 49 additions and 3 deletions

View File

@@ -28,6 +28,7 @@ vi.mock('../mock-tauri', () => ({
isTauri: vi.fn(() => false),
addMockEntry: vi.fn(),
updateMockContent: vi.fn(),
trackMockChange: vi.fn(),
mockInvoke: vi.fn().mockResolvedValue(''),
}))
vi.mock('./mockFrontmatterHelpers', () => ({

View File

@@ -1,6 +1,6 @@
import { useCallback, useEffect, useRef } from 'react'
import { invoke } from '@tauri-apps/api/core'
import { isTauri, mockInvoke, addMockEntry, updateMockContent } from '../mock-tauri'
import { isTauri, mockInvoke, addMockEntry, updateMockContent, trackMockChange } from '../mock-tauri'
import type { VaultEntry } from '../types'
import type { FrontmatterValue } from '../components/Inspector'
import { useTabManagement } from './useTabManagement'
@@ -111,12 +111,14 @@ async function invokeFrontmatter(command: string, args: Record<string, unknown>)
function applyMockFrontmatterUpdate(path: string, key: string, value: FrontmatterValue): string {
const content = updateMockFrontmatter(path, key, value)
updateMockContent(path, content)
trackMockChange(path)
return content
}
function applyMockFrontmatterDelete(path: string, key: string): string {
const content = deleteMockFrontmatterProperty(path, key)
updateMockContent(path, content)
trackMockChange(path)
return content
}

View File

@@ -5,10 +5,10 @@
*/
import { MOCK_CONTENT } from './mock-content'
import { mockHandlers, addMockEntry, updateMockContent } from './mock-handlers'
import { mockHandlers, addMockEntry, updateMockContent, trackMockChange } from './mock-handlers'
import { tryVaultApi } from './vault-api'
export { addMockEntry, updateMockContent }
export { addMockEntry, updateMockContent, trackMockChange }
export function isTauri(): boolean {
return typeof window !== 'undefined' && ('__TAURI__' in window || '__TAURI_INTERNALS__' in window)

View File

@@ -347,3 +347,7 @@ export function updateMockContent(path: string, content: string): void {
MOCK_CONTENT[path] = content
syncWindowContent()
}
export function trackMockChange(path: string): void {
mockSavedSinceCommit.add(path)
}

View File

@@ -0,0 +1,39 @@
import { test, expect } from '@playwright/test'
import { openCommandPalette, executeCommand } from './helpers'
test.describe('Trash/archive notes appear in Changes', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/')
await page.waitForLoadState('networkidle')
})
test('trashing a note increments the Changes badge', async ({ page }) => {
const sidebar = page.locator('.app__sidebar')
// Wait for Changes nav item (mock starts with 3 modified files)
const changesRow = sidebar.locator('div', { hasText: /^Changes/ }).first()
await changesRow.waitFor({ timeout: 5000 })
// Read the initial badge count from the Changes row
const badge = changesRow.locator('span').last()
const initialCount = Number(await badge.textContent())
expect(initialCount).toBeGreaterThan(0)
// Click the first note in the list to select it
const noteListContainer = page.locator('[data-testid="note-list-container"]')
await noteListContainer.waitFor({ timeout: 5000 })
// Click on the first visible note item (border-b items inside the list)
const firstNote = noteListContainer.locator('.cursor-pointer').first()
await firstNote.click()
// Trash the active note via command palette
await openCommandPalette(page)
await executeCommand(page, 'Trash Note')
// Wait for the badge count to increase
await expect(async () => {
const text = await badge.textContent()
expect(Number(text)).toBeGreaterThan(initialCount)
}).toPass({ timeout: 5000 })
})
})