100 lines
2.9 KiB
Go
100 lines
2.9 KiB
Go
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"},
|
|
},
|
|
}
|
|
}
|