package store import ( "encoding/json" "git.ipao.vip/rogee/go-sip/contracts" "git.ipao.vip/rogee/go-sip/internal/tenant" "testing" "time" ) func TestUploadCompletionRequiresPublishedOriginalNotice(t *testing.T) { s, err := Open(":memory:") if err != nil { t.Fatal(err) } defer s.Close() now := time.Now().UTC() if err := s.BindDispatcherID(identityA); err != nil { t.Fatal(err) } if _, err := s.IssueUploadGrant(UploadRecord{UploadID: "upload-a", Binding: []byte("binding"), Asset: []byte("asset"), Grant: []byte("grant"), ObjectKey: "recordings/recording-a.wav", Bucket: "example-bucket", State: "granted", CreatedAt: now}, "request-a", "request-hash-a"); err != nil { t.Fatal(err) } raw, err := contracts.Files.ReadFile("upstream/v1/examples/event-recording-uploaded.json") if err != nil { t.Fatal(err) } var event map[string]any if err := json.Unmarshal(raw, &event); err != nil { t.Fatal(err) } event["event_id"] = "notice-a" raw, err = json.Marshal(event) if err != nil { t.Fatal(err) } route, err := tenant.NewDispatcherRoute(identityA, "tenant-a") if err != nil { t.Fatal(err) } if err := s.RecordUploadNotification("upload-a", "different-event", "tenant-a", route.OutboundKey, raw, now); err == nil { t.Fatal("mismatched event identity accepted") } for n := 0; n < 2; n++ { if err := s.RecordUploadNotification("upload-a", "notice-a", "tenant-a", route.OutboundKey, raw, now); err != nil { t.Fatal(err) } } record, err := s.LoadUpload("upload-a") if err != nil { t.Fatal(err) } if record.State != "uploaded" || record.CompletedAt != nil { t.Fatalf("outbox incorrectly counted as complete: %s", record.State) } replacement := record replacement.State = "granted" replacement.Grant = []byte("another grant") if _, err := s.IssueUploadGrant(replacement, "explicit-after-upload", "new-request-hash"); err == nil { t.Fatal("already-uploaded file was reauthorized") } var id int64 var count int if err := s.DB().QueryRow(`SELECT COUNT(*) FROM outbox`).Scan(&count); err != nil { t.Fatal(err) } if count != 1 { t.Fatal("duplicate completion created another event") } if err := s.DB().QueryRow(`SELECT id FROM outbox WHERE event_id='notice-a'`).Scan(&id); err != nil { t.Fatal(err) } if err := s.MarkOutboxPublished(id); err != nil { t.Fatal(err) } record, err = s.LoadUpload("upload-a") if err != nil { t.Fatal(err) } if record.State != "completed" || record.CompletedAt == nil { t.Fatal("confirmed notification did not complete upload delivery") } }