mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-01 07:03:29 +02:00
Provide open api schema to dynamic examples generator so you can generate accurate data (#706)
* Provide open api schema to dynamic examples generator so you can generate accurate data using settings like max-length in case of a string * Rename Schema Property and add a dynamic examples generator with properties from settings like max-length * Remove blank lines * Add virtual to all public method in WireMockOpenApiParserExampleValues and ireMockOpenApiParserDynamicExampleValues to extend and overrides examples values
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
using RandomDataGenerator.FieldOptions;
|
||||||
|
using RandomDataGenerator.Randomizers;
|
||||||
|
using WireMock.Net.OpenApiParser.Settings;
|
||||||
|
|
||||||
|
namespace WireMock.Net.OpenApiParser.ConsoleApp
|
||||||
|
{
|
||||||
|
public class DynamicDataGeneration : WireMockOpenApiParserDynamicExampleValues
|
||||||
|
{
|
||||||
|
public override string String
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
//Since you have your Schema, you can get if max-lenght is set. You can generate accurate examples with this settings
|
||||||
|
var maxLength = this.Schema.MaxLength ?? 9;
|
||||||
|
|
||||||
|
return RandomizerFactory.GetRandomizer(new FieldOptionsTextRegex
|
||||||
|
{
|
||||||
|
Pattern = $"[0-9A-Z]{{{maxLength}}}"
|
||||||
|
}).Generate() ?? "example-string";
|
||||||
|
}
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
{
|
||||||
|
"swagger": "2.0",
|
||||||
|
"info": {
|
||||||
|
"title": "customer",
|
||||||
|
"description": "It contains basic customer actions.",
|
||||||
|
"version": "v1"
|
||||||
|
},
|
||||||
|
"host": "localhost",
|
||||||
|
"basePath": "/v1/customer/",
|
||||||
|
"schemes": [
|
||||||
|
"https"
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"/": {
|
||||||
|
"get": {
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "Correlation-Id",
|
||||||
|
"required": true,
|
||||||
|
"in": "header",
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "",
|
||||||
|
"x-amf-mediaType": "application/json",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/ResponseCustmer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"definitions": {
|
||||||
|
"ResponseCustmer": {
|
||||||
|
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": true,
|
||||||
|
"required": [
|
||||||
|
"first-name",
|
||||||
|
"last-name",
|
||||||
|
"status",
|
||||||
|
"interest"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"first-name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"last-name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 2
|
||||||
|
},
|
||||||
|
"interest": {
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 45
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,41 +1,59 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using Microsoft.OpenApi.Readers;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace WireMock.Net.OpenApiParser.ConsoleApp
|
namespace WireMock.Net.OpenApiParser.ConsoleApp
|
||||||
{
|
{
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
private const string Folder = "OpenApiFiles";
|
private const string Folder = "OpenApiFiles";
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var serverOpenAPIExamples = Run.RunServer(Path.Combine(Folder, "openAPIExamples.yaml"), "https://localhost:9091/");
|
//RunOthersOpenApiParserExample();
|
||||||
var serverPetstore_V2_json = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V2.0.json"), "https://localhost:9092/");
|
|
||||||
var serverPetstore_V2_yaml = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V2.0.yaml"), "https://localhost:9093/");
|
RunMockServerWithDynamicExampleGeneration();
|
||||||
var serverPetstore_V300_yaml = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V3.0.0.yaml"), "https://localhost:9094/");
|
|
||||||
var serverPetstore_V302_json = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V3.0.2.json"), "https://localhost:9095/");
|
|
||||||
|
|
||||||
Console.WriteLine("Press any key to stop the servers");
|
|
||||||
Console.ReadKey();
|
|
||||||
|
|
||||||
serverOpenAPIExamples.Stop();
|
|
||||||
serverPetstore_V2_json.Stop();
|
|
||||||
serverPetstore_V2_yaml.Stop();
|
|
||||||
serverPetstore_V300_yaml.Stop();
|
|
||||||
serverPetstore_V302_json.Stop();
|
|
||||||
|
|
||||||
//IWireMockOpenApiParser parser = new WireMockOpenApiParser();
|
|
||||||
|
|
||||||
//var petStoreModels = parser.FromStream(File.OpenRead("petstore-openapi3.json"), out OpenApiDiagnostic diagnostic1);
|
|
||||||
//string petStoreJson = JsonConvert.SerializeObject(petStoreModels, Settings);
|
|
||||||
// File.WriteAllText("../../../wiremock-petstore-openapi3.json", petStoreJson);
|
|
||||||
|
|
||||||
//Run.RunServer(petStoreModels);
|
|
||||||
|
|
||||||
//var mappingModels2 = parser.FromStream(File.OpenRead("infura.yaml"), out OpenApiDiagnostic diagnostic2);
|
|
||||||
//Console.WriteLine(JsonConvert.SerializeObject(diagnostic2, Settings));
|
|
||||||
|
|
||||||
//string json2 = JsonConvert.SerializeObject(mappingModels2, Settings);
|
|
||||||
//Console.WriteLine(json2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void RunMockServerWithDynamicExampleGeneration() {
|
||||||
|
//Run your mocking framework specifieing youur Example Values generator class.
|
||||||
|
var serverCustomer_V2_json = Run.RunServer(Path.Combine(Folder, "Swagger_Customer_V2.0.json"), "http://localhost:8090/", true, new DynamicDataGeneration(), Types.ExampleValueType.Value, Types.ExampleValueType.Value);
|
||||||
|
Console.WriteLine("Press any key to stop the servers");
|
||||||
|
|
||||||
|
Console.ReadKey();
|
||||||
|
serverCustomer_V2_json.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RunOthersOpenApiParserExample()
|
||||||
|
{
|
||||||
|
var serverOpenAPIExamples = Run.RunServer(Path.Combine(Folder, "openAPIExamples.yaml"), "https://localhost:9091/");
|
||||||
|
var serverPetstore_V2_json = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V2.0.json"), "https://localhost:9092/");
|
||||||
|
var serverPetstore_V2_yaml = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V2.0.yaml"), "https://localhost:9093/");
|
||||||
|
var serverPetstore_V300_yaml = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V3.0.0.yaml"), "https://localhost:9094/");
|
||||||
|
var serverPetstore_V302_json = Run.RunServer(Path.Combine(Folder, "Swagger_Petstore_V3.0.2.json"), "https://localhost:9095/");
|
||||||
|
|
||||||
|
Console.WriteLine("Press any key to stop the servers");
|
||||||
|
Console.ReadKey();
|
||||||
|
|
||||||
|
serverOpenAPIExamples.Stop();
|
||||||
|
serverPetstore_V2_json.Stop();
|
||||||
|
serverPetstore_V2_yaml.Stop();
|
||||||
|
serverPetstore_V300_yaml.Stop();
|
||||||
|
serverPetstore_V302_json.Stop();
|
||||||
|
|
||||||
|
//IWireMockOpenApiParser parser = new WireMockOpenApiParser();
|
||||||
|
|
||||||
|
//var petStoreModels = parser.FromStream(File.OpenRead("petstore-openapi3.json"), out OpenApiDiagnostic diagnostic1);
|
||||||
|
//string petStoreJson = JsonConvert.SerializeObject(petStoreModels, Settings);
|
||||||
|
// File.WriteAllText("../../../wiremock-petstore-openapi3.json", petStoreJson);
|
||||||
|
|
||||||
|
//Run.RunServer(petStoreModels);
|
||||||
|
|
||||||
|
//var mappingModels2 = parser.FromStream(File.OpenRead("infura.yaml"), out OpenApiDiagnostic diagnostic2);
|
||||||
|
//Console.WriteLine(JsonConvert.SerializeObject(diagnostic2, Settings));
|
||||||
|
|
||||||
|
//string json2 = JsonConvert.SerializeObject(mappingModels2, Settings);
|
||||||
|
//Console.WriteLine(json2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,28 +13,30 @@ namespace WireMock.Net.OpenApiParser.ConsoleApp
|
|||||||
{
|
{
|
||||||
public static class Run
|
public static class Run
|
||||||
{
|
{
|
||||||
public static WireMockServer RunServer(string path, string url, bool dynamicExamples = true)
|
public static WireMockServer RunServer(string path, string url, bool dynamicExamples = true, IWireMockOpenApiParserExampleValues examplesValuesGenerator = null, ExampleValueType pathPatternToUse = ExampleValueType.Wildcard, ExampleValueType headerPatternToUse = ExampleValueType.Wildcard)
|
||||||
{
|
{
|
||||||
var server = WireMockServer.Start(new WireMockServerSettings
|
var server = WireMockServer.Start(new WireMockServerSettings
|
||||||
{
|
{
|
||||||
AllowCSharpCodeMatcher = true,
|
AllowCSharpCodeMatcher = true,
|
||||||
Urls = new[] { url },
|
Urls = new[] { url },
|
||||||
StartAdminInterface = true,
|
StartAdminInterface = true,
|
||||||
ReadStaticMappings = false,
|
ReadStaticMappings = true,
|
||||||
WatchStaticMappings = false,
|
WatchStaticMappings = false,
|
||||||
WatchStaticMappingsInSubdirectories = false,
|
WatchStaticMappingsInSubdirectories = false,
|
||||||
Logger = new WireMockConsoleLogger(),
|
Logger = new WireMockConsoleLogger(),
|
||||||
SaveUnmatchedRequests = true
|
SaveUnmatchedRequests = true
|
||||||
});
|
});
|
||||||
|
|
||||||
Console.WriteLine("WireMockServer listening at {0}", string.Join(",", server.Urls));
|
Console.WriteLine("WireMockServer listening at {0}", string.Join(",", server.Urls));
|
||||||
|
|
||||||
server.SetBasicAuthentication("a", "b");
|
//server.SetBasicAuthentication("a", "b");
|
||||||
|
|
||||||
var settings = new WireMockOpenApiParserSettings
|
var settings = new WireMockOpenApiParserSettings
|
||||||
{
|
{
|
||||||
DynamicExamples = dynamicExamples,
|
DynamicExamples = dynamicExamples,
|
||||||
PathPatternToUse = ExampleValueType.Wildcard,
|
ExampleValues = examplesValuesGenerator,
|
||||||
HeaderPatternToUse = ExampleValueType.Wildcard
|
PathPatternToUse = pathPatternToUse,
|
||||||
|
HeaderPatternToUse = headerPatternToUse,
|
||||||
};
|
};
|
||||||
|
|
||||||
server.WithMappingFromOpenApiFile(path, settings, out var diag);
|
server.WithMappingFromOpenApiFile(path, settings, out var diag);
|
||||||
|
|||||||
@@ -36,6 +36,9 @@
|
|||||||
<None Update="petstore.yml">
|
<None Update="petstore.yml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
<None Update="OpenApiFiles\Swagger_Customer_V2.0.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
|
||||||
namespace WireMock.Net.OpenApiParser.Settings
|
namespace WireMock.Net.OpenApiParser.Settings
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -48,5 +49,10 @@ namespace WireMock.Net.OpenApiParser.Settings
|
|||||||
/// An example value for a String.
|
/// An example value for a String.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string String { get; set; }
|
string String { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OpenApi Schema to generate dynamic examples more accurate
|
||||||
|
/// </summary>
|
||||||
|
OpenApiSchema Schema { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
using RandomDataGenerator.FieldOptions;
|
using RandomDataGenerator.FieldOptions;
|
||||||
using RandomDataGenerator.Randomizers;
|
using RandomDataGenerator.Randomizers;
|
||||||
|
|
||||||
@@ -10,22 +11,24 @@ namespace WireMock.Net.OpenApiParser.Settings
|
|||||||
public class WireMockOpenApiParserDynamicExampleValues : IWireMockOpenApiParserExampleValues
|
public class WireMockOpenApiParserDynamicExampleValues : IWireMockOpenApiParserExampleValues
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool Boolean { get { return RandomizerFactory.GetRandomizer(new FieldOptionsBoolean()).Generate() ?? true; } set { } }
|
public virtual bool Boolean { get { return RandomizerFactory.GetRandomizer(new FieldOptionsBoolean()).Generate() ?? true; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public int Integer { get { return RandomizerFactory.GetRandomizer(new FieldOptionsInteger()).Generate() ?? 42; } set { } }
|
public virtual int Integer { get { return RandomizerFactory.GetRandomizer(new FieldOptionsInteger()).Generate() ?? 42; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float Float { get { return RandomizerFactory.GetRandomizer(new FieldOptionsFloat()).Generate() ?? 4.2f; } set { } }
|
public virtual float Float { get { return RandomizerFactory.GetRandomizer(new FieldOptionsFloat()).Generate() ?? 4.2f; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public double Double { get { return RandomizerFactory.GetRandomizer(new FieldOptionsDouble()).Generate() ?? 4.2d; } set { } }
|
public virtual double Double { get { return RandomizerFactory.GetRandomizer(new FieldOptionsDouble()).Generate() ?? 4.2d; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Func<DateTime> Date { get { return () => RandomizerFactory.GetRandomizer(new FieldOptionsDateTime()).Generate() ?? System.DateTime.UtcNow.Date; } set { } }
|
public virtual Func<DateTime> Date { get { return () => RandomizerFactory.GetRandomizer(new FieldOptionsDateTime()).Generate() ?? System.DateTime.UtcNow.Date; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Func<DateTime> DateTime { get { return () => RandomizerFactory.GetRandomizer(new FieldOptionsDateTime()).Generate() ?? System.DateTime.UtcNow; } set { } }
|
public virtual Func<DateTime> DateTime { get { return () => RandomizerFactory.GetRandomizer(new FieldOptionsDateTime()).Generate() ?? System.DateTime.UtcNow; } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public byte[] Bytes { get { return RandomizerFactory.GetRandomizer(new FieldOptionsBytes()).Generate(); } set { } }
|
public virtual byte[] Bytes { get { return RandomizerFactory.GetRandomizer(new FieldOptionsBytes()).Generate(); } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public object Object { get; set; } = "example-object";
|
public virtual object Object { get; set; } = "example-object";
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string String { get { return RandomizerFactory.GetRandomizer(new FieldOptionsTextRegex { Pattern = @"^[0-9]{2}[A-Z]{5}[0-9]{2}" }).Generate() ?? "example-string"; } set { } }
|
public virtual string String { get { return RandomizerFactory.GetRandomizer(new FieldOptionsTextRegex { Pattern = @"^[0-9]{2}[A-Z]{5}[0-9]{2}" }).Generate() ?? "example-string"; } set { } }
|
||||||
|
/// <inheritdoc />
|
||||||
|
public virtual OpenApiSchema Schema { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
|
||||||
namespace WireMock.Net.OpenApiParser.Settings
|
namespace WireMock.Net.OpenApiParser.Settings
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -8,22 +9,24 @@ namespace WireMock.Net.OpenApiParser.Settings
|
|||||||
public class WireMockOpenApiParserExampleValues : IWireMockOpenApiParserExampleValues
|
public class WireMockOpenApiParserExampleValues : IWireMockOpenApiParserExampleValues
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool Boolean { get; set; } = true;
|
public virtual bool Boolean { get; set; } = true;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public int Integer { get; set; } = 42;
|
public virtual int Integer { get; set; } = 42;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float Float { get; set; } = 4.2f;
|
public virtual float Float { get; set; } = 4.2f;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public double Double { get; set; } = 4.2d;
|
public virtual double Double { get; set; } = 4.2d;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Func<DateTime> Date { get; set; } = () => System.DateTime.UtcNow.Date;
|
public virtual Func<DateTime> Date { get; set; } = () => System.DateTime.UtcNow.Date;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Func<DateTime> DateTime { get; set; } = () => System.DateTime.UtcNow;
|
public virtual Func<DateTime> DateTime { get; set; } = () => System.DateTime.UtcNow;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public byte[] Bytes { get; set; } = { 48, 49, 50 };
|
public virtual byte[] Bytes { get; set; } = { 48, 49, 50 };
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public object Object { get; set; } = "example-object";
|
public virtual object Object { get; set; } = "example-object";
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string String { get; set; } = "example-string";
|
public virtual string String { get; set; } = "example-string";
|
||||||
|
/// <inheritdoc />
|
||||||
|
public virtual OpenApiSchema Schema { get; set; } = new OpenApiSchema();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,8 @@ namespace WireMock.Net.OpenApiParser.Utils
|
|||||||
var schemaExample = schema?.Example;
|
var schemaExample = schema?.Example;
|
||||||
var schemaEnum = GetRandomEnumValue(schema?.Enum);
|
var schemaEnum = GetRandomEnumValue(schema?.Enum);
|
||||||
|
|
||||||
|
_settings.ExampleValues.Schema = schema;
|
||||||
|
|
||||||
switch (schema?.GetSchemaType())
|
switch (schema?.GetSchemaType())
|
||||||
{
|
{
|
||||||
case SchemaType.Boolean:
|
case SchemaType.Boolean:
|
||||||
|
|||||||
Reference in New Issue
Block a user