Something went wrong. Try again.
wip outbox library design
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119package outpost
import ( "context" "encoding/json" "maps" "testing" "time")
func TestEmit(t *testing.T) { when := time.Now().Add(time.Hour).Round(time.Second)
tests := []struct { name string payload any opts []EmitOption wantBody map[string]string wantGeneratedID bool want Message }{ { name: "explicit options", payload: map[string]string{"to": "ada@example.com"}, opts: []EmitOption{ ID("known"), Key("ada"), Header("traceparent", "00-x"), AvailableAt(when), }, wantBody: map[string]string{"to": "ada@example.com"}, want: Message{ ID: "known", Key: "ada", Headers: map[string]string{"traceparent": "00-x"}, AvailableAt: when, }, }, { name: "defaults", payload: struct{}{}, wantBody: map[string]string{}, wantGeneratedID: true, }, }
for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var got []Message a := AppenderFunc(func(_ context.Context, msgs ...Message) error { got = append(got, msgs...) return nil }) if err := Emit(context.Background(), a, "email.send", tt.payload, tt.opts...); err != nil { t.Fatalf("Emit: %v", err) } if len(got) != 1 { t.Fatalf("appended %d messages, want 1", len(got)) }
m := got[0] if m.Name != "email.send" { t.Errorf("Name = %q, want email.send", m.Name) } if m.CreatedAt.IsZero() { t.Error("CreatedAt is zero") } switch { case tt.wantGeneratedID && m.ID == "": t.Error("ID not generated") case !tt.wantGeneratedID && m.ID != tt.want.ID: t.Errorf("ID = %q, want %q", m.ID, tt.want.ID) } if m.Key != tt.want.Key { t.Errorf("Key = %q, want %q", m.Key, tt.want.Key) } if !maps.Equal(m.Headers, tt.want.Headers) { t.Errorf("Headers = %v, want %v", m.Headers, tt.want.Headers) } if !m.AvailableAt.Equal(tt.want.AvailableAt) { t.Errorf("AvailableAt = %v, want %v", m.AvailableAt, tt.want.AvailableAt) }
var body map[string]string if err := json.Unmarshal(m.Payload, &body); err != nil { t.Fatalf("payload is not valid JSON: %v", err) } if !maps.Equal(body, tt.wantBody) { t.Errorf("payload = %v, want %v", body, tt.wantBody) } }) }}
func TestEmitRejectsBadInput(t *testing.T) { tests := []struct { name string appender Appender msgName string }{ { name: "empty name", appender: AppenderFunc(func(context.Context, ...Message) error { return nil }), }, { name: "nil appender", msgName: "email.send", }, }
for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := Emit(context.Background(), tt.appender, tt.msgName, 1); err == nil { t.Fatal("want error") } }) }}