56 lines
1.5 KiB
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")
|
|
}
|
|
}
|