064f22a0a0
Seven copies of "create a schema, hang it off search_path, drop it in teardown" were spread across two files, each with its own cleanup. Any one of them written wrong leaves the residue on a database shared with real batch runs. This is one implementation, and it makes "the test cannot reach the admin connection" a structural fact rather than a note in a docstring. Three role modes cover every fixture that exists today: none for plain schema isolation, owner for the retention script's own runs, grantee for the least-privilege deployment cases. Owner runs its DDL as itself so it ends up owning the table; grantee is the opposite, since that case only means anything when someone else built it. The schema and the role deliberately get different prefixes. Give them the same name and "$user" resolves to the sandbox, which hides the shared table and quietly turns the worst-case test into a test of nothing. Writing it also turned up a bug in my first version: rolling back a failed sandbox unwound the whole stack, so an earlier sandbox in the same test lost its role mid-use. The test for it fails with a password authentication error, which is what that looks like from the outside. Each call now unwinds only what it created, and cleanup tries every statement before raising, since one failure stranding the rest means global roles left behind by hand.