"""Synthetic SQLite backup lab. No arguments, network, or existing databases."""
import sqlite3, tempfile, shutil, json, sys
from pathlib import Path

def inspect(p):
    with sqlite3.connect(p.as_uri()+'?mode=ro',uri=True) as c:
        return {'rows':c.execute('select id, note from items order by id').fetchall(), 'integrity':c.execute('pragma integrity_check').fetchone()[0]}
def run():
    with tempfile.TemporaryDirectory(prefix='sqlite-backup-lab-') as td:
        p=Path(td); source=p/'live.db'; c=sqlite3.connect(source)
        c.execute('create table items(id integer primary key, note text)'); c.execute("insert into items values(1,'baseline')"); c.commit()
        assert c.execute('pragma journal_mode=WAL').fetchone()[0]=='wal'
        c.execute('pragma wal_autocheckpoint=0')
        c.execute("insert into items values(2,'committed in WAL')"); c.commit()
        assert Path(str(source)+'-wal').stat().st_size>0
        # Deliberately incomplete negative control, on synthetic files only.
        shutil.copyfile(source,p/'file-only.db')
        with sqlite3.connect(p/'api.db') as dst: c.backup(dst)
        raw=inspect(p/'file-only.db'); api=inspect(p/'api.db')
        assert raw['rows']==[(1,'baseline')] and raw['integrity']=='ok'
        assert api['rows']==[(1,'baseline'),(2,'committed in WAL')] and api['integrity']=='ok'
        c.execute("insert into items values(3,'not committed')")
        reader=sqlite3.connect(source.as_uri()+'?mode=ro',uri=True)
        with sqlite3.connect(p/'during-transaction.db') as dst: reader.backup(dst)
        pending=inspect(p/'during-transaction.db');assert pending['rows']==api['rows']
        c.rollback();reader.close();c.close()
        shutil.copyfile(source,p/'closed-copy.db');closed=inspect(p/'closed-copy.db');assert closed['rows']==api['rows']
        return {'passed':True,'python':sys.version.split()[0],'sqlite':sqlite3.sqlite_version,'cases':{'file_only_live':raw,'backup_api':api,'uncommitted_excluded':pending,'clean_closed_copy':closed},'limits':'No simultaneous writes during backup; no power loss, encryption, attached DB, vendor app, or remote storage tested.'}
if __name__=='__main__':print(json.dumps(run(),indent=2))
