Files
orca/tests/e2e/markdown-nested-toggle.spec.ts
T
Jinjing 1320a2a953 Support nested toggles as editable blocks with recursion guards
Previously nested details blocks were preserved as inert passthrough HTML.
Now, nested details that themselves meet editability criteria are opened as
editable toggle nodes. Recursive validation includes a 16-level nesting limit
to prevent stack exhaustion on pathological input. Refactors common markdown
editor test helpers into a reusable fixture module.
2026-08-27 16:59:38 -07:00

114 lines
3.7 KiB
TypeScript

import { readFileSync } from 'node:fs'
import { test, expect } from './helpers/orca-app'
import {
cleanupMarkdownFixture,
closeActiveEditorTab,
createMarkdownFixture,
getActiveWorktreeContext,
openMarkdownFixture,
waitForRichMarkdownEditor
} from './helpers/markdown-editor-fixture'
import {
expectEditableNestedToggles,
expectFileKeepsNesting,
expectPassthroughFallback,
expectSentinelInsideNestedToggle,
NESTED_TOGGLE_FIXTURE_DIRECTORY,
NESTED_TOGGLE_MARKDOWN,
placeCaretInNestedToggleBody,
UNSUPPORTED_NESTED_TOGGLE_MARKDOWN
} from './helpers/markdown-nested-toggle'
import { waitForActiveWorktree, waitForSessionReady } from './helpers/store'
test.describe('Markdown nested toggle regression', () => {
test.beforeEach(async ({ orcaPage }) => {
await waitForSessionReady(orcaPage)
await waitForActiveWorktree(orcaPage)
})
test('a nested toggle on disk reopens as editable toggles', async ({ orcaPage }, testInfo) => {
const context = await getActiveWorktreeContext(orcaPage)
let filePath: string | null = null
try {
filePath = await createMarkdownFixture(
context,
NESTED_TOGGLE_FIXTURE_DIRECTORY,
'nested-toggle-reopen',
testInfo.workerIndex,
NESTED_TOGGLE_MARKDOWN
)
await openMarkdownFixture(orcaPage, context, filePath)
await waitForRichMarkdownEditor(orcaPage)
await expectEditableNestedToggles(orcaPage)
} finally {
await cleanupMarkdownFixture(filePath)
}
})
test('editing a nested toggle survives save and reopen', async ({ orcaPage }, testInfo) => {
const context = await getActiveWorktreeContext(orcaPage)
const sentinel = `editedInsideNestedToggle${Date.now()}`
let filePath: string | null = null
try {
filePath = await createMarkdownFixture(
context,
NESTED_TOGGLE_FIXTURE_DIRECTORY,
'nested-toggle-edit',
testInfo.workerIndex,
NESTED_TOGGLE_MARKDOWN
)
await openMarkdownFixture(orcaPage, context, filePath)
await waitForRichMarkdownEditor(orcaPage)
await expectEditableNestedToggles(orcaPage)
await placeCaretInNestedToggleBody(orcaPage)
await orcaPage.keyboard.type(` ${sentinel}`)
await expectSentinelInsideNestedToggle(orcaPage, sentinel)
// Save through the real shortcut and assert the bytes that landed on disk.
await orcaPage.keyboard.press('ControlOrMeta+S')
const savedPath = filePath
await expect
.poll(() => readFileSync(savedPath, 'utf8'), { timeout: 10_000 })
.toContain(sentinel)
expectFileKeepsNesting(readFileSync(savedPath, 'utf8'), sentinel)
// The reported bug only appeared on reopen, so close the tab and parse
// the saved file again from scratch.
await closeActiveEditorTab(orcaPage, savedPath)
await openMarkdownFixture(orcaPage, context, savedPath)
await waitForRichMarkdownEditor(orcaPage)
await expectEditableNestedToggles(orcaPage)
await expectSentinelInsideNestedToggle(orcaPage, sentinel)
} finally {
await cleanupMarkdownFixture(filePath)
}
})
test('a nested toggle that cannot be represented stays raw passthrough', async ({
orcaPage
}, testInfo) => {
const context = await getActiveWorktreeContext(orcaPage)
let filePath: string | null = null
try {
filePath = await createMarkdownFixture(
context,
NESTED_TOGGLE_FIXTURE_DIRECTORY,
'nested-toggle-unsupported',
testInfo.workerIndex,
UNSUPPORTED_NESTED_TOGGLE_MARKDOWN
)
await openMarkdownFixture(orcaPage, context, filePath)
await waitForRichMarkdownEditor(orcaPage)
await expectPassthroughFallback(orcaPage)
} finally {
await cleanupMarkdownFixture(filePath)
}
})
})