132 lines
4.8 KiB
TypeScript
132 lines
4.8 KiB
TypeScript
import { test, expect } from './helpers/orca-app'
|
|
import { waitForSessionReady, waitForActiveWorktree } from './helpers/store'
|
|
|
|
test.describe('Diff note edit', () => {
|
|
test.beforeEach(async ({ orcaPage }) => {
|
|
await waitForSessionReady(orcaPage)
|
|
await waitForActiveWorktree(orcaPage)
|
|
})
|
|
|
|
test('editing a saved inline note updates the open diff card', async ({ orcaPage }) => {
|
|
const worktreeId = await waitForActiveWorktree(orcaPage)
|
|
const seededBody = 'edit-me note'
|
|
const editedBody = 'edited note from the inline card'
|
|
|
|
// Why: create a real modified-file diff so Monaco mounts the saved-note
|
|
// view zone on the same local surface that wires updateDiffComment.
|
|
const { relativePath } = await orcaPage.evaluate(async (wId) => {
|
|
const store = window.__store
|
|
if (!store) {
|
|
throw new Error('window.__store is not available - is the app in dev mode?')
|
|
}
|
|
const state = store.getState()
|
|
const worktree = Object.values(state.worktreesByRepo)
|
|
.flat()
|
|
.find((entry) => entry.id === wId)
|
|
if (!worktree) {
|
|
throw new Error('active worktree not found')
|
|
}
|
|
const separator = worktree.path.includes('\\') ? '\\' : '/'
|
|
const rel = `src${separator}index.ts`
|
|
const absolutePath = `${worktree.path}${separator}${rel}`
|
|
await window.api.fs.writeFile({
|
|
filePath: absolutePath,
|
|
content: 'export const hello = "note-edit-test"\n'
|
|
})
|
|
return { relativePath: rel }
|
|
}, worktreeId)
|
|
|
|
const addResult = await orcaPage.evaluate(
|
|
async ({ wId, rel, body }) => {
|
|
const store = window.__store
|
|
if (!store) {
|
|
throw new Error('window.__store is not available')
|
|
}
|
|
return store.getState().addDiffComment({
|
|
worktreeId: wId,
|
|
filePath: rel,
|
|
source: 'diff',
|
|
lineNumber: 1,
|
|
body,
|
|
side: 'modified'
|
|
})
|
|
},
|
|
{ wId: worktreeId, rel: relativePath, body: seededBody }
|
|
)
|
|
expect(addResult, 'addDiffComment returned null').not.toBeNull()
|
|
const commentId = addResult!.id
|
|
|
|
await orcaPage.evaluate(
|
|
({ wId, rel }) => {
|
|
const store = window.__store
|
|
if (!store) {
|
|
throw new Error('window.__store is not available')
|
|
}
|
|
const state = store.getState()
|
|
const worktree = Object.values(state.worktreesByRepo)
|
|
.flat()
|
|
.find((entry) => entry.id === wId)
|
|
if (!worktree) {
|
|
throw new Error('active worktree not found')
|
|
}
|
|
const separator = worktree.path.includes('\\') ? '\\' : '/'
|
|
state.openDiff(wId, `${worktree.path}${separator}${rel}`, rel, 'typescript', false)
|
|
},
|
|
{ wId: worktreeId, rel: relativePath }
|
|
)
|
|
|
|
const card = orcaPage.locator('.orca-diff-comment-card').first()
|
|
await expect(card, 'seeded inline note did not render').toBeVisible({ timeout: 15_000 })
|
|
await expect(card.locator('.orca-diff-comment-body')).toHaveText(seededBody)
|
|
|
|
await card.getByTitle('Edit note').click()
|
|
|
|
const textarea = card.locator('.orca-diff-comment-popover-textarea')
|
|
await expect(textarea).toBeVisible()
|
|
await expect(textarea).toHaveValue(seededBody)
|
|
|
|
const saveButton = card
|
|
.locator('.orca-diff-comment-popover-footer button')
|
|
.filter({ hasText: 'Save' })
|
|
await expect(saveButton, 'Save should be disabled before the body changes').toBeDisabled()
|
|
|
|
await textarea.fill(editedBody)
|
|
await expect(saveButton, 'Save should be enabled for a non-empty changed body').toBeEnabled()
|
|
await saveButton.click()
|
|
|
|
await expect(textarea, 'edit controls did not close after saving').toHaveCount(0, {
|
|
timeout: 5_000
|
|
})
|
|
|
|
await expect
|
|
.poll(
|
|
async () =>
|
|
orcaPage.evaluate((id: string) => {
|
|
const store = window.__store
|
|
if (!store) {
|
|
return null
|
|
}
|
|
const all = Object.values(store.getState().worktreesByRepo)
|
|
.flat()
|
|
.flatMap((w) => w.diffComments ?? [])
|
|
const comment = all.find((c) => c.id === id)
|
|
return comment?.body ?? null
|
|
}, commentId),
|
|
{
|
|
timeout: 5_000,
|
|
message: 'updateDiffComment did not persist the edited body in the store'
|
|
}
|
|
)
|
|
.toBe(editedBody)
|
|
|
|
const updatedCard = orcaPage
|
|
.locator('.orca-diff-comment-card')
|
|
.filter({ has: orcaPage.locator('.orca-diff-comment-body', { hasText: editedBody }) })
|
|
.first()
|
|
await expect(updatedCard, 'inline card did not update in the open diff').toBeVisible()
|
|
await expect(updatedCard.locator('.orca-diff-comment-body')).toHaveText(editedBody)
|
|
await expect(updatedCard.locator('.orca-diff-comment-body')).not.toHaveText(seededBody)
|
|
await expect(updatedCard.getByTitle('Edit note')).toBeVisible()
|
|
})
|
|
})
|