38 lines
2.2 KiB
Python
Executable File
38 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Offline SQLite regression for additive admin preset migration and 16-slot upsert."""
|
|
from pathlib import Path
|
|
import sqlite3
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
all_scripts = sorted((ROOT / 'migrations').glob('*.sql'))
|
|
assert [p.name for p in all_scripts][-1] == '0010_dashboard_presets.sql'
|
|
con = sqlite3.connect(':memory:')
|
|
con.execute('PRAGMA foreign_keys = ON')
|
|
for _ in range(2):
|
|
for script in all_scripts:
|
|
con.executescript(script.read_text())
|
|
con.execute("INSERT INTO administrator(id,username,password_hash,generation,created_at) VALUES(1,'owner','hash',1,0)")
|
|
con.execute("INSERT INTO admin_preferences(administrator_id,document) VALUES(1,'{}')")
|
|
|
|
upsert = '''
|
|
INSERT INTO dashboard_presets(administrator_id, name, document, updated_at)
|
|
SELECT a.id, ?, ?, ? FROM administrator a WHERE a.id = 1 AND a.username = ?
|
|
AND ((SELECT count(*) FROM dashboard_presets WHERE administrator_id = a.id) < 16
|
|
OR EXISTS(SELECT 1 FROM dashboard_presets WHERE administrator_id = a.id AND name = ?))
|
|
ON CONFLICT(administrator_id, name) DO UPDATE SET document = excluded.document, updated_at = excluded.updated_at
|
|
'''
|
|
for i in range(16):
|
|
name = f'Preset {i}'
|
|
assert con.execute(upsert, (name,'{}',i,'owner',name)).rowcount == 1
|
|
assert con.execute(upsert, ('Overflow','{}',16,'owner','Overflow')).rowcount == 0
|
|
assert con.execute(upsert, ('Preset 0','{"changed":true}',17,'owner','Preset 0')).rowcount == 1
|
|
assert con.execute(upsert, ('Other account','{}',18,'intruder','Other account')).rowcount == 0
|
|
assert con.execute('SELECT count(*) FROM dashboard_presets').fetchone()[0] == 16
|
|
assert con.execute('SELECT document FROM dashboard_presets WHERE name="Preset 0"').fetchone()[0] == '{"changed":true}'
|
|
assert con.execute('UPDATE OR IGNORE dashboard_presets SET name=? WHERE name=?', ('Preset 1','Preset 0')).rowcount == 0
|
|
assert con.execute('UPDATE OR IGNORE dashboard_presets SET name=? WHERE name=?', ('Renamed','Preset 0')).rowcount == 1
|
|
con.execute('DELETE FROM administrator WHERE id=1')
|
|
assert con.execute('SELECT count(*) FROM dashboard_presets').fetchone()[0] == 0
|
|
assert con.execute('SELECT count(*) FROM admin_preferences').fetchone()[0] == 0
|
|
print('PASS SQLite migrations repeated, named-preset CRUD, cap, account ownership and cascade')
|