package shape import ( "context" "testing" "gitea.maximumdirect.net/eric/notarius/internal/framework/contracts" "gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline" ) func TestValidatorApprovesWellFormedSpellPayload(t *testing.T) { result, err := New().Validate(context.Background(), requestWithPayload(`{"spell_casts":[{"caster":"Aria","spell":"Cure Wounds","effect":"heals","narrative_description":"Aria heals Borin.","source_refs":[{"source_id":"session","start_unit_id":1,"end_unit_id":1}]}]}`)) if err != nil { t.Fatalf("Validate() error = %v, want nil", err) } if !result.Approved { t.Fatalf("Validate() = %#v, want approved", result) } } func TestValidatorRejectsMalformedPayload(t *testing.T) { result, err := New().Validate(context.Background(), requestWithPayload(`{"spell_casts":`)) if err != nil { t.Fatalf("Validate() error = %v, want nil", err) } if result.Approved { t.Fatalf("Approved = true, want false") } if result.ReasonCode != ReasonCode { t.Fatalf("ReasonCode = %q, want %q", result.ReasonCode, ReasonCode) } } func TestValidatorRejectsMissingRequiredSpellFields(t *testing.T) { result, err := New().Validate(context.Background(), requestWithPayload(`{"spell_casts":[{"caster":"Aria","effect":"heals","narrative_description":"Aria heals Borin.","source_refs":[{"source_id":"session","start_unit_id":1,"end_unit_id":1}]}]}`)) if err != nil { t.Fatalf("Validate() error = %v, want nil", err) } if result.Approved { t.Fatalf("Approved = true, want false") } if result.ReasonCode != ReasonCode { t.Fatalf("ReasonCode = %q, want %q", result.ReasonCode, ReasonCode) } } func TestSpecAndRegister(t *testing.T) { registry := pipeline.NewValidatorRegistry() if err := Register(registry); err != nil { t.Fatalf("Register() error = %v, want nil", err) } validator, err := registry.BuildLegacyRaw(Key) if err != nil { t.Fatalf("Build(%q) error = %v, want nil", Key, err) } if validator.Name() != Key || validator.ExecutionClass() != contracts.ExecutionClassDeterministic { t.Fatalf("validator = %q/%q, want key and deterministic execution", validator.Name(), validator.ExecutionClass()) } } func requestWithPayload(payload string) contracts.ValidationRequest { return contracts.ValidationRequest{ Payload: contracts.RawPayload{ Content: []byte(payload), MediaType: "application/json", }, } }