From 819a1f6e8fb6a5d2acfd74c87f6a514a7f7b45a1 Mon Sep 17 00:00:00 2001 From: 777genius Date: Tue, 28 Apr 2026 21:58:24 +0300 Subject: [PATCH] test(changes): reset decisions on ledger evidence upgrade --- test/renderer/store/changeReviewSlice.test.ts | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/test/renderer/store/changeReviewSlice.test.ts b/test/renderer/store/changeReviewSlice.test.ts index 19b8f388..0bc2d397 100644 --- a/test/renderer/store/changeReviewSlice.test.ts +++ b/test/renderer/store/changeReviewSlice.test.ts @@ -1731,4 +1731,73 @@ describe('changeReviewSlice task changes', () => { expect(store.getState().reviewUndoStack).toEqual([]); expect(store.getState().fileContentVersionByPath).toEqual({}); }); + + it('clears metadata-only decisions when ledger evidence upgrades to full text for the same changeKey', async () => { + const store = createSliceStore(); + const changeKey = 'path:/repo/file.ts'; + const currentFile = { + ...makeFile('/repo/file.ts'), + changeKey, + snippets: [], + ledgerSummary: { + latestOperation: 'modify', + contentAvailability: 'metadata-only', + reviewability: 'metadata-only', + }, + }; + const freshFile = { + ...makeFile('/repo/file.ts'), + changeKey, + ledgerSummary: { + latestOperation: 'modify', + contentAvailability: 'full-text', + reviewability: 'full-text', + beforeState: { exists: true, sha256: 'before-hash', sizeBytes: 6 }, + afterState: { exists: true, sha256: 'after-hash', sizeBytes: 5 }, + }, + }; + const current = { + ...makeTaskChangeSet('task-ledger', '/repo/file.ts'), + files: [currentFile], + provenance: { + sourceKind: 'ledger', + sourceFingerprint: 'metadata-only-projection', + }, + }; + const fresh = { + ...current, + files: [freshFile], + provenance: { + sourceKind: 'ledger', + sourceFingerprint: 'snapshot-full-text-projection', + }, + }; + hoisted.getTaskChanges.mockResolvedValueOnce(fresh); + + store.setState({ + activeChangeSet: current, + hunkDecisions: { [`${changeKey}:0`]: 'rejected' }, + fileDecisions: { [changeKey]: 'rejected' }, + hunkContextHashesByFile: { [changeKey]: { 0: 'metadata-only-context' } }, + fileChunkCounts: { [changeKey]: 1 }, + reviewUndoStack: [ + { + hunkDecisions: { [`${changeKey}:0`]: 'rejected' }, + fileDecisions: { [changeKey]: 'rejected' }, + }, + ], + changeSetEpoch: 4, + fileContentVersionByPath: { '/repo/file.ts': 2 }, + }); + + await store.getState().applyReview('team-a', 'task-ledger'); + + expect(hoisted.applyDecisions).not.toHaveBeenCalled(); + expect(store.getState().activeChangeSet).toEqual(fresh); + expect(store.getState().fileDecisions).toEqual({}); + expect(store.getState().hunkDecisions).toEqual({}); + expect(store.getState().hunkContextHashesByFile).toEqual({}); + expect(store.getState().reviewUndoStack).toEqual([]); + expect(store.getState().fileContentVersionByPath).toEqual({}); + }); });