Files
go-sip/internal/store/upload_notification_test.go

84 lines
2.5 KiB
Go

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")
}
}