Files
go-omni/contract/documentation_test.go

56 lines
1.5 KiB
Go

package contract
import (
"encoding/json"
"reflect"
"testing"
)
type documentationScalar string
var documentationDecodeCalls int
func (v documentationScalar) MarshalJSON() ([]byte, error) { return json.Marshal(string(v)) }
func (v *documentationScalar) UnmarshalJSON(raw []byte) error {
documentationDecodeCalls++
var s string
err := json.Unmarshal(raw, &s)
*v = documentationScalar(s)
return err
}
func TestDocumentationNeverRunsNestedScalarDecoders(t *testing.T) {
type nested struct {
ID documentationScalar `json:"id"`
}
type input struct {
Value nested `json:"value" example:"{\"id\":\"123\"}"`
}
documentationDecodeCalls = 0
scalar := ScalarOf[documentationScalar]("string", "string", false)
if _, err := New[input](scalar); err != nil {
t.Fatal(err)
}
if _, err := Describe(reflect.TypeOf(input{}), scalar); err != nil {
t.Fatal(err)
}
if documentationDecodeCalls != 0 {
t.Fatal("metadata invoked business decoder")
}
type bad struct {
Value nested `json:"value" example:"{\"id\":123}"`
}
if _, err := Describe(reflect.TypeOf(bad{}), scalar); err == nil {
t.Fatal("invalid scalar wire example accepted")
}
type constrained struct {
ID documentationScalar `json:"id"`
Count int `json:"count,range=[1:3]"`
}
type invalidConstraint struct {
Value constrained `json:"value" example:"{\"id\":\"123\",\"count\":9}"`
}
if _, err := Describe(reflect.TypeOf(invalidConstraint{}), scalar); err == nil {
t.Fatal("nested scalar bypassed another field's example constraints")
}
}