Files
go-sip/internal/mq/rejection_test.go
T

66 lines
2.2 KiB
Go

package mq
import (
"bytes"
"context"
"errors"
"testing"
"git.ipao.vip/rogee/go-sip/internal/tenant"
amqp "github.com/rabbitmq/amqp091-go"
)
func TestInvalidDataAckWaitsForDurableHandling(t *testing.T) {
route, err := tenant.ControlRoute("c046b893-8628-4589-ae50-619d049248a6")
if err != nil {
t.Fatal(err)
}
raw := []byte(`{"event_id":"original-event"}`)
for _, fail := range []bool{false, true} {
t.Run(map[bool]string{false: "durable", true: "storage failure"}[fail], func(t *testing.T) {
ack := &currentRejectRecorder{}
b := &Broker{controlQueue: route.Queue}
b.SetInvalidMessageHandler(func(ctx context.Context, queue, key string, body []byte, cause error) error {
if ack.acked != 0 || ack.nacked != 0 {
t.Fatal("input disposed before rejection persisted")
}
if queue != route.Queue || key != route.BindingKey || !bytes.Equal(body, raw) || cause == nil {
t.Fatal("original rejection context lost")
}
if fail {
return errors.New("evidence storage failed")
}
return nil
})
err := b.rejectInbound(context.Background(), route.Queue, amqp.Delivery{Body: raw, RoutingKey: route.BindingKey, Acknowledger: ack}, errors.New("issued_at required"))
if fail {
if err == nil || ack.acked != 0 || ack.nacked != 1 || !ack.requeued {
t.Fatalf("identified data discarded on persistence failure: %+v %v", ack, err)
}
} else {
if err != nil || ack.acked != 1 || ack.rejected != 0 {
t.Fatalf("durable rejection not acknowledged: %+v %v", ack, err)
}
}
})
}
}
func TestRejectionRouteMustBelongToDispatcher(t *testing.T) {
id := "c046b893-8628-4589-ae50-619d049248a6"
route, err := tenant.ControlRoute(id)
if err != nil {
t.Fatal(err)
}
task, err := tenant.TaskRoute(id, "5")
if err != nil {
t.Fatal(err)
}
b := &Broker{dispatcherID: id, controlQueue: route.Queue}
if !b.OwnsRejectionRoute(route.Queue, route.BindingKey) || !b.OwnsRejectionRoute(task.Queue, task.BindingKey) {
t.Fatal("own source rejected")
}
if b.OwnsRejectionRoute(route.Queue, "d.other.control.in") || b.OwnsRejectionRoute("agent-call.d.other.control.v1", route.BindingKey) {
t.Fatal("foreign source accepted")
}
}