Files
notarius/internal/modules/dnd/codec/candidatejson/candidate_json_test.go

48 lines
1.3 KiB
Go

package candidatejson
import (
"encoding/json"
"reflect"
"strings"
"testing"
)
type testCandidate struct {
Items []string `json:"items"`
}
func TestCandidateJSON(t *testing.T) {
input := testCandidate{Items: []string{"one", "two"}}
content, err := EncodeCandidate("test candidate", input)
if err != nil {
t.Fatalf("EncodeCandidate() error = %v", err)
}
if !json.Valid(content) {
t.Fatalf("EncodeCandidate() = %q, want JSON", content)
}
for _, test := range []struct {
name string
content []byte
want testCandidate
wantErr string
}{
{name: "typed round trip", content: content, want: input},
{name: "unknown field", content: []byte(`{"items":[],"unexpected":true}`), wantErr: "unknown field"},
{name: "malformed JSON", content: []byte(`{"items":`), wantErr: "decode test candidate"},
{name: "trailing value", content: []byte(`{"items":[]} {}`), wantErr: "multiple JSON values"},
} {
t.Run(test.name, func(t *testing.T) {
got, err := DecodeCandidate[testCandidate]("test candidate", test.content)
if test.wantErr != "" {
if err == nil || !strings.Contains(err.Error(), test.wantErr) {
t.Fatalf("DecodeCandidate() error = %v, want %q", err, test.wantErr)
}
return
}
if err != nil || !reflect.DeepEqual(got, test.want) {
t.Fatalf("DecodeCandidate() = %#v, %v; want %#v", got, err, test.want)
}
})
}
}