PNG  IHDR pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F@8N ' p @8N@8}' p '#@8N@8N pQ9p!i~}|6-ӪG` VP.@*j>[ K^<֐Z]@8N'KQ<Q(`s" 'hgpKB`R@Dqj '  'P$a ( `D$Na L?u80e J,K˷NI'0eݷ(NI'؀ 2ipIIKp`:O'`ʤxB8Ѥx Ѥx $ $P6 :vRNb 'p,>NB 'P]-->P T+*^h& p '‰a ‰ (ĵt#u33;Nt̵'ޯ; [3W ~]0KH1q@8]O2]3*̧7# *p>us p _6]/}-4|t'|Smx= DoʾM×M_8!)6lq':l7!|4} '\ne t!=hnLn (~Dn\+‰_4k)0e@OhZ`F `.m1} 'vp{F`ON7Srx 'D˸nV`><;yMx!IS钦OM)Ե٥x 'DSD6bS8!" ODz#R >S8!7ّxEh0m$MIPHi$IvS8IN$I p$O8I,sk&I)$IN$Hi$I^Ah.p$MIN$IR8I·N "IF9Ah0m$MIN$IR8IN$I 3jIU;kO$ɳN$+ q.x* tEXtComment

Viewing File: /opt/go/pkg/mod/github.com/go-openapi/validate@v0.24.0/items_validator_test.go

// Copyright 2015 go-swagger maintainers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package validate

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"testing"

	"github.com/go-openapi/errors"
	"github.com/go-openapi/spec"
	"github.com/go-openapi/strfmt"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var (
	// PetStore20 json doc for swagger 2.0 pet store
	PetStore20 string

	// PetStoreJSONMessage json raw message for Petstore20
	PetStoreJSONMessage json.RawMessage
)

func init() {
	petstoreFixture := filepath.Join("fixtures", "petstore", "swagger.json")
	petstore, err := os.ReadFile(petstoreFixture)
	if err != nil {
		log.Fatalf("could not initialize fixture: %s: %v", petstoreFixture, err)
	}
	PetStoreJSONMessage = json.RawMessage(petstore)
	PetStore20 = string(petstore)
}

func stringItems() *spec.Items {
	return spec.NewItems().Typed(stringType, "")
}

func requiredError(param *spec.Parameter, data interface{}) *errors.Validation {
	return errors.Required(param.Name, param.In, data)
}

func maxErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.ExceedsMaximum(path, in, *items.Maximum, items.ExclusiveMaximum, data)
}

func minErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.ExceedsMinimum(path, in, *items.Minimum, items.ExclusiveMinimum, data)
}

func multipleOfErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.NotMultipleOf(path, in, *items.MultipleOf, data)
}

/*
func requiredErrorItems(path, in string) *errors.Validation {
	return errors.Required(path, in)
}
*/

func maxLengthErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.TooLong(path, in, *items.MaxLength, data)
}

func minLengthErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.TooShort(path, in, *items.MinLength, data)
}

func patternFailItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.FailedPattern(path, in, items.Pattern, data)
}

func enumFailItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.EnumFail(path, in, data, items.Enum)
}

func minItemsErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.TooFewItems(path, in, *items.MinItems, data)
}

func maxItemsErrorItems(path, in string, items *spec.Items, data interface{}) *errors.Validation {
	return errors.TooManyItems(path, in, *items.MaxItems, data)
}

func duplicatesErrorItems(path, in string) *errors.Validation {
	return errors.DuplicateItems(path, in)
}

func TestNumberItemsValidation(t *testing.T) {

	values := [][]interface{}{
		{23, 49, 56, 21, 14, 35, 28, 7, 42},
		{uint(23), uint(49), uint(56), uint(21), uint(14), uint(35), uint(28), uint(7), uint(42)},
		{float64(23), float64(49), float64(56), float64(21), float64(14), float64(35), float64(28), float64(7), float64(42)},
	}

	for i, v := range values {
		items := spec.NewItems()
		items.WithMaximum(makeFloat(v[1]), false)
		items.WithMinimum(makeFloat(v[3]), false)
		items.WithMultipleOf(makeFloat(v[7]))
		items.WithEnum(v[3], v[6], v[8], v[1])
		items.Typed("integer", "int32")
		parent := spec.QueryParam("factors").CollectionOf(items, "")
		path := fmt.Sprintf("factors.%d", i)
		validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)

		// MultipleOf
		err := validator.Validate(i, v[0])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, multipleOfErrorItems(path, validator.in, items, v[0]), err.Errors[0].Error())

		// Maximum
		err = validator.Validate(i, v[1])
		assert.True(t, err == nil || err.IsValid())
		err = validator.Validate(i, v[2])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, maxErrorItems(path, validator.in, items, v[2]), err.Errors[0].Error())

		// ExclusiveMaximum
		items.ExclusiveMaximum = true
		// requires a new items validator because this is set a creation time
		validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)
		err = validator.Validate(i, v[1])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, maxErrorItems(path, validator.in, items, v[1]), err.Errors[0].Error())

		// Minimum
		err = validator.Validate(i, v[3])
		assert.True(t, err == nil || err.IsValid())
		err = validator.Validate(i, v[4])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, minErrorItems(path, validator.in, items, v[4]), err.Errors[0].Error())

		// ExclusiveMinimum
		items.ExclusiveMinimum = true
		// requires a new items validator because this is set a creation time
		validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)
		err = validator.Validate(i, v[3])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, minErrorItems(path, validator.in, items, v[3]), err.Errors[0].Error())

		// Enum
		err = validator.Validate(i, v[5])
		assert.True(t, err.HasErrors())
		require.NotEmpty(t, err.Errors)
		require.EqualError(t, enumFailItems(path, validator.in, items, v[5]), err.Errors[0].Error())

		// Valid passes
		err = validator.Validate(i, v[6])
		assert.True(t, err == nil || err.IsValid())
	}

}

func TestStringItemsValidation(t *testing.T) {
	items := spec.NewItems().WithMinLength(3).WithMaxLength(5).WithPattern(`^[a-z]+$`).Typed(stringType, "")
	items.WithEnum("aaa", "bbb", "ccc")
	parent := spec.QueryParam("tags").CollectionOf(items, "")
	path := parent.Name + ".1"
	validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)

	// required
	data := ""
	err := validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, minLengthErrorItems(path, validator.in, items, data), err.Errors[0].Error())

	// MaxLength
	data = "abcdef"
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, maxLengthErrorItems(path, validator.in, items, data), err.Errors[0].Error())

	// MinLength
	data = "a"
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, minLengthErrorItems(path, validator.in, items, data), err.Errors[0].Error())

	// Pattern
	data = "a394"
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, patternFailItems(path, validator.in, items, data), err.Errors[0].Error())

	// Enum
	data = "abcde"
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, enumFailItems(path, validator.in, items, data), err.Errors[0].Error())

	// Valid passes
	err = validator.Validate(1, "bbb")
	assert.True(t, err == nil || err.IsValid())
}

func TestArrayItemsValidation(t *testing.T) {
	items := spec.NewItems().CollectionOf(stringItems(), "").WithMinItems(1).WithMaxItems(5).UniqueValues()
	items.WithEnum("aaa", "bbb", "ccc")
	parent := spec.QueryParam("tags").CollectionOf(items, "")
	path := parent.Name + ".1"
	validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)

	// MinItems
	data := []string{}
	err := validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, minItemsErrorItems(path, validator.in, items, len(data)), err.Errors[0].Error())
	// MaxItems
	data = []string{"a", "b", "c", "d", "e", "f"}
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, maxItemsErrorItems(path, validator.in, items, len(data)), err.Errors[0].Error())
	// UniqueItems
	err = validator.Validate(1, []string{"a", "a"})
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, duplicatesErrorItems(path, validator.in), err.Errors[0].Error())

	// Enum
	data = []string{"a", "b", "c"}
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, enumFailItems(path, validator.in, items, data), err.Errors[0].Error())

	// Items
	strItems := spec.NewItems().WithMinLength(3).WithMaxLength(5).WithPattern(`^[a-z]+$`).Typed(stringType, "")
	items = spec.NewItems().CollectionOf(strItems, "").WithMinItems(1).WithMaxItems(5).UniqueValues()
	validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default, nil)

	data = []string{"aa", "bbb", "ccc"}
	err = validator.Validate(1, data)
	assert.True(t, err.HasErrors())
	require.NotEmpty(t, err.Errors)
	require.EqualError(t, minLengthErrorItems(path+".0", parent.In, strItems, data[0]), err.Errors[0].Error())
}
Back to Directory=ceiIENDB`