test(integration): cover query failure state cleanup

This commit is contained in:
kj
2026-09-05 16:47:39 -03:00
parent 25db49f4bd
commit 3e7c367182
3 changed files with 112 additions and 5 deletions

View File

@@ -69,6 +69,10 @@ final class ModelTransactionTest extends TestCase
User::beginTransaction();
$user = self::seed('wrecked_carol');
// Dirty the builder BEFORE failing: only a leftover-free result after
// the exception proves query() itself cleaned up (finding F2).
User::where('age', '>', '30');
try {
(new ReflectionMethod(User::class, 'query'))
->invokeArgs(null, ['SELECT * FROM table_that_does_not_exist']);
@@ -78,6 +82,14 @@ final class ModelTransactionTest extends TestCase
}
$this->assertFalse(self::db()->inTransaction(), 'the exception path must close the transaction');
$sqlAfterFailure = (new ReflectionMethod(User::class, 'buildQuery'))->invoke(null);
$this->assertSame(
'SELECT * FROM users',
$sqlAfterFailure,
'a failed query must leave the builder at its default state'
);
$this->assertNull(User::where('username', 'wrecked_carol')->getFirst(), 'pending insert must be undone');
}
}