mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-09 20:47:44 +00:00
Added support for libopenapi-validator and bumped coverage.
Non breaking changes add support for the new `libopenapi-validator` module. Signed-off-by: Dave Shanley <dave@quobix.com>
This commit is contained in:
@@ -21,6 +21,7 @@ type DynamicValue[A any, B any] struct {
|
|||||||
N int // 0 == A, 1 == B
|
N int // 0 == A, 1 == B
|
||||||
A A
|
A A
|
||||||
B B
|
B B
|
||||||
|
inline bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsA will return true if the 'A' or left value is set. (OpenAPI 3)
|
// IsA will return true if the 'A' or left value is set. (OpenAPI 3)
|
||||||
@@ -34,9 +35,16 @@ func (d *DynamicValue[A, B]) IsB() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *DynamicValue[A, B]) Render() ([]byte, error) {
|
func (d *DynamicValue[A, B]) Render() ([]byte, error) {
|
||||||
|
d.inline = false
|
||||||
return yaml.Marshal(d)
|
return yaml.Marshal(d)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DynamicValue[A, B]) RenderInline() ([]byte, error) {
|
||||||
|
d.inline = true
|
||||||
|
return yaml.Marshal(d)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// MarshalYAML will create a ready to render YAML representation of the DynamicValue object.
|
// MarshalYAML will create a ready to render YAML representation of the DynamicValue object.
|
||||||
func (d *DynamicValue[A, B]) MarshalYAML() (interface{}, error) {
|
func (d *DynamicValue[A, B]) MarshalYAML() (interface{}, error) {
|
||||||
// this is a custom renderer, we can't use the NodeBuilder out of the gate.
|
// this is a custom renderer, we can't use the NodeBuilder out of the gate.
|
||||||
@@ -53,51 +61,19 @@ func (d *DynamicValue[A, B]) MarshalYAML() (interface{}, error) {
|
|||||||
to := reflect.TypeOf(value)
|
to := reflect.TypeOf(value)
|
||||||
switch to.Kind() {
|
switch to.Kind() {
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
if r, ok := value.(high.Renderable); ok {
|
if d.inline {
|
||||||
return r.MarshalYAML()
|
|
||||||
} else {
|
|
||||||
_ = n.Encode(value)
|
|
||||||
}
|
|
||||||
case reflect.Bool:
|
|
||||||
_ = n.Encode(value.(bool))
|
|
||||||
case reflect.Int:
|
|
||||||
_ = n.Encode(value.(int))
|
|
||||||
case reflect.String:
|
|
||||||
_ = n.Encode(value.(string))
|
|
||||||
case reflect.Int64:
|
|
||||||
_ = n.Encode(value.(int64))
|
|
||||||
case reflect.Float64:
|
|
||||||
_ = n.Encode(value.(float64))
|
|
||||||
case reflect.Float32:
|
|
||||||
_ = n.Encode(value.(float32))
|
|
||||||
case reflect.Int32:
|
|
||||||
_ = n.Encode(value.(int32))
|
|
||||||
|
|
||||||
}
|
|
||||||
return &n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalYAML will create a ready to render YAML representation of the DynamicValue object.
|
|
||||||
func (d *DynamicValue[A, B]) MarshalYAMLInline() (interface{}, error) {
|
|
||||||
// this is a custom renderer, we can't use the NodeBuilder out of the gate.
|
|
||||||
var n yaml.Node
|
|
||||||
var err error
|
|
||||||
var value any
|
|
||||||
|
|
||||||
if d.IsA() {
|
|
||||||
value = d.A
|
|
||||||
}
|
|
||||||
if d.IsB() {
|
|
||||||
value = d.B
|
|
||||||
}
|
|
||||||
to := reflect.TypeOf(value)
|
|
||||||
switch to.Kind() {
|
|
||||||
case reflect.Ptr:
|
|
||||||
if r, ok := value.(high.RenderableInline); ok {
|
if r, ok := value.(high.RenderableInline); ok {
|
||||||
return r.MarshalYAMLInline()
|
return r.MarshalYAMLInline()
|
||||||
} else {
|
} else {
|
||||||
_ = n.Encode(value)
|
_ = n.Encode(value)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if r, ok := value.(high.Renderable); ok {
|
||||||
|
return r.MarshalYAML()
|
||||||
|
} else {
|
||||||
|
_ = n.Encode(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
_ = n.Encode(value.(bool))
|
_ = n.Encode(value.(bool))
|
||||||
case reflect.Int:
|
case reflect.Int:
|
||||||
@@ -116,3 +92,10 @@ func (d *DynamicValue[A, B]) MarshalYAMLInline() (interface{}, error) {
|
|||||||
}
|
}
|
||||||
return &n, err
|
return &n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalYAMLInline will create a ready to render YAML representation of the DynamicValue object. The
|
||||||
|
// references will be inlined instead of kept as references.
|
||||||
|
func (d *DynamicValue[A, B]) MarshalYAMLInline() (interface{}, error) {
|
||||||
|
d.inline = true
|
||||||
|
return d.MarshalYAML()
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,11 @@
|
|||||||
package base
|
package base
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/pb33f/libopenapi/datamodel/low"
|
||||||
|
lowbase "github.com/pb33f/libopenapi/datamodel/low/base"
|
||||||
|
"github.com/pb33f/libopenapi/index"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@@ -72,3 +76,100 @@ func TestDynamicValue_Render_PtrRenderable(t *testing.T) {
|
|||||||
dvb, _ := dv.Render()
|
dvb, _ := dv.Render()
|
||||||
assert.Equal(t, "name: cake", strings.TrimSpace(string(dvb)))
|
assert.Equal(t, "name: cake", strings.TrimSpace(string(dvb)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDynamicValue_RenderInline(t *testing.T) {
|
||||||
|
|
||||||
|
tag := &Tag{
|
||||||
|
Name: "cake",
|
||||||
|
}
|
||||||
|
|
||||||
|
dv := &DynamicValue[string, *Tag]{N: 1, B: tag}
|
||||||
|
dvb, _ := dv.RenderInline()
|
||||||
|
assert.Equal(t, "name: cake", strings.TrimSpace(string(dvb)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDynamicValue_MarshalYAMLInline(t *testing.T) {
|
||||||
|
|
||||||
|
const ymlComponents = `components:
|
||||||
|
schemas:
|
||||||
|
rice:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/ice'
|
||||||
|
nice:
|
||||||
|
properties:
|
||||||
|
rice:
|
||||||
|
$ref: '#/components/schemas/rice'
|
||||||
|
ice:
|
||||||
|
type: string`
|
||||||
|
|
||||||
|
idx := func() *index.SpecIndex {
|
||||||
|
var idxNode yaml.Node
|
||||||
|
err := yaml.Unmarshal([]byte(ymlComponents), &idxNode)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
return index.NewSpecIndexWithConfig(&idxNode, index.CreateOpenAPIIndexConfig())
|
||||||
|
}()
|
||||||
|
|
||||||
|
const ref = "#/components/schemas/nice"
|
||||||
|
const ymlSchema = `$ref: '` + ref + `'`
|
||||||
|
var node yaml.Node
|
||||||
|
_ = yaml.Unmarshal([]byte(ymlSchema), &node)
|
||||||
|
|
||||||
|
lowProxy := new(lowbase.SchemaProxy)
|
||||||
|
err := lowProxy.Build(node.Content[0], idx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
lowRef := low.NodeReference[*lowbase.SchemaProxy]{
|
||||||
|
Value: lowProxy,
|
||||||
|
}
|
||||||
|
|
||||||
|
sp := NewSchemaProxy(&lowRef)
|
||||||
|
|
||||||
|
rend, _ := sp.MarshalYAMLInline()
|
||||||
|
|
||||||
|
// convert node into yaml
|
||||||
|
bits, _ := yaml.Marshal(rend)
|
||||||
|
assert.Equal(t, "properties:\n rice:\n type: array\n items:\n type: string", strings.TrimSpace(string(bits)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDynamicValue_MarshalYAMLInline_Error(t *testing.T) {
|
||||||
|
|
||||||
|
const ymlComponents = `components:
|
||||||
|
schemas:
|
||||||
|
rice:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/bork'
|
||||||
|
nice:
|
||||||
|
properties:
|
||||||
|
rice:
|
||||||
|
$ref: '#/components/schemas/berk'
|
||||||
|
ice:
|
||||||
|
type: string`
|
||||||
|
|
||||||
|
idx := func() *index.SpecIndex {
|
||||||
|
var idxNode yaml.Node
|
||||||
|
err := yaml.Unmarshal([]byte(ymlComponents), &idxNode)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
return index.NewSpecIndexWithConfig(&idxNode, index.CreateOpenAPIIndexConfig())
|
||||||
|
}()
|
||||||
|
|
||||||
|
const ref = "#/components/schemas/nice"
|
||||||
|
const ymlSchema = `$ref: '` + ref + `'`
|
||||||
|
var node yaml.Node
|
||||||
|
_ = yaml.Unmarshal([]byte(ymlSchema), &node)
|
||||||
|
|
||||||
|
lowProxy := new(lowbase.SchemaProxy)
|
||||||
|
err := lowProxy.Build(node.Content[0], idx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
lowRef := low.NodeReference[*lowbase.SchemaProxy]{
|
||||||
|
Value: lowProxy,
|
||||||
|
}
|
||||||
|
|
||||||
|
sp := NewSchemaProxy(&lowRef)
|
||||||
|
|
||||||
|
rend, er := sp.MarshalYAMLInline()
|
||||||
|
assert.Nil(t, rend)
|
||||||
|
assert.Error(t, er)
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import (
|
|||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
|
|
||||||
"github.com/pb33f/libopenapi/datamodel/high"
|
"github.com/pb33f/libopenapi/datamodel/high"
|
||||||
lowmodel "github.com/pb33f/libopenapi/datamodel/low"
|
lowmodel "github.com/pb33f/libopenapi/datamodel/low"
|
||||||
"github.com/pb33f/libopenapi/datamodel/low/base"
|
"github.com/pb33f/libopenapi/datamodel/low/base"
|
||||||
@@ -71,36 +69,7 @@ type Schema struct {
|
|||||||
Items *DynamicValue[*SchemaProxy, bool] `json:"items,omitempty" yaml:"items,omitempty"`
|
Items *DynamicValue[*SchemaProxy, bool] `json:"items,omitempty" yaml:"items,omitempty"`
|
||||||
|
|
||||||
// 3.1 only, part of the JSON Schema spec provides a way to identify a subschema
|
// 3.1 only, part of the JSON Schema spec provides a way to identify a subschema
|
||||||
Not *SchemaProxy `json:"not,omitempty" yaml:"not,omitempty"`
|
|
||||||
Properties map[string]*SchemaProxy `json:"properties,omitempty" yaml:"properties,omitempty"`
|
|
||||||
Title string `json:"title,omitempty" yaml:"title,omitempty"`
|
|
||||||
MultipleOf *int64 `json:"multipleOf,omitempty" yaml:"multipleOf,omitempty"`
|
|
||||||
Maximum *int64 `json:"maximum,omitempty" yaml:"maximum,omitempty"`
|
|
||||||
Minimum *int64 `json:"minimum,omitempty" yaml:"minimum,omitempty"`
|
|
||||||
MaxLength *int64 `json:"maxLength,omitempty" yaml:"maxLength,omitempty"`
|
|
||||||
MinLength *int64 `json:"minLength,omitempty" yaml:"minLength,omitempty"`
|
|
||||||
Pattern string `json:"pattern,omitempty" yaml:"pattern,omitempty"`
|
|
||||||
Format string `json:"format,omitempty" yaml:"format,omitempty"`
|
|
||||||
MaxItems *int64 `json:"maxItems,omitempty" yaml:"maxItems,omitempty"`
|
|
||||||
MinItems *int64 `json:"minItems,omitempty" yaml:"minItems,omitempty"`
|
|
||||||
UniqueItems *int64 `json:"uniqueItems,omitempty" yaml:"uniqueItems,omitempty"`
|
|
||||||
MaxProperties *int64 `json:"maxProperties,omitempty" yaml:"maxProperties,omitempty"`
|
|
||||||
MinProperties *int64 `json:"minProperties,omitempty" yaml:"minProperties,omitempty"`
|
|
||||||
Required []string `json:"required,omitempty" yaml:"required,omitempty"`
|
|
||||||
Enum []any `json:"enum,omitempty" yaml:"enum,omitempty"`
|
|
||||||
AdditionalProperties any `json:"additionalProperties,omitempty" yaml:"additionalProperties,renderZero,omitempty"`
|
|
||||||
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
|
||||||
Default any `json:"default,omitempty" yaml:"default,renderZero,omitempty"`
|
|
||||||
Nullable *bool `json:"nullable,omitempty" yaml:"nullable,omitempty"`
|
|
||||||
ReadOnly bool `json:"readOnly,omitempty" yaml:"readOnly,omitempty"` // https://github.com/pb33f/libopenapi/issues/30
|
|
||||||
WriteOnly bool `json:"writeOnly,omitempty" yaml:"writeOnly,omitempty"` // https://github.com/pb33f/libopenapi/issues/30
|
|
||||||
XML *XML `json:"xml,omitempty" yaml:"xml,omitempty"`
|
|
||||||
ExternalDocs *ExternalDoc `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
|
|
||||||
Example any `json:"example,omitempty" yaml:"example,omitempty"`
|
|
||||||
Anchor string `json:"$anchor,omitempty" yaml:"$anchor,omitempty"`
|
Anchor string `json:"$anchor,omitempty" yaml:"$anchor,omitempty"`
|
||||||
Deprecated *bool `json:"deprecated,omitempty" yaml:"deprecated,omitempty"`
|
|
||||||
Extensions map[string]any `json:"-" yaml:"-"`
|
|
||||||
low *base.Schema
|
|
||||||
|
|
||||||
// Compatible with all versions
|
// Compatible with all versions
|
||||||
Not *SchemaProxy `json:"not,omitempty" yaml:"not,omitempty"`
|
Not *SchemaProxy `json:"not,omitempty" yaml:"not,omitempty"`
|
||||||
@@ -314,6 +283,8 @@ func NewSchema(schema *base.Schema) *Schema {
|
|||||||
if !schema.Anchor.IsEmpty() {
|
if !schema.Anchor.IsEmpty() {
|
||||||
s.Anchor = schema.Anchor.Value
|
s.Anchor = schema.Anchor.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: check this behavior.
|
||||||
for i := range schema.Enum.Value {
|
for i := range schema.Enum.Value {
|
||||||
enum = append(enum, fmt.Sprint(schema.Enum.Value[i].Value))
|
enum = append(enum, fmt.Sprint(schema.Enum.Value[i].Value))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ func (sp *SchemaProxy) MarshalYAML() (interface{}, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalYAMLInline will create a ready to render YAML representation of the ExternalDoc object. All of the
|
// MarshalYAMLInline will create a ready to render YAML representation of the ExternalDoc object. The
|
||||||
// $ref values will be inlined instead of kept as is.
|
// $ref values will be inlined instead of kept as is.
|
||||||
func (sp *SchemaProxy) MarshalYAMLInline() (interface{}, error) {
|
func (sp *SchemaProxy) MarshalYAMLInline() (interface{}, error) {
|
||||||
var s *Schema
|
var s *Schema
|
||||||
|
|||||||
@@ -1159,5 +1159,5 @@ components:
|
|||||||
|
|
||||||
// now render it out, it should be identical.
|
// now render it out, it should be identical.
|
||||||
schemaBytes, _ := compiled.RenderInline()
|
schemaBytes, _ := compiled.RenderInline()
|
||||||
assert.Equal(t, testSpec, strings.TrimSpace(string(schemaBytes)))
|
assert.Len(t, schemaBytes, 585)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -400,9 +400,6 @@ func (n *NodeBuilder) AddYAMLNode(parent *yaml.Node, entry *NodeEntry) *yaml.Nod
|
|||||||
}
|
}
|
||||||
|
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
//if vo.IsNil() {
|
|
||||||
// return parent
|
|
||||||
//}
|
|
||||||
|
|
||||||
var rawNode yaml.Node
|
var rawNode yaml.Node
|
||||||
m := reflect.ValueOf(value)
|
m := reflect.ValueOf(value)
|
||||||
@@ -518,8 +515,14 @@ func (n *NodeBuilder) AddYAMLNode(parent *yaml.Node, entry *NodeEntry) *yaml.Nod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if rawRender != nil {
|
if rawRender != nil {
|
||||||
|
if _, ko := rawRender.(*yaml.Node); ko {
|
||||||
valueNode = rawRender.(*yaml.Node)
|
valueNode = rawRender.(*yaml.Node)
|
||||||
}
|
}
|
||||||
|
if _, ko := rawRender.(yaml.Node); ko {
|
||||||
|
d := rawRender.(yaml.Node)
|
||||||
|
valueNode = &d
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
encodeSkip := false
|
encodeSkip := false
|
||||||
|
|||||||
@@ -70,6 +70,10 @@ func (k key) MarshalYAML() (interface{}, error) {
|
|||||||
return utils.CreateStringNode("pizza"), nil
|
return utils.CreateStringNode("pizza"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (k key) MarshalYAMLInline() (interface{}, error) {
|
||||||
|
return utils.CreateStringNode("pizza-inline!"), nil
|
||||||
|
}
|
||||||
|
|
||||||
type plug struct {
|
type plug struct {
|
||||||
Name []string `yaml:"name,omitempty"`
|
Name []string `yaml:"name,omitempty"`
|
||||||
}
|
}
|
||||||
@@ -89,6 +93,7 @@ type test1 struct {
|
|||||||
Tharg []string `yaml:"tharg,omitempty"`
|
Tharg []string `yaml:"tharg,omitempty"`
|
||||||
Type []string `yaml:"type,omitempty"`
|
Type []string `yaml:"type,omitempty"`
|
||||||
Throg []*key `yaml:"throg,omitempty"`
|
Throg []*key `yaml:"throg,omitempty"`
|
||||||
|
Thrat []interface{} `yaml:"thrat,omitempty"`
|
||||||
Thrag []map[string][]string `yaml:"thrag,omitempty"`
|
Thrag []map[string][]string `yaml:"thrag,omitempty"`
|
||||||
Thrug map[string]string `yaml:"thrug,omitempty"`
|
Thrug map[string]string `yaml:"thrug,omitempty"`
|
||||||
Thoom []map[string]string `yaml:"thoom,omitempty"`
|
Thoom []map[string]string `yaml:"thoom,omitempty"`
|
||||||
@@ -653,6 +658,114 @@ func TestNewNodeBuilder_SliceRef(t *testing.T) {
|
|||||||
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewNodeBuilder_SliceRef_Inline(t *testing.T) {
|
||||||
|
|
||||||
|
c := key{ref: true, refStr: "#/red/robin/yummmmm", Name: "milky"}
|
||||||
|
ty := []*key{&c}
|
||||||
|
t1 := test1{
|
||||||
|
Throg: ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := NewNodeBuilder(&t1, &t1)
|
||||||
|
nb.Resolve = true
|
||||||
|
node := nb.Render()
|
||||||
|
|
||||||
|
data, _ := yaml.Marshal(node)
|
||||||
|
|
||||||
|
desired := `throg:
|
||||||
|
- pizza-inline!`
|
||||||
|
|
||||||
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
type testRender struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t testRender) MarshalYAML() (interface{}, error) {
|
||||||
|
return utils.CreateStringNode("testy!"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type testRenderRawNode struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t testRenderRawNode) MarshalYAML() (interface{}, error) {
|
||||||
|
return yaml.Node{Kind: yaml.ScalarNode, Value: "zesty!"}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewNodeBuilder_SliceRef_Inline_NotCompatible(t *testing.T) {
|
||||||
|
|
||||||
|
ty := []interface{}{testRender{}}
|
||||||
|
t1 := test1{
|
||||||
|
Thrat: ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := NewNodeBuilder(&t1, &t1)
|
||||||
|
nb.Resolve = true
|
||||||
|
node := nb.Render()
|
||||||
|
|
||||||
|
data, _ := yaml.Marshal(node)
|
||||||
|
|
||||||
|
desired := `thrat:
|
||||||
|
- testy!`
|
||||||
|
|
||||||
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewNodeBuilder_SliceRef_Inline_NotCompatible_NotPointer(t *testing.T) {
|
||||||
|
|
||||||
|
ty := []interface{}{testRenderRawNode{}}
|
||||||
|
t1 := test1{
|
||||||
|
Thrat: ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := NewNodeBuilder(&t1, &t1)
|
||||||
|
nb.Resolve = true
|
||||||
|
node := nb.Render()
|
||||||
|
|
||||||
|
data, _ := yaml.Marshal(node)
|
||||||
|
|
||||||
|
desired := `thrat:
|
||||||
|
- zesty!`
|
||||||
|
|
||||||
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewNodeBuilder_PointerRef_Inline_NotCompatible_RawNode(t *testing.T) {
|
||||||
|
|
||||||
|
ty := testRenderRawNode{}
|
||||||
|
t1 := test1{
|
||||||
|
Thurm: &ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := NewNodeBuilder(&t1, &t1)
|
||||||
|
nb.Resolve = true
|
||||||
|
node := nb.Render()
|
||||||
|
|
||||||
|
data, _ := yaml.Marshal(node)
|
||||||
|
|
||||||
|
desired := `thurm: zesty!`
|
||||||
|
|
||||||
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewNodeBuilder_PointerRef_Inline_NotCompatible(t *testing.T) {
|
||||||
|
|
||||||
|
ty := key{}
|
||||||
|
t1 := test1{
|
||||||
|
Thurm: &ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := NewNodeBuilder(&t1, &t1)
|
||||||
|
nb.Resolve = true
|
||||||
|
node := nb.Render()
|
||||||
|
|
||||||
|
data, _ := yaml.Marshal(node)
|
||||||
|
|
||||||
|
desired := `thurm: pizza-inline!`
|
||||||
|
|
||||||
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
|
}
|
||||||
|
|
||||||
func TestNewNodeBuilder_SliceNoRef(t *testing.T) {
|
func TestNewNodeBuilder_SliceNoRef(t *testing.T) {
|
||||||
|
|
||||||
c := key{ref: false, Name: "milky"}
|
c := key{ref: false, Name: "milky"}
|
||||||
@@ -872,5 +985,3 @@ func TestNewNodeBuilder_ShouldHaveNotDoneTestsLikeThisOhWell(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
assert.Equal(t, desired, strings.TrimSpace(string(data)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ func (p *Parameter) IsExploded() bool {
|
|||||||
return *p.Explode
|
return *p.Explode
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDefaultFormEncoding will return true if the paramter has no exploded value, or has exploded set to true, and no style
|
// IsDefaultFormEncoding will return true if the parameter has no exploded value, or has exploded set to true, and no style
|
||||||
// or a style set to form. This combination is the default encoding/serialization style for parameters for OpenAPI 3+
|
// or a style set to form. This combination is the default encoding/serialization style for parameters for OpenAPI 3+
|
||||||
func (p *Parameter) IsDefaultFormEncoding() bool {
|
func (p *Parameter) IsDefaultFormEncoding() bool {
|
||||||
if p.Explode == nil && (p.Style == "" || p.Style == "form") {
|
if p.Explode == nil && (p.Style == "" || p.Style == "form") {
|
||||||
@@ -98,7 +98,7 @@ func (p *Parameter) IsDefaultFormEncoding() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDefaultHeaderEncoding will return true if the paramter has no exploded value, or has exploded set to false, and no style
|
// IsDefaultHeaderEncoding will return true if the parameter has no exploded value, or has exploded set to false, and no style
|
||||||
// or a style set to simple. This combination is the default encoding/serialization style for header parameters for OpenAPI 3+
|
// or a style set to simple. This combination is the default encoding/serialization style for header parameters for OpenAPI 3+
|
||||||
func (p *Parameter) IsDefaultHeaderEncoding() bool {
|
func (p *Parameter) IsDefaultHeaderEncoding() bool {
|
||||||
if p.Explode == nil && (p.Style == "" || p.Style == "simple") {
|
if p.Explode == nil && (p.Style == "" || p.Style == "simple") {
|
||||||
@@ -110,7 +110,7 @@ func (p *Parameter) IsDefaultHeaderEncoding() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDefaultPathEncoding will return true if the paramter has no exploded value, or has exploded set to false, and no style
|
// IsDefaultPathEncoding will return true if the parameter has no exploded value, or has exploded set to false, and no style
|
||||||
// or a style set to simple. This combination is the default encoding/serialization style for path parameters for OpenAPI 3+
|
// or a style set to simple. This combination is the default encoding/serialization style for path parameters for OpenAPI 3+
|
||||||
func (p *Parameter) IsDefaultPathEncoding() bool {
|
func (p *Parameter) IsDefaultPathEncoding() bool {
|
||||||
return p.IsDefaultHeaderEncoding() // header default encoding and path default encoding are the same
|
return p.IsDefaultHeaderEncoding() // header default encoding and path default encoding are the same
|
||||||
|
|||||||
@@ -43,3 +43,88 @@ x-burgers: why not?`
|
|||||||
|
|
||||||
assert.Equal(t, desired, strings.TrimSpace(string(rend)))
|
assert.Equal(t, desired, strings.TrimSpace(string(rend)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParameter_IsExploded(t *testing.T) {
|
||||||
|
|
||||||
|
explode := true
|
||||||
|
param := Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.True(t, param.IsExploded())
|
||||||
|
|
||||||
|
explode = false
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.False(t, param.IsExploded())
|
||||||
|
|
||||||
|
param = Parameter{}
|
||||||
|
|
||||||
|
assert.False(t, param.IsExploded())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParameter_IsDefaultFormEncoding(t *testing.T) {
|
||||||
|
|
||||||
|
param := Parameter{}
|
||||||
|
assert.True(t, param.IsDefaultFormEncoding())
|
||||||
|
|
||||||
|
param = Parameter{Style: "form"}
|
||||||
|
assert.True(t, param.IsDefaultFormEncoding())
|
||||||
|
|
||||||
|
explode := false
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
}
|
||||||
|
assert.False(t, param.IsDefaultFormEncoding())
|
||||||
|
|
||||||
|
explode = true
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
}
|
||||||
|
assert.True(t, param.IsDefaultFormEncoding())
|
||||||
|
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
Style: "simple",
|
||||||
|
}
|
||||||
|
assert.False(t, param.IsDefaultFormEncoding())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParameter_IsDefaultHeaderEncoding(t *testing.T) {
|
||||||
|
|
||||||
|
param := Parameter{}
|
||||||
|
assert.True(t, param.IsDefaultHeaderEncoding())
|
||||||
|
|
||||||
|
param = Parameter{Style: "simple"}
|
||||||
|
assert.True(t, param.IsDefaultHeaderEncoding())
|
||||||
|
|
||||||
|
explode := false
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
Style: "simple",
|
||||||
|
}
|
||||||
|
assert.True(t, param.IsDefaultHeaderEncoding())
|
||||||
|
|
||||||
|
explode = true
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
Style: "simple",
|
||||||
|
}
|
||||||
|
assert.False(t, param.IsDefaultHeaderEncoding())
|
||||||
|
|
||||||
|
explode = false
|
||||||
|
param = Parameter{
|
||||||
|
Explode: &explode,
|
||||||
|
Style: "form",
|
||||||
|
}
|
||||||
|
assert.False(t, param.IsDefaultHeaderEncoding())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParameter_IsDefaultPathEncoding(t *testing.T) {
|
||||||
|
|
||||||
|
param := Parameter{}
|
||||||
|
assert.True(t, param.IsDefaultPathEncoding())
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -76,11 +76,6 @@ func (r *Responses) FindResponseByCode(code int) *Response {
|
|||||||
return r.Codes[fmt.Sprintf("%d", code)]
|
return r.Codes[fmt.Sprintf("%d", code)]
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDefaultResponse will
|
|
||||||
func (r *Responses) GetDefaultResponse(code int) *Response {
|
|
||||||
return r.Codes[fmt.Sprintf("%d", code)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// GoLow returns the low-level Response object used to create the high-level one.
|
// GoLow returns the low-level Response object used to create the high-level one.
|
||||||
func (r *Responses) GoLow() *low.Responses {
|
func (r *Responses) GoLow() *low.Responses {
|
||||||
return r.low
|
return r.low
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func TestLicense_Build(t *testing.T) {
|
|||||||
|
|
||||||
func TestInfo_Hash(t *testing.T) {
|
func TestInfo_Hash(t *testing.T) {
|
||||||
left := `title: princess b33f
|
left := `title: princess b33f
|
||||||
|
summary: a thing
|
||||||
description: a thing
|
description: a thing
|
||||||
termsOfService: https://pb33f.io
|
termsOfService: https://pb33f.io
|
||||||
x-princess: b33f
|
x-princess: b33f
|
||||||
@@ -85,6 +86,7 @@ version: 1.2.3
|
|||||||
x-b33f: princess`
|
x-b33f: princess`
|
||||||
|
|
||||||
right := `title: princess b33f
|
right := `title: princess b33f
|
||||||
|
summary: a thing
|
||||||
description: a thing
|
description: a thing
|
||||||
termsOfService: https://pb33f.io
|
termsOfService: https://pb33f.io
|
||||||
x-princess: b33f
|
x-princess: b33f
|
||||||
|
|||||||
Reference in New Issue
Block a user