okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
b585313
main
1//// The built-in daemon cannot install arbitrary test extensions. Probe the 2//// cross-extension contract here: schema-before-use, deferred data, order, 3//// backup propagation, disabled-but-installed owners, and failure short-circuit. 4 5import albedo/daemon/store 6import albedo/harness/extension 7import gleam/dynamic/decode 8import gleam/result 9import gleeunit/should 10import sqlight 11 12pub fn contributed_migrations_keep_their_phases_and_stop_on_failure_test () -> Nil { 13let assert Ok ( ledger ) = store . start ( ":memory:" , "" ) 14let installed = [ 15extension . Extension ( 16"owner" , 17"" , 18[], 19[ 20extension . MigrationPlugin ( 21extension . SchemaMigration ( fn ( db ) { 22store . add_columns ( db , "owner" , [#( "revision" , "INTEGER DEFAULT 1" )]) 23}), 24), 25extension . MigrationPlugin ( 26extension . DataMigration ( "owner-data" , fn ( ledger , backup ) { 27use _ <- result . try ( store . read ( 28ledger , 29"SELECT 1 FROM core_ready" , 30[], 31decode . dynamic , 32)) 33store . write ( 34ledger , 35"INSERT INTO applied(name,backup) VALUES('owner',?)" , 36[ sqlight . text ( backup )], 37) 38|> result . replace ( 1 ) 39}), 40), 41], 42fn ( ledger ) { 43store . query ( ledger , store . exec ( 44 _, 45"CREATE TABLE owner(id INTEGER); CREATE TABLE applied(name TEXT,backup TEXT)" , 46)) 47}, 48), 49extension . Extension ( 50"sibling" , 51"" , 52[], 53[ 54extension . MigrationPlugin ( 55extension . DataMigration ( "sibling-data" , fn ( ledger , backup ) { 56store . write ( 57ledger , 58"INSERT INTO applied(name,backup) VALUES('sibling',?)" , 59[ sqlight . text ( backup )], 60) 61|> result . replace ( 1 ) 62}), 63), 64], 65fn ( ledger ) { 66// This initialiser depends on the previous owner's schema upgrade. 67store . write ( ledger , "INSERT INTO owner(revision) VALUES(2)" , []) 68}, 69), 70] 71// Neither extension is enabled for sessions, but both own durable tables. 72let assert Ok (#( _ , [])) = extension . install ( installed , [], ledger ) 73let assert Ok ([ 2 ]) = 74store . read ( 75ledger , 76"SELECT revision FROM owner" , 77[], 78decode . field ( 0 , decode . int , decode . success ), 79) 80let assert Ok ([]) = 81store . read ( ledger , "SELECT * FROM applied" , [], decode . dynamic ) 82let assert Error ( _ ) = extension . migrate ( installed , ledger , "/backup" ) 83let assert Ok ([]) = 84store . read ( ledger , "SELECT * FROM applied" , [], decode . dynamic ) 85let assert Ok ( _ ) = 86store . query ( ledger , store . exec ( _, "CREATE TABLE core_ready(id INTEGER)" )) 87extension . migrate ( installed , ledger , "/backup" ) 88|> should . equal ( Ok ([#( "owner-data" , 1 ), #( "sibling-data" , 1 )])) 89let assert Ok ( rows ) = 90store . read ( ledger , "SELECT name,backup FROM applied ORDER BY rowid" , [], { 91use name <- decode . field ( 0 , decode . string ) 92use backup <- decode . field ( 1 , decode . string ) 93decode . success (#( name , backup )) 94}) 95rows |> should . equal ([#( "owner" , "/backup" ), #( "sibling" , "/backup" )]) 96store . close ( ledger ) 97}