package db
import (
"errors"
"testing"
"time"
"github.com/bluesky-social/indigo/atproto/syntax"
)
func TestAStaleTicketAdvanceIsRefusedAndLeavesNoEvent(t *testing.T) {
d := newTestDB(t)
repo := syntax.DID("did:plc:a")
if err := d.AddPullTicket(repo, "t1", PullTicket{Author: "did:plc:bob", State: "open", Version: "v1"}); err != nil {
t.Fatal(err)
}
ev := PullEvent{RepoDid: repo, Ticket: "t1", Event: "closed", Pull: []byte("{}")}
if err := d.AdvancePullTicket(repo, "t1", "v1", "v2", "closed", &ev); err != nil {
t.Fatal(err)
}
err := d.AdvancePullTicket(repo, "t1", "v1", "v3", "open", &ev)
if !errors.Is(err, ErrPullRaced) {
t.Fatalf("a second advance from v1 = %v, want ErrPullRaced", err)
}
got, err := d.GetPullTicket(repo, "t1")
if err != nil || got.Version != "v2" || got.State != "closed" {
t.Fatalf("ticket = %+v, %v, want the first advance kept", got, err)
}
due, err := d.DuePullEvents(repo, time.Now().Add(time.Hour), 100)
if err != nil || len(due) != 1 {
t.Fatalf("events = %d, %v, want only the first advance's", len(due), err)
}
}
func TestAStaleStateSetIsRefusedAndLeavesNoEvent(t *testing.T) {
d := newTestDB(t)
repo := syntax.DID("did:plc:a")
if err := d.AddPullTicket(repo, "t1", PullTicket{Author: "did:plc:bob", State: "open"}); err != nil {
t.Fatal(err)
}
ev := PullEvent{RepoDid: repo, Ticket: "t1", Event: "closed", Pull: []byte("{}")}
if err := d.SetPullTicketState(repo, "t1", "open", "closed", ev); err != nil {
t.Fatal(err)
}
if err := d.SetPullTicketState(repo, "t1", "open", "completed", ev); !errors.Is(err, ErrPullRaced) {
t.Fatalf("a second set from open = %v, want ErrPullRaced", err)
}
due, err := d.DuePullEvents(repo, time.Now().Add(time.Hour), 100)
if err != nil || len(due) != 1 {
t.Fatalf("events = %d, %v, want only the first set's", len(due), err)
}
}