package noop import ( "context" "reflect" "testing" "gitea.maximumdirect.net/eric/notarius/internal/framework/contracts" "gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline" ) func TestModuleSpecAndRegister(t *testing.T) { want := pipeline.ModuleSpec{ Key: Key, Stage: pipeline.StageNormalize, Requires: []string{"merged"}, Provides: []string{"normalized"}, } if got := ModuleSpec(); !reflect.DeepEqual(got, want) { t.Fatalf("ModuleSpec() = %#v, want %#v", got, want) } registry := pipeline.NewNormalizerRegistry() if err := Register(registry); err != nil { t.Fatalf("Register() error = %v, want nil", err) } spec, ok := registry.Spec(Key) if !ok { t.Fatalf("Spec(%q) ok = false, want true", Key) } if !reflect.DeepEqual(spec, want) { t.Fatalf("registered spec = %#v, want %#v", spec, want) } normalizer, err := registry.Build(Key) if err != nil { t.Fatalf("Build(%q) error = %v, want nil", Key, err) } if slots := normalizer.ReferenceSlots(); len(slots) != 0 { t.Fatalf("ReferenceSlots() = %#v, want none", slots) } } func TestNormalizePassesThroughMergeOutput(t *testing.T) { input := mergeOutput(`{"name":"original"}`) result, err := New().Normalize(context.Background(), contracts.NormalizeRequest{ LaneID: "events", MergeOutput: input, }) if err != nil { t.Fatalf("Normalize() error = %v, want nil", err) } if result.Output.LaneID != "events" || result.Output.NormalizerKey != Key { t.Fatalf("output provenance = %#v, want lane and normalizer", result.Output) } if string(result.Output.Payload.Content) != `{"name":"original"}` { t.Fatalf("content = %s, want original content", result.Output.Payload.Content) } if result.Output.Payload.Metadata["name"] != "original" { t.Fatalf("metadata = %#v, want original metadata", result.Output.Payload.Metadata) } } func TestNormalizeDefensivelyCopiesRawPayload(t *testing.T) { input := mergeOutput(`{"name":"original"}`) result, err := New().Normalize(context.Background(), contracts.NormalizeRequest{ LaneID: "events", MergeOutput: input, }) if err != nil { t.Fatalf("Normalize() error = %v, want nil", err) } input.Payload.Content[0] = '[' input.Payload.Metadata["name"] = "changed" if string(result.Output.Payload.Content) != `{"name":"original"}` { t.Fatalf("content changed after input mutation: %s", result.Output.Payload.Content) } if result.Output.Payload.Metadata["name"] != "original" { t.Fatalf("metadata changed after input mutation: %#v", result.Output.Payload.Metadata) } } func mergeOutput(content string) contracts.MergeOutput { return contracts.MergeOutput{ LaneID: "events", MergerKey: "merge", SourceID: "source-1", Schema: contracts.ResponseSchema{ID: "schema-id", Name: "schema-name", Version: "v1"}, Payload: contracts.RawPayload{ Content: []byte(content), MediaType: "application/json", Metadata: map[string]any{"name": "original"}, }, } }