@@ -1594,6 +1594,7 @@ func TestGatewayRuntimePortBridgeSessionAssets(t *testing.T) {
15941594
15951595 workdir := t .TempDir ()
15961596 store := agentsession .NewSQLiteStore (t .TempDir (), workdir )
1597+ t .Cleanup (func () { _ = store .Close () })
15971598 session := agentsession .NewWithWorkdir ("asset session" , workdir )
15981599 if _ , err := store .CreateSession (context .Background (), agentsession.CreateSessionInput {
15991600 ID : session .ID ,
@@ -1637,14 +1638,38 @@ func TestGatewayRuntimePortBridgeSessionAssets(t *testing.T) {
16371638 if err != nil {
16381639 t .Fatalf ("OpenSessionAsset() error = %v" , err )
16391640 }
1640- defer opened .Reader .Close ()
16411641 got , err := io .ReadAll (opened .Reader )
16421642 if err != nil {
16431643 t .Fatalf ("ReadAll() error = %v" , err )
16441644 }
16451645 if string (got ) != string (payload ) || opened .Meta .AssetID != meta .AssetID || opened .Meta .MimeType != "image/png" {
16461646 t .Fatalf ("unexpected opened asset meta=%+v payload=%q" , opened .Meta , string (got ))
16471647 }
1648+ if err := opened .Reader .Close (); err != nil {
1649+ t .Fatalf ("Close opened asset reader: %v" , err )
1650+ }
1651+
1652+ if err := bridge .DeleteSessionAsset (context .Background (), gateway.DeleteSessionAssetInput {
1653+ SubjectID : testBridgeSubjectID ,
1654+ SessionID : session .ID ,
1655+ AssetID : meta .AssetID ,
1656+ }); err != nil {
1657+ t .Fatalf ("DeleteSessionAsset() error = %v" , err )
1658+ }
1659+ if err := bridge .DeleteSessionAsset (context .Background (), gateway.DeleteSessionAssetInput {
1660+ SubjectID : testBridgeSubjectID ,
1661+ SessionID : session .ID ,
1662+ AssetID : meta .AssetID ,
1663+ }); err != nil {
1664+ t .Fatalf ("DeleteSessionAsset() should be idempotent, got %v" , err )
1665+ }
1666+ if _ , err := bridge .OpenSessionAsset (context .Background (), gateway.OpenSessionAssetInput {
1667+ SubjectID : testBridgeSubjectID ,
1668+ SessionID : session .ID ,
1669+ AssetID : meta .AssetID ,
1670+ }); ! errors .Is (err , gateway .ErrRuntimeResourceNotFound ) {
1671+ t .Fatalf ("OpenSessionAsset() after delete error = %v, want resource not found" , err )
1672+ }
16481673}
16491674
16501675func TestGatewayRuntimePortBridgeSessionAssetErrors (t * testing.T ) {
@@ -1683,6 +1708,13 @@ func TestGatewayRuntimePortBridgeSessionAssetErrors(t *testing.T) {
16831708 }); err == nil || ! strings .Contains (err .Error (), "asset store is unavailable" ) {
16841709 t .Fatalf ("expected unavailable asset store save error, got %v" , err )
16851710 }
1711+ if err := bridge .DeleteSessionAsset (context .Background (), gateway.DeleteSessionAssetInput {
1712+ SubjectID : testBridgeSubjectID ,
1713+ SessionID : "session-1" ,
1714+ AssetID : "asset-1" ,
1715+ }); err == nil || ! strings .Contains (err .Error (), "does not support delete" ) {
1716+ t .Fatalf ("expected unavailable asset store delete error, got %v" , err )
1717+ }
16861718 if _ , err := bridge .OpenSessionAsset (context .Background (), gateway.OpenSessionAssetInput {
16871719 SubjectID : testBridgeSubjectID ,
16881720 SessionID : "session-1" ,
@@ -1692,6 +1724,32 @@ func TestGatewayRuntimePortBridgeSessionAssetErrors(t *testing.T) {
16921724 }
16931725}
16941726
1727+ func TestGatewayRuntimePortBridgeSessionAssetSaveRequiresExistingSession (t * testing.T ) {
1728+ t .Parallel ()
1729+
1730+ store := agentsession .NewSQLiteStore (t .TempDir (), t .TempDir ())
1731+ t .Cleanup (func () { _ = store .Close () })
1732+ bridge , err := newGatewayRuntimePortBridge (
1733+ context .Background (),
1734+ & runtimeStub {eventsCh : make (chan agentruntime.RuntimeEvent , 1 )},
1735+ store ,
1736+ )
1737+ if err != nil {
1738+ t .Fatalf ("new bridge: %v" , err )
1739+ }
1740+ defer bridge .Close ()
1741+
1742+ _ , err = bridge .SaveSessionAsset (context .Background (), gateway.SaveSessionAssetInput {
1743+ SubjectID : testBridgeSubjectID ,
1744+ SessionID : "missing-session" ,
1745+ Reader : strings .NewReader ("x" ),
1746+ MimeType : "image/png" ,
1747+ })
1748+ if ! errors .Is (err , gateway .ErrRuntimeResourceNotFound ) {
1749+ t .Fatalf ("SaveSessionAsset() missing session error = %v, want resource not found" , err )
1750+ }
1751+ }
1752+
16951753func TestConvertRuntimeSessionToGatewaySessionIncludesCurrentPlan (t * testing.T ) {
16961754 required := true
16971755 session := agentsession .New ("plan session" )
0 commit comments