package workerdiagnostic import ( "context" "encoding/json" "errors" "fmt" "strings" "testing" "git.5iot.com/iotlcm-public/iotlcm-openapi/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-openapi/internal/model" ) func TestPublish(t *testing.T) { var ( publishedQueue string publishedPayload model.WorkerDiagnosticMessage ) service := New(func(ctx context.Context, queue string, data any) error { publishedQueue = queue var ok bool publishedPayload, ok = data.(model.WorkerDiagnosticMessage) if !ok { t.Fatalf("unexpected payload type %T", data) } return nil }) result, err := service.Publish(context.Background(), "worker ping") if err != nil { t.Fatalf("Publish() error = %v", err) } if publishedQueue != consts.QueueWorkerDiagnostic { t.Fatalf("queue = %q, want %q", publishedQueue, consts.QueueWorkerDiagnostic) } if !strings.HasPrefix(result.TraceID, "worker-test-") { t.Fatalf("traceId = %q, want worker-test- prefix", result.TraceID) } if result.SentAt <= 0 { t.Fatalf("sentAt = %d, want positive timestamp", result.SentAt) } if result.Queue != consts.QueueWorkerDiagnostic { t.Fatalf("result queue = %q, want %q", result.Queue, consts.QueueWorkerDiagnostic) } if publishedPayload.TraceID != result.TraceID || publishedPayload.SentAt != result.SentAt { t.Fatalf("published identifiers = %+v, result = %+v", publishedPayload, result) } if publishedPayload.Message != "worker ping" { t.Fatalf("message = %q, want worker ping", publishedPayload.Message) } body, err := json.Marshal(publishedPayload) if err != nil { t.Fatalf("json.Marshal() error = %v", err) } wantJSON := `{"traceId":"` + result.TraceID + `","sentAt":` + fmt.Sprint(result.SentAt) + `,"message":"worker ping"}` if string(body) != wantJSON { t.Fatalf("JSON = %s, want %s", body, wantJSON) } } func TestPublishWrapsPublisherError(t *testing.T) { publishErr := errors.New("broker unavailable") service := New(func(ctx context.Context, queue string, data any) error { return publishErr }) result, err := service.Publish(context.Background(), "worker ping") if result != nil { t.Fatalf("result = %+v, want nil", result) } if err == nil { t.Fatal("Publish() error = nil, want error") } if !errors.Is(err, publishErr) { t.Fatalf("Publish() error = %v, want wrapped publisher error", err) } if !strings.Contains(err.Error(), "publish worker diagnostic message failed") { t.Fatalf("Publish() error = %v, want context", err) } }