From d3d8e3f7f0b2227e5e61d8e3710c5f8fcdfc1980 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 6 Nov 2021 12:58:44 -0500 Subject: [PATCH 1/7] Support enums when a example is generated, priority is the enum --- .../Utils/ExampleValueGenerator.cs | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index e94c4bdc4..ce050b187 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using WireMock.Net.OpenApiParser.Extensions; using WireMock.Net.OpenApiParser.Settings; @@ -25,41 +26,78 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { + var schemaExample = schema?.Example; + var schemaEnum = schema?.Enum.Count > 0 ? schema.Enum[new Random().Next(0, schema.Enum.Count - 1)] : null; switch (schema?.GetSchemaType()) { case SchemaType.Boolean: - return _settings.ExampleValues.Boolean; + var exampleBoolean = (OpenApiBoolean)schemaExample; + return exampleBoolean is null ? _settings.ExampleValues.Boolean : exampleBoolean.Value; case SchemaType.Integer: - return _settings.ExampleValues.Integer; + switch (schema?.GetSchemaFormat()) + { + case SchemaFormat.Int64: + var exampleLong = (OpenApiLong)schemaExample; + var enumLong = (OpenApiLong)schemaEnum; + var valueLongEnumOrExample = enumLong is null ? exampleLong?.Value : enumLong?.Value; + return valueLongEnumOrExample ?? _settings.ExampleValues.Integer; + + default: + var exampleInteger = (OpenApiInteger)schemaExample; + var enumInteger = (OpenApiInteger)schemaEnum; + var valueIntegerEnumOrExample = enumInteger is null ? exampleInteger?.Value : enumInteger?.Value; + return valueIntegerEnumOrExample ?? _settings.ExampleValues.Integer; + } case SchemaType.Number: switch (schema?.GetSchemaFormat()) { case SchemaFormat.Float: - return _settings.ExampleValues.Float; + var exampleFloat = (OpenApiFloat)schemaExample; + var enumFloat = (OpenApiFloat)schemaEnum; + var valueFloatEnumOrExample = enumFloat is null ? exampleFloat?.Value : enumFloat?.Value; + return valueFloatEnumOrExample ?? _settings.ExampleValues.Float; default: - return _settings.ExampleValues.Double; + var exampleDouble = (OpenApiDouble)schemaExample; + var enumDouble = (OpenApiDouble)schemaEnum; + var valueDoubleEnumOrExample = enumDouble is null ? exampleDouble?.Value : enumDouble?.Value; + return valueDoubleEnumOrExample ?? _settings.ExampleValues.Double; } default: switch (schema?.GetSchemaFormat()) { case SchemaFormat.Date: - return DateTimeUtils.ToRfc3339Date(_settings.ExampleValues.Date()); + var exampleDate = (OpenApiDate)schemaExample; + var enumDate = (OpenApiDate)schemaEnum; + var valueDateEnumOrExample = enumDate is null ? exampleDate?.Value : enumDate?.Value; + return DateTimeUtils.ToRfc3339Date(valueDateEnumOrExample ?? _settings.ExampleValues.Date()); case SchemaFormat.DateTime: - return DateTimeUtils.ToRfc3339DateTime(_settings.ExampleValues.DateTime()); + var exampleDateTime = (OpenApiDateTime)schemaExample; + var enumDateTime = (OpenApiDateTime)schemaEnum; + var valueDateTimeEnumOrExample = enumDateTime is null ? exampleDateTime?.Value : enumDateTime?.Value; + return DateTimeUtils.ToRfc3339DateTime(valueDateTimeEnumOrExample?.DateTime ?? _settings.ExampleValues.DateTime()); case SchemaFormat.Byte: - return _settings.ExampleValues.Bytes; + var exampleByte = (OpenApiByte)schemaExample; + var enumByte = (OpenApiByte)schemaEnum; + var valueByteEnumOrExample = enumByte is null ? exampleByte?.Value : enumByte?.Value; + return valueByteEnumOrExample ?? _settings.ExampleValues.Bytes; case SchemaFormat.Binary: - return _settings.ExampleValues.Object; + var exampleBinary = (OpenApiBinary)schemaExample; + var enumBinary = (OpenApiBinary)schemaEnum; + var valueBinaryEnumOrExample = enumBinary is null ? exampleBinary?.Value : enumBinary?.Value; + return valueBinaryEnumOrExample ?? _settings.ExampleValues.Object; default: - return _settings.ExampleValues.String; + var exampleString = (OpenApiString)schemaExample; + var enumString = (OpenApiString)schemaEnum; + var valueStringEnumOrExample = enumString is null ? exampleString?.Value : enumString?.Value; + return valueStringEnumOrExample ?? _settings.ExampleValues.String; } } } From 7c492cc4d9d3c48e255aa259632c3c034aa380a8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Nov 2021 01:18:01 -0500 Subject: [PATCH 2/7] Add null validation to Enum --- src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index ce050b187..5616164e7 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -27,7 +27,7 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { var schemaExample = schema?.Example; - var schemaEnum = schema?.Enum.Count > 0 ? schema.Enum[new Random().Next(0, schema.Enum.Count - 1)] : null; + var schemaEnum = schema?.Enum?.Count > 0 ? schema.Enum[new Random().Next(0, schema.Enum.Count - 1)] : null; switch (schema?.GetSchemaType()) { case SchemaType.Boolean: From 81ae168fff763d686f8bb437e84a8d083db8136d Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Nov 2021 01:31:33 -0500 Subject: [PATCH 3/7] Refactor MapSchemaEnum --- .../Utils/ExampleValueGenerator.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index 5616164e7..c69c06403 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using WireMock.Net.OpenApiParser.Extensions; @@ -27,7 +28,8 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { var schemaExample = schema?.Example; - var schemaEnum = schema?.Enum?.Count > 0 ? schema.Enum[new Random().Next(0, schema.Enum.Count - 1)] : null; + var schemaEnum = MapSchemaEnum(schema.Enum); + switch (schema?.GetSchemaType()) { case SchemaType.Boolean: @@ -101,5 +103,16 @@ public object GetExampleValue(OpenApiSchema schema) } } } + + private IOpenApiAny MapSchemaEnum(IList schemaEnum) + { + if (schemaEnum?.Count > 0) + { + int maxValue = schemaEnum.Count - 1; + int randomEnum = new Random().Next(0, maxValue); + return schemaEnum[randomEnum]; + } + return null; + } } } \ No newline at end of file From 819f81d5fffd54cfb43c0a38702c4770b8cf212d Mon Sep 17 00:00:00 2001 From: "Daniel L. Romero" Date: Mon, 8 Nov 2021 01:42:27 -0500 Subject: [PATCH 4/7] Redactor merhod name --- .../Utils/ExampleValueGenerator.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index c69c06403..122604eb3 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -28,7 +28,7 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { var schemaExample = schema?.Example; - var schemaEnum = MapSchemaEnum(schema.Enum); + var schemaEnum = GetEnum(schema.Enum); switch (schema?.GetSchemaType()) { @@ -104,7 +104,7 @@ public object GetExampleValue(OpenApiSchema schema) } } - private IOpenApiAny MapSchemaEnum(IList schemaEnum) + private IOpenApiAny GetEnum(IList schemaEnum) { if (schemaEnum?.Count > 0) { @@ -115,4 +115,4 @@ private IOpenApiAny MapSchemaEnum(IList schemaEnum) return null; } } -} \ No newline at end of file +} From a0f60a400ffe5a27494a5032b3068d77205fb7fa Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Nov 2021 11:13:45 -0500 Subject: [PATCH 5/7] Resolve merge conflict --- src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index 4708eb09b..c69c06403 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -1,8 +1,5 @@ using System; -<<<<<<< HEAD using System.Collections.Generic; -======= ->>>>>>> master using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using WireMock.Net.OpenApiParser.Extensions; From cdebadf2dae18e3497fd97a972272097f0d4be5d Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Nov 2021 11:17:16 -0500 Subject: [PATCH 6/7] Check schema null --- src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index c69c06403..fba255d96 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -28,7 +28,7 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { var schemaExample = schema?.Example; - var schemaEnum = MapSchemaEnum(schema.Enum); + var schemaEnum = MapSchemaEnum(schema?.Enum); switch (schema?.GetSchemaType()) { From 0c55776b66555b85e20ef0afbd30949fe8925dcb Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 9 Nov 2021 08:24:28 -0500 Subject: [PATCH 7/7] Refactor GetRandom method --- .../Utils/ExampleValueGenerator.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs index 9a501ce23..d3512ddc2 100644 --- a/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs +++ b/src/WireMock.Net.OpenApiParser/Utils/ExampleValueGenerator.cs @@ -28,7 +28,7 @@ public ExampleValueGenerator(WireMockOpenApiParserSettings settings) public object GetExampleValue(OpenApiSchema schema) { var schemaExample = schema?.Example; - var schemaEnum = GetEnum(schema?.Enum); + var schemaEnum = GetRandomEnumValue(schema?.Enum); switch (schema?.GetSchemaType()) { @@ -103,8 +103,7 @@ public object GetExampleValue(OpenApiSchema schema) } } } - - private IOpenApiAny GetEnum(IList schemaEnum) + private static IOpenApiAny GetRandomEnumValue(IList schemaEnum) { if (schemaEnum?.Count > 0) {