okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
ff92766
main
1/// E2E cannot pause admission just before its transaction; this catches close winning that race. 2import albedo/daemon/conversation 3import albedo/daemon/family 4import albedo/daemon/mail 5import albedo/daemon/store 6import albedo/harness/runtime 7import albedo/openai_api/types 8import gleam/dynamic/decode 9import gleam/option .{ None , Some } 10import gleeunit/should 11 12@external ( erlang , "albedo_runtime_test_support" , "temporary_database" ) 13fn temporary_database () -> String 14 15@external ( erlang , "albedo_runtime_test_support" , "cleanup" ) 16fn cleanup ( path : String ) -> Nil 17 18pub fn close_before_mail_commit_rolls_back_turn_and_preserves_letter_test () -> Nil { 19let path = temporary_database () 20let assert Ok ( host ) = runtime . start ( path ) 21let ledger = runtime . ledger ( host ) 22let assert Ok ( _ ) = conversation . initialise ( ledger ) 23let assert Ok ( _ ) = family . initialise ( ledger ) 24let assert Ok ( _ ) = . initialise ( ledger ) 25let parent = 26conversation . Info ( 27"parent" , 28"parent" , 29"/tmp" , 30"provider" , 31"model" , 32types . Responses , 33conversation . Idle , 34None , 35None , 36) 37let assert Ok ( _ ) = conversation . create ( ledger , parent ) 38let assert Ok ( _ ) = 39conversation . create ( ledger , conversation . Info (.. parent , id : "child" )) 40let assert Ok ( _ ) = 41store . query ( ledger , fn ( connection ) { 42family . link_in ( connection , "child" , "parent" , "child" ) 43}) 44let assert Ok ( _ ) = 45. post ( 46ledger , 47"closed-letter" , 48"child" , 49Some ( "parent" ), 50"parent" , 51. Task , 52"task" , 53) 54let assert Ok ( open_letter ) = 55. post ( 56ledger , 57"open-letter" , 58"parent" , 59None , 60"outside" , 61. Message , 62"open" , 63) 64let assert Ok ( _ ) = family . close ( ledger , "child" ) 65 66// This is the commit an already-admitted letter would attempt after close. 67conversation . commit_operations ( 68ledger , 69"child" , 70[ types . User ( "task" )], 71conversation . Model , 72None , 73[ "closed-letter" ], 74[], 75"turn" , 76"/tmp" , 77) 78|> should . equal ( Error ( "session is closed" )) 79conversation . load ( ledger , "child" ) |> should . equal ( Ok ([])) 80. undelivered ( ledger , "closed-letter" ) |> should . be_true 81store . read ( 82ledger , 83"SELECT count(*) FROM input_turns" , 84[], 85decode . field ( 0 , decode . int , decode . success ), 86) 87|> should . equal ( Ok ([ 0 ])) 88// Closed recipients must be excluded before the dispatcher's limit. 89. pending ( ledger , 1 ) |> should . equal ( Ok ([ open_letter ])) 90 91// The closed family flag does not prohibit manual chat with no letters. 92conversation . commit ( 93ledger , 94"child" , 95[ types . User ( "manual" )], 96conversation . Idle , 97) 98|> should . be_ok 99. undelivered ( ledger , "closed-letter" ) |> should . be_true 100runtime . stop ( host ) 101cleanup ( path ) 102}