84 lines
2.5 KiB
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")
|
|
}
|
|
}
|