diff --git a/renderer/schema_renderer.go b/renderer/schema_renderer.go index b50f9ec..96adc52 100644 --- a/renderer/schema_renderer.go +++ b/renderer/schema_renderer.go @@ -24,6 +24,8 @@ const ( stringType = "string" numberType = "number" integerType = "integer" + bigIntType = "bigint" + decimalType = "decimal" booleanType = "boolean" objectType = "object" arrayType = "array" @@ -217,7 +219,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct } // handle numbers - if slices.Contains(schema.Type, numberType) || slices.Contains(schema.Type, integerType) { + if slices.Contains(schema.Type, numberType) || + slices.Contains(schema.Type, integerType) || + slices.Contains(schema.Type, bigIntType) || + slices.Contains(schema.Type, decimalType) { if schema.Enum != nil && len(schema.Enum) > 0 { enum := schema.Enum[rand.Int()%len(schema.Enum)] @@ -238,6 +243,27 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct maximum = int64(*schema.Maximum) } + if schema.Example != nil { + var example any + _ = schema.Example.Decode(&example) + structure[key] = example + return + } + if schema.Examples != nil { + if len(schema.Examples) > 0 { + renderedExamples := make([]any, len(schema.Examples)) + for i, exmp := range schema.Examples { + if exmp != nil { + var ex any + _ = exmp.Decode(&ex) + renderedExamples[i] = fmt.Sprint(ex) + } + } + structure[key] = renderedExamples + return + } + } + switch schema.Format { case floatType: structure[key] = rand.Float32() @@ -245,6 +271,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct structure[key] = rand.Float64() case int32Type: structure[key] = int(wr.RandomInt(minimum, maximum)) + case bigIntType: + structure[key] = wr.RandomInt(minimum, maximum) + case decimalType: + structure[key] = wr.RandomFloat64() default: structure[key] = wr.RandomInt(minimum, maximum) } diff --git a/renderer/schema_renderer_test.go b/renderer/schema_renderer_test.go index 7f34dfb..8393c0c 100644 --- a/renderer/schema_renderer_test.go +++ b/renderer/schema_renderer_test.go @@ -1082,6 +1082,35 @@ properties: assert.Equal(t, `{"args":{"arrParam":"test,test2","arrParamExploded":["1","2"]}}`, string(rendered)) } +// https://github.com/pb33f/wiretap/issues/93 +func TestRenderSchema_NonStandard_Format(t *testing.T) { + testObject := `type: object +properties: + bigint: + type: integer + format: bigint + example: 8821239038968084 + bigintStr: + type: string + format: bigint + example: "9223372036854775808" + decimal: + type: number + format: decimal + example: 3.141592653589793 + decimalStr: + type: string + format: decimal + example: "3.14159265358979344719667586"` + + compiled := getSchema([]byte(testObject)) + schema := make(map[string]any) + wr := createSchemaRenderer() + wr.DiveIntoSchema(compiled, "pb33f", schema, 0) + rendered, _ := json.Marshal(schema["pb33f"]) + assert.Equal(t, `{"bigint":8821239038968084,"bigintStr":"9223372036854775808","decimal":3.141592653589793,"decimalStr":"3.14159265358979344719667586"}`, string(rendered)) +} + func TestCreateRendererUsingDefaultDictionary(t *testing.T) { assert.NotNil(t, CreateRendererUsingDefaultDictionary()) }