48 lines
1.3 KiB
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)
|
|
}
|
|
})
|
|
}
|
|
}
|