mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* update vendor directory, add go.opencensus.io * update imports * oops * s/opentracing/opencensus/ & remove prometheus / zipkin stuff & remove old stats * the dep train rides again * fix gin build * deps from last guy * start in on the agent metrics * she builds * remove tags for now, cardinality error is fussing. subscribe instead of register * update to patched version of opencensus to proceed for now TODO switch to a release * meh fix imports * println debug the bad boys * lace it with the tags * update deps again * fix all inconsistent cardinality errors * add our own logger * fix init * fix oom measure * remove bugged removal code * fix s3 measures * fix prom handler nil
186 lines
4.6 KiB
Go
186 lines
4.6 KiB
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"
|
|
"math"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/go-openapi/spec"
|
|
"github.com/go-openapi/strfmt"
|
|
"github.com/go-openapi/swag"
|
|
)
|
|
|
|
func TestSchemaValidator_Validate_Pattern(t *testing.T) {
|
|
var schemaJSON = `
|
|
{
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z]+$",
|
|
"minLength": 1
|
|
},
|
|
"place": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z]+$",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"required": [
|
|
"name"
|
|
]
|
|
}`
|
|
|
|
schema := new(spec.Schema)
|
|
require.NoError(t, json.Unmarshal([]byte(schemaJSON), schema))
|
|
|
|
var input map[string]interface{}
|
|
var inputJSON = `{"name": "Ivan"}`
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(inputJSON), &input))
|
|
assert.NoError(t, AgainstSchema(schema, input, strfmt.Default))
|
|
|
|
input["place"] = json.Number("10")
|
|
|
|
assert.Error(t, AgainstSchema(schema, input, strfmt.Default))
|
|
|
|
}
|
|
|
|
func TestSchemaValidator_PatternProperties(t *testing.T) {
|
|
var schemaJSON = `
|
|
{
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z]+$",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"patternProperties": {
|
|
"address-[0-9]+": {
|
|
"type": "string",
|
|
"pattern": "^[\\s|a-z]+$"
|
|
}
|
|
},
|
|
"required": [
|
|
"name"
|
|
],
|
|
"additionalProperties": false
|
|
}`
|
|
|
|
schema := new(spec.Schema)
|
|
require.NoError(t, json.Unmarshal([]byte(schemaJSON), schema))
|
|
|
|
var input map[string]interface{}
|
|
|
|
// ok
|
|
var inputJSON = `{"name": "Ivan","address-1": "sesame street"}`
|
|
require.NoError(t, json.Unmarshal([]byte(inputJSON), &input))
|
|
assert.NoError(t, AgainstSchema(schema, input, strfmt.Default))
|
|
|
|
// fail pattern regexp
|
|
input["address-1"] = "1, Sesame Street"
|
|
assert.Error(t, AgainstSchema(schema, input, strfmt.Default))
|
|
|
|
// fail patternProperties regexp
|
|
inputJSON = `{"name": "Ivan","address-1": "sesame street","address-A": "address"}`
|
|
require.NoError(t, json.Unmarshal([]byte(inputJSON), &input))
|
|
assert.Error(t, AgainstSchema(schema, input, strfmt.Default))
|
|
|
|
}
|
|
|
|
func TestSchemaValidator_Panic(t *testing.T) {
|
|
assert.PanicsWithValue(t, `Invalid schema provided to SchemaValidator: object has no field "pointer-to-nowhere"`, schemaValidatorPanicker)
|
|
}
|
|
|
|
func schemaValidatorPanicker() {
|
|
var schemaJSON = `
|
|
{
|
|
"$ref": "#/pointer-to-nowhere"
|
|
}`
|
|
|
|
schema := new(spec.Schema)
|
|
json.Unmarshal([]byte(schemaJSON), schema)
|
|
|
|
var input map[string]interface{}
|
|
|
|
// ok
|
|
var inputJSON = `{"name": "Ivan","address-1": "sesame street"}`
|
|
json.Unmarshal([]byte(inputJSON), &input)
|
|
// panics
|
|
AgainstSchema(schema, input, strfmt.Default)
|
|
}
|
|
|
|
// Test edge cases in schemaValidator which are difficult
|
|
// to simulate with specs
|
|
func TestSchemaValidator_EdgeCases(t *testing.T) {
|
|
var s *SchemaValidator
|
|
|
|
res := s.Validate("123")
|
|
assert.NotNil(t, res)
|
|
assert.True(t, res.IsValid())
|
|
|
|
s = NewSchemaValidator(nil, nil, "", strfmt.Default)
|
|
assert.Nil(t, s)
|
|
|
|
v := "ABC"
|
|
b := s.Applies(v, reflect.String)
|
|
assert.False(t, b)
|
|
|
|
sp := spec.Schema{}
|
|
b = s.Applies(&sp, reflect.Struct)
|
|
assert.True(t, b)
|
|
|
|
spp := spec.Float64Property()
|
|
|
|
s = NewSchemaValidator(spp, nil, "", strfmt.Default)
|
|
|
|
s.SetPath("path")
|
|
assert.Equal(t, "path", s.Path)
|
|
|
|
r := s.Validate(nil)
|
|
assert.NotNil(t, r)
|
|
assert.False(t, r.IsValid())
|
|
|
|
// Validating json.Number data against number|float64
|
|
j := json.Number("123")
|
|
r = s.Validate(j)
|
|
assert.True(t, r.IsValid())
|
|
|
|
// Validating json.Number data against integer|int32
|
|
spp = spec.Int32Property()
|
|
s = NewSchemaValidator(spp, nil, "", strfmt.Default)
|
|
j = json.Number("123")
|
|
r = s.Validate(j)
|
|
assert.True(t, r.IsValid())
|
|
|
|
bignum := swag.FormatFloat64(math.MaxFloat64)
|
|
j = json.Number(bignum)
|
|
r = s.Validate(j)
|
|
assert.False(t, r.IsValid())
|
|
|
|
// Validating incorrect json.Number data
|
|
spp = spec.Float64Property()
|
|
s = NewSchemaValidator(spp, nil, "", strfmt.Default)
|
|
j = json.Number("AXF")
|
|
r = s.Validate(j)
|
|
assert.False(t, r.IsValid())
|
|
}
|