121 lines
3.5 KiB
Go
121 lines
3.5 KiB
Go
package spells
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
|
|
"gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline"
|
|
)
|
|
|
|
func TestNewReturnsExtractorWithMetadata(t *testing.T) {
|
|
extractor := New()
|
|
if extractor == nil {
|
|
t.Fatal("New() = nil, want extractor")
|
|
}
|
|
if extractor.Key() != Key {
|
|
t.Fatalf("extractor.Key() = %q, want %q", extractor.Key(), Key)
|
|
}
|
|
}
|
|
|
|
func TestModuleSpec(t *testing.T) {
|
|
got := ModuleSpec()
|
|
want := pipeline.ModuleSpec{
|
|
Key: Key,
|
|
Stage: pipeline.StageExtract,
|
|
Requires: []string{
|
|
"chunks",
|
|
"source.transcript",
|
|
},
|
|
Provides: []string{
|
|
"dnd.spell_casts",
|
|
},
|
|
ReferenceSlots: []contracts.ReferenceSlot{
|
|
{
|
|
Name: "glossary",
|
|
Description: "Optional campaign glossary reference material used only for disambiguation.",
|
|
AcceptedMediaTypes: []string{"application/json", "application/x-yaml", "application/yaml", "text/markdown", "text/plain"},
|
|
},
|
|
{
|
|
Name: "party",
|
|
Description: "Optional party roster reference material used only for disambiguation.",
|
|
AcceptedMediaTypes: []string{"application/json", "application/x-yaml", "application/yaml", "text/markdown", "text/plain"},
|
|
},
|
|
{
|
|
Name: "players",
|
|
Description: "Optional player list reference material used only for disambiguation.",
|
|
AcceptedMediaTypes: []string{"application/json", "application/x-yaml", "application/yaml", "text/markdown", "text/plain"},
|
|
},
|
|
{
|
|
Name: "roster",
|
|
Description: "Deprecated alias for party roster reference material used only for disambiguation.",
|
|
AcceptedMediaTypes: []string{"application/json", "application/x-yaml", "application/yaml", "text/markdown", "text/plain"},
|
|
},
|
|
},
|
|
}
|
|
if !reflect.DeepEqual(got, want) {
|
|
t.Fatalf("ModuleSpec() = %#v, want %#v", got, want)
|
|
}
|
|
|
|
got.Requires[0] = "changed"
|
|
got.Provides[0] = "changed"
|
|
got.ReferenceSlots[0].AcceptedMediaTypes[0] = "changed"
|
|
again := ModuleSpec()
|
|
if !reflect.DeepEqual(again, want) {
|
|
t.Fatalf("ModuleSpec() after caller mutation = %#v, want %#v", again, want)
|
|
}
|
|
}
|
|
|
|
func TestRegisterMakesExtractorBuildable(t *testing.T) {
|
|
registry := pipeline.NewExtractorRegistry()
|
|
|
|
if err := Register(registry); err != nil {
|
|
t.Fatalf("Register() error = %v, want nil", err)
|
|
}
|
|
|
|
extractor, err := registry.Build(Key)
|
|
if err != nil {
|
|
t.Fatalf("Build() error = %v, want nil", err)
|
|
}
|
|
if extractor.Key() != Key {
|
|
t.Fatalf("extractor.Key() = %q, want %q", extractor.Key(), Key)
|
|
}
|
|
}
|
|
|
|
func TestRegisterStoresModuleSpec(t *testing.T) {
|
|
registry := pipeline.NewExtractorRegistry()
|
|
|
|
if err := Register(registry); err != nil {
|
|
t.Fatalf("Register() error = %v, want nil", err)
|
|
}
|
|
|
|
got, ok := registry.Spec(Key)
|
|
if !ok {
|
|
t.Fatal("Spec() ok = false, want true")
|
|
}
|
|
want := ModuleSpec()
|
|
if !reflect.DeepEqual(got, want) {
|
|
t.Fatalf("Spec() = %#v, want %#v", got, want)
|
|
}
|
|
}
|
|
|
|
func TestRuntimeReferenceSlotsMatchModuleSpec(t *testing.T) {
|
|
extractor := New()
|
|
spec := ModuleSpec()
|
|
|
|
if !reflect.DeepEqual(extractor.ReferenceSlots(), spec.ReferenceSlots) {
|
|
t.Fatalf("ReferenceSlots() = %#v, want spec slots %#v", extractor.ReferenceSlots(), spec.ReferenceSlots)
|
|
}
|
|
}
|
|
|
|
func TestRegisterNilRegistryReturnsError(t *testing.T) {
|
|
err := Register(nil)
|
|
if err == nil {
|
|
t.Fatal("Register(nil) error = nil, want error")
|
|
}
|
|
if !strings.Contains(err.Error(), "extractor registry") {
|
|
t.Fatalf("Register(nil) error = %q, want registry context", err.Error())
|
|
}
|
|
}
|