test(db): executeTx — покрыть rollback-ветку after-commit-хука
Ревью #516: fakeDb.execute всегда пушил commit — моделировался только commit-путь, несущий негатив (тело кидает → tx реджектит → дренаж после awaited-tx не бежит → хук НЕ фаerr) не был заперт. Исходник корректен, это была дыра в тесте. Добавлен тест: тело бросает → executeTx реджектит, commit не случился, хук не побежал. Mutation-verify: перенос дренажа в finally → тест краснеет. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -88,4 +88,26 @@ describe('executeTx post-commit hooks', () => {
|
||||
// The throwing hook is swallowed; a later hook still runs.
|
||||
expect(log).toEqual(['commit', 'second-hook-still-runs']);
|
||||
});
|
||||
|
||||
it('does NOT run afterCommit hooks when the transaction body throws (rollback)', async () => {
|
||||
// The body rejects -> the fake transaction never pushes 'commit' and
|
||||
// db.transaction().execute() rejects, mirroring a real rolled-back tx. The
|
||||
// drain runs only AFTER the awaited (committed) transaction, so a rollback
|
||||
// must leave every registered hook UN-run — otherwise a cache-bust / event
|
||||
// would fire for a write that never landed.
|
||||
const log: string[] = [];
|
||||
const { db } = fakeDb(log);
|
||||
const hook = jest.fn();
|
||||
|
||||
await expect(
|
||||
executeTx(db, async (trx) => {
|
||||
registerAfterCommit(trx, hook);
|
||||
throw new Error('write failed -> rollback');
|
||||
}),
|
||||
).rejects.toThrow('write failed -> rollback');
|
||||
|
||||
// No commit happened, and the post-commit hook never ran.
|
||||
expect(log).toEqual([]); // no 'commit'
|
||||
expect(hook).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user