mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
52 lines
2.0 KiB
Go
52 lines
2.0 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestRevisionedReplicaRejectsGapAndConvergesAfterAuthoritativeSnapshot(t *testing.T) {
|
|
r, err := NewReplicaResource(ResourceQueueTicket, "ticket-1", Queued)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := r.ApplyEvent(SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 2, State: Accepted}); !errors.Is(err, ErrRevisionGap) || !r.NeedsResync {
|
|
t.Fatalf("gap = %+v err=%v", r, err)
|
|
}
|
|
if err := r.ApplyEvent(SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 1, State: Proposed}); !errors.Is(err, ErrRevisionGap) {
|
|
t.Fatalf("event applied while resync required: %v", err)
|
|
}
|
|
if err := r.ReplaceSnapshot(2, Accepted); err != nil || r.NeedsResync {
|
|
t.Fatalf("snapshot = %+v err=%v", r, err)
|
|
}
|
|
if err := r.ApplyEvent(SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 3, State: Allocating}); err != nil || r.Revision != 3 {
|
|
t.Fatalf("resume = %+v err=%v", r, err)
|
|
}
|
|
}
|
|
|
|
func TestReplicaRejectsInvalidInitialState(t *testing.T) {
|
|
if _, err := NewReplicaResource(ResourceProposal, "proposal-1", Live); err == nil {
|
|
t.Fatal("invalid proposal state accepted")
|
|
}
|
|
}
|
|
|
|
func TestRevisionedReplicaMakesDuplicateAndOutOfOrderEventsIdempotent(t *testing.T) {
|
|
r, _ := NewReplicaResource(ResourceQueueTicket, "ticket-1", Queued)
|
|
event := SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 1, State: Proposed}
|
|
if err := r.ApplyEvent(event); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := r.ApplyEvent(event); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := r.ApplyEvent(SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 0, State: Queued}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if r.Revision != 1 || r.State != Proposed {
|
|
t.Fatalf("replay changed state: %+v", r)
|
|
}
|
|
if err := r.ApplyEvent(SyncEvent{Kind: ResourceQueueTicket, ResourceID: "ticket-1", Revision: 1, State: Accepted}); !errors.Is(err, ErrSyncConflict) {
|
|
t.Fatalf("same-revision conflict = %v", err)
|
|
}
|
|
}
|