package rabbitmq import ( "context" "encoding/json" "errors" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/service/trafficusage" amqp "github.com/rabbitmq/amqp091-go" "testing" "time" ) func TestTrafficUsageRetryRetainsPayload(t *testing.T) { stubTrafficPublish(t) usage := 12.5 handler := &trafficUsageHandlerStub{dailyErr: &trafficusage.Failure{Cause: errors.New("database down"), UsageMb: &usage}} consumer := New(handler, nil, nil) message := model.TrafficUsageDailyRetryMessage{SimKey: &model.SimKey{ICCID: "card"}, Card: model.TrafficUsageSimCard{Iccid: "card"}, QueryDate: "20260831"} calls := 0 trafficUsagePublishDelayed = func(_ context.Context, queue, target string, delay time.Duration, body []byte, _ amqp.Table) error { calls++ var retry model.TrafficUsageDailyRetryMessage if err := json.Unmarshal(body, &retry); err != nil { t.Fatal(err) } if retry.Attempt != 1 || retry.UsageMb == nil || *retry.UsageMb != usage || retry.QueryDate != message.QueryDate || retry.LastError == "" || delay != 30*time.Second || target != consts.QueueTrafficUsageDailyRetry || queue == target { t.Fatalf("invalid retry: %+v", retry) } return nil } if err := consumer.handleTrafficUsageDailyRetry(context.Background(), message); err != nil || calls != 1 { t.Fatalf("calls=%d err=%v", calls, err) } message.Attempt = 9 dlqCalls := 0 trafficUsagePublish = func(_ context.Context, queue string, body []byte, _ amqp.Table) error { dlqCalls++ if queue != consts.QueueTrafficUsageDailyRetry+".dlq" { t.Fatal(queue) } var retry model.TrafficUsageDailyRetryMessage if err := json.Unmarshal(body, &retry); err != nil { t.Fatal(err) } if retry.Attempt != 10 || retry.UsageMb == nil { t.Fatal("DLQ lost snapshot") } return nil } if err := consumer.handleTrafficUsageDailyRetry(context.Background(), message); err != nil || dlqCalls != 1 || calls != 1 { t.Fatalf("DLQ not published: %v", err) } expected := errors.New("broker unavailable") trafficUsagePublish = func(context.Context, string, []byte, amqp.Table) error { return expected } if err := consumer.handleTrafficUsageDailyRetry(context.Background(), message); !errors.Is(err, expected) { t.Fatal("failed publication must not ack original") } }