mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-15 21:02:03 +00:00
feat: add durable outbox dispatcher
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
@@ -18,6 +21,38 @@ func TestOutboxSQLPreservesReplayableOrderedReadAndPublishAck(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestOutboxDispatcherAcknowledgesOnlyAfterDelivery(t *testing.T) {
|
||||
events := []OutboxEvent{{EventID: "event-1"}, {EventID: "event-2"}}
|
||||
var delivered, acknowledged []string
|
||||
dispatcher := &OutboxDispatcher{
|
||||
Read: func(context.Context, int) ([]OutboxEvent, error) { return events, nil },
|
||||
Deliver: func(_ context.Context, event OutboxEvent) error {
|
||||
delivered = append(delivered, event.EventID)
|
||||
if event.EventID == "event-2" {
|
||||
return errors.New("transient fan-out failure")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
Ack: func(_ context.Context, eventID string, _ time.Time) error {
|
||||
acknowledged = append(acknowledged, eventID)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
count, err := dispatcher.Dispatch(context.Background(), 10, time.Unix(1000, 0))
|
||||
if err == nil || count != 1 {
|
||||
t.Fatalf("dispatch = (%d, %v), want one acknowledged event and an error", count, err)
|
||||
}
|
||||
if !reflect.DeepEqual(delivered, []string{"event-1", "event-2"}) || !reflect.DeepEqual(acknowledged, []string{"event-1"}) {
|
||||
t.Fatalf("delivery/ack order = %v/%v", delivered, acknowledged)
|
||||
}
|
||||
}
|
||||
|
||||
func TestOutboxDispatcherRejectsInvalidConfiguration(t *testing.T) {
|
||||
if count, err := (*OutboxDispatcher)(nil).Dispatch(context.Background(), 1, time.Unix(1000, 0)); err == nil || count != 0 {
|
||||
t.Fatal("nil dispatcher accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestOutboxAdaptersRejectUnsafeArgumentsWithoutDatabase(t *testing.T) {
|
||||
if _, err := ReadUnpublishedOutbox(nil, nil, 1); err == nil {
|
||||
t.Fatal("nil database accepted")
|
||||
|
||||
Reference in New Issue
Block a user