@@ -5847,6 +5847,54 @@ func TestWritebackAckWithExternalIDReconcilesDraft(t *testing.T) {
58475847 }
58485848}
58495849
5850+ func TestWritebackAckRejectsMissingSuccess (t * testing.T ) {
5851+ store := relayfile .NewStoreWithOptions (relayfile.StoreOptions {ExternalWritebackMode : true })
5852+ defer store .Close ()
5853+ server := NewServer (store )
5854+ token := mustTestJWT (t , "dev-secret" , "ws_1" , "Worker1" , []string {"fs:write" , "sync:read" , "sync:trigger" }, time .Now ().Add (time .Hour ))
5855+
5856+ writeResp := doRequest (t , server , request {
5857+ method : http .MethodPut ,
5858+ path : "/v1/workspaces/ws_1/fs/file?path=" + url .QueryEscape ("/slack/channels/C0ALQ06AAUT/messages/messages 0e89a031-65f0-480e-a823-ab1d94b324ea.json" ),
5859+ headers : map [string ]string {
5860+ "Authorization" : "Bearer " + token ,
5861+ "X-Correlation-Id" : "corr_write_1" ,
5862+ "If-Match" : "0" ,
5863+ },
5864+ body : map [string ]any {
5865+ "contentType" : "application/json" ,
5866+ "content" : `{"text":"hi"}` ,
5867+ },
5868+ })
5869+ if writeResp .Code != http .StatusAccepted {
5870+ t .Fatalf ("expected 202 on draft write, got %d (%s)" , writeResp .Code , writeResp .Body .String ())
5871+ }
5872+ var writeResult relayfile.WriteResult
5873+ if err := json .NewDecoder (writeResp .Body ).Decode (& writeResult ); err != nil {
5874+ t .Fatalf ("failed to decode write response: %v" , err )
5875+ }
5876+
5877+ ackResp := doRequest (t , server , request {
5878+ method : http .MethodPost ,
5879+ path : "/v1/workspaces/ws_1/writeback/" + writeResult .OpID + "/ack" ,
5880+ headers : map [string ]string {
5881+ "Authorization" : "Bearer " + token ,
5882+ "X-Correlation-Id" : "corr_ack_1" ,
5883+ },
5884+ body : map [string ]any {"error" : "missing success" },
5885+ })
5886+ if ackResp .Code != http .StatusBadRequest {
5887+ t .Fatalf ("expected 400 on malformed ack, got %d (%s)" , ackResp .Code , ackResp .Body .String ())
5888+ }
5889+ ops , err := store .ListOperations ("ws_1" , "" , "" , "" , "" , 10 )
5890+ if err != nil {
5891+ t .Fatalf ("list operations failed: %v" , err )
5892+ }
5893+ if len (ops .Items ) != 1 || ops .Items [0 ].Status != "pending" {
5894+ t .Fatalf ("malformed ack must leave operation pending, got %+v" , ops .Items )
5895+ }
5896+ }
5897+
58505898// Issue #242: POST /writeback/sweep-drafts drains accumulated draft residue.
58515899func TestWritebackSweepDraftsEndpoint (t * testing.T ) {
58525900 store := relayfile .NewStoreWithOptions (relayfile.StoreOptions {ExternalWritebackMode : true })
0 commit comments