Files
libopenapi/datamodel/low/v3/parameter_test.go

334 lines
8.4 KiB
Go

// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
// SPDX-License-Identifier: MIT
package v3
import (
"context"
"testing"
"github.com/pb33f/libopenapi/datamodel/low"
"github.com/pb33f/libopenapi/datamodel/low/base"
"github.com/pb33f/libopenapi/index"
"github.com/pb33f/libopenapi/orderedmap"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
func TestParameter_Build(t *testing.T) {
yml := `description: michelle, meddy and maddy
required: true
deprecated: false
name: happy
in: path
allowEmptyValue: false
style: beautiful
explode: true
allowReserved: true
schema:
type: object
description: my triple M, my loves
properties:
michelle:
type: string
description: she is my heart.
meddy:
type: string
description: she is my song.
maddy:
type: string
description: he is my champion.
x-family-love: strong
example:
michelle: my love.
maddy: my champion.
meddy: my song.
content:
family/love:
schema:
type: string
description: family love.`
var idxNode yaml.Node
mErr := yaml.Unmarshal([]byte(yml), &idxNode)
assert.NoError(t, mErr)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
err := low.BuildModel(idxNode.Content[0], &n)
assert.NoError(t, err)
err = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.NoError(t, err)
assert.NotNil(t, n.GetRootNode())
assert.Nil(t, n.GetKeyNode())
assert.Equal(t, "michelle, meddy and maddy", n.Description.Value)
assert.True(t, n.AllowReserved.Value)
assert.True(t, n.Explode.Value)
assert.True(t, n.Required.Value)
assert.False(t, n.Deprecated.Value)
assert.Equal(t, "happy", n.Name.Value)
assert.Equal(t, "path", n.In.Value)
assert.NotNil(t, n.Schema.Value)
assert.Equal(t, "my triple M, my loves", n.Schema.Value.Schema().Description.Value)
assert.NotNil(t, n.Schema.Value.Schema().Properties.Value)
assert.Equal(t, "she is my heart.", n.Schema.Value.Schema().FindProperty("michelle").Value.Schema().Description.Value)
assert.Equal(t, "she is my song.", n.Schema.Value.Schema().FindProperty("meddy").Value.Schema().Description.Value)
assert.Equal(t, "he is my champion.", n.Schema.Value.Schema().FindProperty("maddy").Value.Schema().Description.Value)
var m map[string]any
err = n.Example.Value.Decode(&m)
require.NoError(t, err)
assert.Equal(t, "my love.", m["michelle"])
assert.Equal(t, "my song.", m["meddy"])
assert.Equal(t, "my champion.", m["maddy"])
con := n.FindContent("family/love").Value
assert.NotNil(t, con)
assert.Equal(t, "family love.", con.Schema.Value.Schema().Description.Value)
assert.Nil(t, n.FindContent("unknown"))
var xFamilyLove string
_ = n.FindExtension("x-family-love").Value.Decode(&xFamilyLove)
assert.Equal(t, "strong", xFamilyLove)
assert.Equal(t, 1, orderedmap.Len(n.GetExtensions()))
}
func TestParameter_Build_Success_Examples(t *testing.T) {
yml := `examples:
family:
value:
michelle: my love.
maddy: my champion.
meddy: my song.`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
err := low.BuildModel(&idxNode, &n)
assert.NoError(t, err)
err = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.NoError(t, err)
exp := n.FindExample("family").Value
assert.NotNil(t, exp)
var m map[string]any
err = exp.Value.Value.Decode(&m)
require.NoError(t, err)
assert.Equal(t, "my love.", m["michelle"])
assert.Equal(t, "my song.", m["meddy"])
assert.Equal(t, "my champion.", m["maddy"])
}
func TestParameter_Build_Fail_Examples(t *testing.T) {
yml := `examples:
family:
$ref: I AM BORKED`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
err := low.BuildModel(&idxNode, &n)
assert.NoError(t, err)
err = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.Error(t, err)
}
func TestParameter_Build_Fail_Schema(t *testing.T) {
yml := `schema:
$ref: I will fail.`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
err := low.BuildModel(&idxNode, &n)
assert.NoError(t, err)
err = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.Error(t, err)
}
func TestParameter_Build_Fail_Content(t *testing.T) {
yml := `content:
ohMyStars:
$ref: fail!`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
err := low.BuildModel(&idxNode, &n)
assert.NoError(t, err)
err = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.Error(t, err)
}
func TestParameter_Hash_n_grab(t *testing.T) {
yml := `description: michelle, meddy and maddy
required: true
deprecated: false
name: happy
in: path
allowEmptyValue: false
style: beautiful
explode: true
allowReserved: true
examples:
beautiful:
description: baby girl
handsome:
description: baby boy
schema:
type: object
description: my triple M, my loves
properties:
michelle:
type: string
description: she is my heart.
meddy:
type: string
description: she is my song.
maddy:
type: string
description: he is my champion.
x-family-love: strong
example:
michelle: my love.
maddy: my champion.
meddy: my song.
content:
family/love:
schema:
type: string
description: family love.`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
_ = low.BuildModel(idxNode.Content[0], &n)
_ = n.Build(context.Background(), nil, idxNode.Content[0], idx)
yml2 := `description: michelle, meddy and maddy
required: true
deprecated: false
name: happy
in: path
examples:
beautiful:
description: baby girl
handsome:
description: baby boy
allowEmptyValue: false
style: beautiful
explode: true
allowReserved: true
schema:
type: object
description: my triple M, my loves
properties:
michelle:
type: string
description: she is my heart.
meddy:
type: string
description: she is my song.
maddy:
type: string
description: he is my champion.
x-family-love: strong
example:
michelle: my love.
maddy: my champion.
meddy: my song.
content:
family/love:
schema:
type: string
description: family love.`
var idxNode2 yaml.Node
_ = yaml.Unmarshal([]byte(yml2), &idxNode2)
idx2 := index.NewSpecIndex(&idxNode2)
var n2 Parameter
_ = low.BuildModel(idxNode2.Content[0], &n2)
_ = n2.Build(context.Background(), nil, idxNode2.Content[0], idx2)
// hash
assert.Equal(t, n.Hash(), n2.Hash())
// n grab
assert.Equal(t, "happy", n.GetName().Value)
assert.Equal(t, "path", n.GetIn().Value)
assert.Equal(t, "michelle, meddy and maddy", n.GetDescription().Value)
assert.True(t, n.GetRequired().Value)
assert.False(t, n.GetDeprecated().Value)
assert.False(t, n.GetAllowEmptyValue().Value)
assert.Equal(t, 3, n.GetSchema().Value.(*base.SchemaProxy).Schema().Properties.Value.Len())
assert.Equal(t, "beautiful", n.GetStyle().Value)
assert.True(t, n.GetAllowReserved().Value)
assert.True(t, n.GetExplode().Value)
assert.NotNil(t, n.GetExample().Value)
assert.Equal(t, 2, orderedmap.Cast[low.KeyReference[string], low.ValueReference[*base.Example]](n.GetExamples().Value).Len())
assert.Equal(t, 1, orderedmap.Cast[low.KeyReference[string], low.ValueReference[*MediaType]](n.GetContent().Value).Len())
}
func TestParameter_Examples(t *testing.T) {
yml := `examples:
pbjBurger:
summary: A horrible, nutty, sticky mess.
value:
name: Peanut And Jelly
numPatties: 3
cakeBurger:
summary: A sickly, sweet, atrocity
value:
name: Chocolate Cake Burger
numPatties: 5`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
_ = low.BuildModel(idxNode.Content[0], &n)
_ = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.Equal(t, 2, orderedmap.Len(n.Examples.Value))
}
func TestParameter_Examples_NotFromSchema(t *testing.T) {
yml := `schema:
type: string
examples:
- example 1
- example 2
- example 3`
var idxNode yaml.Node
_ = yaml.Unmarshal([]byte(yml), &idxNode)
idx := index.NewSpecIndex(&idxNode)
var n Parameter
_ = low.BuildModel(idxNode.Content[0], &n)
_ = n.Build(context.Background(), nil, idxNode.Content[0], idx)
assert.Equal(t, 0, orderedmap.Len(n.Examples.Value))
}