From 3cfd489fc7719c8e137809348e9245c12bfff1ef Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 26 Feb 2024 19:20:36 +0100 Subject: [PATCH 01/11] WireMock.Net.GraphQL --- WireMock.Net Solution.sln | 7 +++ .../WireMock.Net.Console.NET8.csproj | 2 + .../Matchers/GraphQLMatcher.cs | 18 +++--- .../Models/WireMockCustomScalarGraphType.cs | 4 +- .../Request/RequestMessageGraphQLMatcher.cs | 37 +++++------- .../Properties/AssemblyInfo.cs | 6 ++ .../IRequestBuilderExtensions.cs} | 59 +++++++++++++++---- .../WireMock.Net.GraphQL.csproj | 42 +++++++++++++ src/WireMock.Net/Matchers/IGraphQLMatcher.cs | 16 +++++ .../Request/IRequestMessageGraphQLMatcher.cs | 17 ++++++ .../Models/GraphQLSchemaDetails.cs | 10 ++-- src/WireMock.Net/Properties/AssemblyInfo.cs | 1 + .../RequestBuilders/IBodyRequestBuilder.cs | 8 --- .../IProtoBufRequestBuilder.cs | 2 +- .../RequestBuilders/IRequestBuilder.cs | 3 + .../RequestBuilders/Request.WithBody.cs | 6 -- .../Request.WithGraphQLSchema.cs | 59 ------------------- src/WireMock.Net/RequestBuilders/Request.cs | 3 +- .../Serialization/MappingConverter.cs | 8 +-- .../Serialization/MatcherMapper.cs | 10 ++-- src/WireMock.Net/Util/TypeLoader.cs | 4 +- src/WireMock.Net/WireMock.Net.csproj | 4 +- .../dotnet-WireMock.csproj | 2 + .../WireMock.Net.Tests.csproj | 5 +- 24 files changed, 188 insertions(+), 145 deletions(-) rename src/{WireMock.Net => WireMock.Net.GraphQL}/Matchers/GraphQLMatcher.cs (94%) rename src/{WireMock.Net => WireMock.Net.GraphQL}/Matchers/Models/WireMockCustomScalarGraphType.cs (97%) rename src/{WireMock.Net => WireMock.Net.GraphQL}/Matchers/Request/RequestMessageGraphQLMatcher.cs (79%) create mode 100644 src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs rename src/{WireMock.Net/RequestBuilders/IGraphQLRequestBuilder.cs => WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs} (50%) create mode 100644 src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj create mode 100644 src/WireMock.Net/Matchers/IGraphQLMatcher.cs create mode 100644 src/WireMock.Net/Matchers/Request/IRequestMessageGraphQLMatcher.cs delete mode 100644 src/WireMock.Net/RequestBuilders/Request.WithGraphQLSchema.cs diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index 7bc052d01..91c951776 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -114,6 +114,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMockAzureQueueProxy", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.GrpcClient", "examples\WireMock.Net.Console.GrpcClient\WireMock.Net.Console.GrpcClient.csproj", "{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.GraphQL", "src\WireMock.Net.GraphQL\WireMock.Net.GraphQL.csproj", "{B6269AAC-170A-4346-8B9A-444DED3D9A45}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -268,6 +270,10 @@ Global {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.Build.0 = Release|Any CPU + {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -312,6 +318,7 @@ Global {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {7FC0B409-2682-40EE-B3B9-3930D6769D01} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {B1580A38-84E7-44BE-8FE7-3EE5031D74A1} = {985E0ADB-D4B4-473A-AA40-567E279B7946} + {B6269AAC-170A-4346-8B9A-444DED3D9A45} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458} diff --git a/examples/WireMock.Net.Console.NET8/WireMock.Net.Console.NET8.csproj b/examples/WireMock.Net.Console.NET8/WireMock.Net.Console.NET8.csproj index ff5b2a2fa..91134a8c0 100644 --- a/examples/WireMock.Net.Console.NET8/WireMock.Net.Console.NET8.csproj +++ b/examples/WireMock.Net.Console.NET8/WireMock.Net.Console.NET8.csproj @@ -23,6 +23,8 @@ + + diff --git a/src/WireMock.Net/Matchers/GraphQLMatcher.cs b/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs similarity index 94% rename from src/WireMock.Net/Matchers/GraphQLMatcher.cs rename to src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs index fb3b1567e..b399d74ae 100644 --- a/src/WireMock.Net/Matchers/GraphQLMatcher.cs +++ b/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs @@ -1,4 +1,3 @@ -#if GRAPHQL using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; @@ -21,8 +20,8 @@ namespace WireMock.Matchers; /// /// GrapQLMatcher Schema Matcher /// -/// -public class GraphQLMatcher : IStringMatcher +/// +public class GraphQLMatcher : IGraphQLMatcher { private sealed class GraphQLRequest { @@ -40,9 +39,7 @@ private sealed class GraphQLRequest /// public MatchBehaviour MatchBehaviour { get; } - /// - /// An optional dictionary defining the custom Scalar and the type. - /// + /// public IDictionary? CustomScalars { get; } /// @@ -52,7 +49,7 @@ private sealed class GraphQLRequest /// The match behaviour. (default = "AcceptOnMatch") /// The to use. (default = "Or") public GraphQLMatcher( - AnyOf schema, + AnyOf schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, MatchOperator matchOperator = MatchOperator.Or ) : this(schema, null, matchBehaviour, matchOperator) @@ -67,7 +64,7 @@ private sealed class GraphQLRequest /// The match behaviour. (default = "AcceptOnMatch") /// The to use. (default = "Or") public GraphQLMatcher( - AnyOf schema, + AnyOf schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, MatchOperator matchOperator = MatchOperator.Or @@ -92,7 +89,7 @@ private sealed class GraphQLRequest break; case AnyOfType.Third: - _schema = schema.Third; + _schema = schema.Third as ISchema ?? throw new NotSupportedException(); break; default: @@ -201,5 +198,4 @@ private ISchema BuildSchema(string typeDefinitions) return schema; } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Models/WireMockCustomScalarGraphType.cs b/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs similarity index 97% rename from src/WireMock.Net/Matchers/Models/WireMockCustomScalarGraphType.cs rename to src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs index 44d8bd7fa..6389c8072 100644 --- a/src/WireMock.Net/Matchers/Models/WireMockCustomScalarGraphType.cs +++ b/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs @@ -1,4 +1,3 @@ -#if GRAPHQL using System; using GraphQL.Types; @@ -26,5 +25,4 @@ public abstract class WireMockCustomScalarGraphType : ScalarGraphType return (T)Convert.ChangeType(value, typeof(T)); } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageGraphQLMatcher.cs b/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs similarity index 79% rename from src/WireMock.Net/Matchers/Request/RequestMessageGraphQLMatcher.cs rename to src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs index c8211963b..b554e05ee 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageGraphQLMatcher.cs +++ b/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs @@ -3,22 +3,19 @@ using System.Linq; using Stef.Validation; using WireMock.Types; +using WireMock.Util; namespace WireMock.Matchers.Request; /// /// The request body GraphQL matcher. /// -public class RequestMessageGraphQLMatcher : IRequestMatcher +public class RequestMessageGraphQLMatcher : IRequestMessageGraphQLMatcher { - /// - /// The matchers. - /// + /// public IMatcher[]? Matchers { get; } - /// - /// The - /// + /// public MatchOperator MatchOperator { get; } = MatchOperator.Or; /// @@ -32,7 +29,6 @@ public class RequestMessageGraphQLMatcher : IRequestMatcher { } -#if GRAPHQL /// /// Initializes a new instance of the class. /// @@ -40,10 +36,9 @@ public class RequestMessageGraphQLMatcher : IRequestMatcher /// The schema. /// A dictionary defining the custom scalars used in this schema. [optional] public RequestMessageGraphQLMatcher(MatchBehaviour matchBehaviour, GraphQL.Types.ISchema schema, IDictionary? customScalars = null) : - this(CreateMatcherArray(matchBehaviour, new AnyOfTypes.AnyOf(schema), customScalars)) + this(CreateMatcherArray(matchBehaviour, new AnyOfTypes.AnyOf(schema), customScalars)) { } -#endif /// /// Initializes a new instance of the class. @@ -91,19 +86,15 @@ private IReadOnlyList CalculateMatchResults(IRequestMessage request return Matchers == null ? new[] { new MatchResult() } : Matchers.Select(matcher => CalculateMatchResult(requestMessage, matcher)).ToArray(); } -#if GRAPHQL - private static IMatcher[] CreateMatcherArray( - MatchBehaviour matchBehaviour, - AnyOfTypes.AnyOf schema, - IDictionary? customScalars - ) - { - return new[] { new GraphQLMatcher(schema, customScalars, matchBehaviour) }.Cast().ToArray(); - } -#else - private static IMatcher[] CreateMatcherArray(MatchBehaviour matchBehaviour, object schema, IDictionary? customScalars) + //#if GRAPHQL + private static IMatcher[] CreateMatcherArray(MatchBehaviour matchBehaviour, AnyOfTypes.AnyOf schema, IDictionary? customScalars) { - throw new System.NotSupportedException("The GrapQLMatcher can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower."); + return new[] { TypeLoader.Load(schema, customScalars, matchBehaviour, MatchOperator.Or) }.Cast().ToArray(); } -#endif + //#else + // private static IMatcher[] CreateMatcherArray(MatchBehaviour matchBehaviour, object schema, IDictionary? customScalars) + // { + // throw new System.NotSupportedException("The GrapQLMatcher can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower."); + // } + //#endif } \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs b/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ee5b32150 --- /dev/null +++ b/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] + +// Needed for Moq in the UnitTest project +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IGraphQLRequestBuilder.cs b/src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs similarity index 50% rename from src/WireMock.Net/RequestBuilders/IGraphQLRequestBuilder.cs rename to src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs index 7dc3cac28..e7cdaa805 100644 --- a/src/WireMock.Net/RequestBuilders/IGraphQLRequestBuilder.cs +++ b/src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs @@ -1,13 +1,15 @@ +// ReSharper disable InconsistentNaming using System; using System.Collections.Generic; using WireMock.Matchers; +using WireMock.Matchers.Request; namespace WireMock.RequestBuilders; /// -/// The GraphQLRequestBuilder interface. +/// IRequestBuilderExtensions extensions for GraphQL. /// -public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder +public static class IRequestBuilderExtensions { /// /// WithGraphQLSchema: The GraphQL schema as a string. @@ -15,7 +17,10 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// The GraphQL schema. /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithGraphQLSchema(string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithGraphQLSchema(this IRequestBuilder requestBuilder, string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return WithBodyAsGraphQL(requestBuilder, schema, matchBehaviour); + } /// /// WithGraphQLSchema: The GraphQL schema as a string. @@ -24,7 +29,10 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// A dictionary defining the custom scalars used in this schema. (optional) /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithGraphQLSchema(string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithGraphQLSchema(this IRequestBuilder requestBuilder, string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return WithBodyAsGraphQL(requestBuilder, schema, customScalars, matchBehaviour); + } /// /// WithBodyAsGraphQL: The GraphQL schema as a string. @@ -32,7 +40,10 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// The GraphQL schema. /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithBodyAsGraphQL(string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithBodyAsGraphQL(this IRequestBuilder requestBuilder, string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return requestBuilder.Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema)); + } /// /// WithBodyAsGraphQL: The GraphQL schema as a string. @@ -41,16 +52,21 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// A dictionary defining the custom scalars used in this schema. (optional) /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithBodyAsGraphQL(string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithBodyAsGraphQL(this IRequestBuilder requestBuilder, string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return requestBuilder.Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema, customScalars)); + } -#if GRAPHQL /// /// WithGraphQLSchema: The GraphQL schema as a ISchema. /// /// The GraphQL schema. /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithGraphQLSchema(GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithGraphQLSchema(this IRequestBuilder requestBuilder, GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return WithBodyAsGraphQL(requestBuilder, schema, matchBehaviour); + } /// /// WithGraphQLSchema: The GraphQL schema as a ISchema. @@ -59,7 +75,10 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// A dictionary defining the custom scalars used in this schema. (optional) /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithGraphQLSchema(GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithGraphQLSchema(this IRequestBuilder requestBuilder, GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return WithBodyAsGraphQL(requestBuilder, schema, customScalars, matchBehaviour); + } /// /// WithBodyAsGraphQL: The GraphQL schema as a ISchema. @@ -67,7 +86,10 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// The GraphQL schema. /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithBodyAsGraphQL(GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + public static IRequestBuilder WithBodyAsGraphQL(this IRequestBuilder requestBuilder, GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return requestBuilder.Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema)); + } /// /// WithBodyAsGraphQL: The GraphQL schema as a ISchema. @@ -76,6 +98,19 @@ public interface IGraphQLRequestBuilder : IMultiPartRequestBuilder /// A dictionary defining the custom scalars used in this schema. (optional) /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). /// The . - IRequestBuilder WithBodyAsGraphQL(GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); -#endif + public static IRequestBuilder WithBodyAsGraphQL(this IRequestBuilder requestBuilder, GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return requestBuilder.Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema, customScalars)); + } + + /// + /// WithBodyAsGraphQLSchema: Body as GraphQL schema as a string. + /// + /// The GraphQL schema. + /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). + /// The . + public static IRequestBuilder WithBodyAsGraphQLSchema(this IRequestBuilder requestBuilder, string body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + return WithGraphQLSchema(requestBuilder, body, matchBehaviour); + } } \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj new file mode 100644 index 000000000..5979721f3 --- /dev/null +++ b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj @@ -0,0 +1,42 @@ + + + + A GraphQL which can be used to match WireMock.Net Requests. + WireMock.Net.Matchers.GraphQL + Stef Heyenrath + netstandard2.0;netstandard2.1;net5.0;net6.0;net8.0 + true + wiremock;matchers;matcher;graphql + WireMock + {B6269AAC-170A-4346-8B9A-444DED3D9A45} + true + + true + true + true + ../WireMock.Net/WireMock.Net.ruleset + true + ../WireMock.Net/WireMock.Net.snk + + true + MIT + + + + true + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/IGraphQLMatcher.cs b/src/WireMock.Net/Matchers/IGraphQLMatcher.cs new file mode 100644 index 000000000..4fc5767bb --- /dev/null +++ b/src/WireMock.Net/Matchers/IGraphQLMatcher.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace WireMock.Matchers; + +/// +/// GraphQLMatcher +/// +/// +public interface IGraphQLMatcher : IStringMatcher +{ + /// + /// An optional dictionary defining the custom Scalar and the type. + /// + public IDictionary? CustomScalars { get; } +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/IRequestMessageGraphQLMatcher.cs b/src/WireMock.Net/Matchers/Request/IRequestMessageGraphQLMatcher.cs new file mode 100644 index 000000000..37d355eb7 --- /dev/null +++ b/src/WireMock.Net/Matchers/Request/IRequestMessageGraphQLMatcher.cs @@ -0,0 +1,17 @@ +namespace WireMock.Matchers.Request; + +/// +/// The request body GraphQL matcher. +/// +public interface IRequestMessageGraphQLMatcher : IRequestMatcher +{ + /// + /// The matchers. + /// + IMatcher[]? Matchers { get; } + + /// + /// The + /// + MatchOperator MatchOperator { get; } +} \ No newline at end of file diff --git a/src/WireMock.Net/Models/GraphQLSchemaDetails.cs b/src/WireMock.Net/Models/GraphQLSchemaDetails.cs index 8188dcf93..f138102d2 100644 --- a/src/WireMock.Net/Models/GraphQLSchemaDetails.cs +++ b/src/WireMock.Net/Models/GraphQLSchemaDetails.cs @@ -20,17 +20,16 @@ public class GraphQLSchemaDetails /// public StringPattern? SchemaAsStringPattern { get; set; } -#if GRAPHQL /// - /// The GraphQL schema as a . + /// The GraphQL schema as a "GraphQL.Types.ISchema". /// - public GraphQL.Types.ISchema? SchemaAsISchema { get; set; } + public object? SchemaAsISchema { get; set; } /// /// The GraphQL Schema. /// [JsonIgnore] - public AnyOf? Schema + public AnyOf? Schema { get { @@ -46,13 +45,12 @@ public class GraphQLSchemaDetails if (SchemaAsISchema != null) { - return new AnyOf(SchemaAsISchema); + return new AnyOf(SchemaAsISchema); } return null; } } -#endif /// /// The custom Scalars to define for this schema. diff --git a/src/WireMock.Net/Properties/AssemblyInfo.cs b/src/WireMock.Net/Properties/AssemblyInfo.cs index 5aa4c57c5..a032f0efb 100644 --- a/src/WireMock.Net/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net/Properties/AssemblyInfo.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] diff --git a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs index 49751bd45..5eb301022 100644 --- a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs @@ -102,12 +102,4 @@ public interface IBodyRequestBuilder : IProtoBufRequestBuilder /// The form-urlencoded values. /// The . IRequestBuilder WithBody(Func?, bool> func); - - /// - /// WithBodyAsGraphQLSchema: Body as GraphQL schema as a string. - /// - /// The GraphQL schema. - /// The match behaviour. (Default is MatchBehaviour.AcceptOnMatch). - /// The . - IRequestBuilder WithBodyAsGraphQLSchema(string body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs index e13ec1e5d..f5db82fda 100644 --- a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs @@ -5,7 +5,7 @@ namespace WireMock.RequestBuilders; /// /// The ProtoBufRequestBuilder interface. /// -public interface IProtoBufRequestBuilder : IGraphQLRequestBuilder +public interface IProtoBufRequestBuilder : IMultiPartRequestBuilder { /// /// WithGrpcProto diff --git a/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs index 753039058..6ca5d13db 100644 --- a/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs @@ -1,3 +1,5 @@ +using WireMock.Matchers.Request; + namespace WireMock.RequestBuilders; /// @@ -5,4 +7,5 @@ namespace WireMock.RequestBuilders; /// public interface IRequestBuilder : IClientIPRequestBuilder { + internal IRequestBuilder Add(T requestMatcher) where T : IRequestMatcher; } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.WithBody.cs b/src/WireMock.Net/RequestBuilders/Request.WithBody.cs index 884e4a1d6..08ffa7b32 100644 --- a/src/WireMock.Net/RequestBuilders/Request.WithBody.cs +++ b/src/WireMock.Net/RequestBuilders/Request.WithBody.cs @@ -109,10 +109,4 @@ public IRequestBuilder WithBody(Func?, bool> func) _requestMatchers.Add(new RequestMessageBodyMatcher(Guard.NotNull(func))); return this; } - - /// - public IRequestBuilder WithBodyAsGraphQLSchema(string body, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return WithGraphQLSchema(body, matchBehaviour); - } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.WithGraphQLSchema.cs b/src/WireMock.Net/RequestBuilders/Request.WithGraphQLSchema.cs deleted file mode 100644 index 43113c5b1..000000000 --- a/src/WireMock.Net/RequestBuilders/Request.WithGraphQLSchema.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Collections.Generic; -using System; -using WireMock.Matchers; -using WireMock.Matchers.Request; - -namespace WireMock.RequestBuilders; - -public partial class Request -{ - /// - public IRequestBuilder WithGraphQLSchema(string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return WithBodyAsGraphQL(schema, matchBehaviour); - } - - /// - public IRequestBuilder WithGraphQLSchema(string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return WithBodyAsGraphQL(schema, customScalars, matchBehaviour); - } - - /// - public IRequestBuilder WithBodyAsGraphQL(string schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema)); - } - - /// - public IRequestBuilder WithBodyAsGraphQL(string schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema, customScalars)); - } - -#if GRAPHQL - /// - public IRequestBuilder WithGraphQLSchema(GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return WithBodyAsGraphQL(schema, matchBehaviour); - } - - /// - public IRequestBuilder WithGraphQLSchema(GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return WithBodyAsGraphQL(schema, customScalars, matchBehaviour); - } - - /// - public IRequestBuilder WithBodyAsGraphQL(GraphQL.Types.ISchema schema, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema)); - } - - /// - public IRequestBuilder WithBodyAsGraphQL(GraphQL.Types.ISchema schema, IDictionary? customScalars, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageGraphQLMatcher(matchBehaviour, schema, customScalars)); - } -#endif -} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index f375b6987..251c61d9c 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -69,7 +69,8 @@ private Request(IList requestMatchers) : base(requestMatchers) return _requestMatchers.OfType().FirstOrDefault(func); } - private IRequestBuilder Add(T requestMatcher) where T : IRequestMatcher + /// + public IRequestBuilder Add(T requestMatcher) where T : IRequestMatcher { foreach (var existing in _requestMatchers.OfType().ToArray()) { diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index a83eabf1c..da4aae564 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -48,7 +48,7 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings var methodMatcher = request.GetRequestMessageMatcher(); var requestMessageBodyMatcher = request.GetRequestMessageMatcher(); var requestMessageHttpVersionMatcher = request.GetRequestMessageMatcher(); - var requestMessageGraphQLMatcher = request.GetRequestMessageMatcher(); + var requestMessageGraphQLMatcher = request.GetRequestMessageMatcher(); var requestMessageMultiPartMatcher = request.GetRequestMessageMatcher(); var requestMessageProtoBufMatcher = request.GetRequestMessageMatcher(); @@ -114,15 +114,13 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings sb.AppendLine($" .WithHttpVersion({requestMessageHttpVersionMatcher.HttpVersion})"); } -#if GRAPHQL if (requestMessageGraphQLMatcher is { Matchers: { } }) { - if (requestMessageGraphQLMatcher.Matchers.OfType().FirstOrDefault() is { } graphQLMatcher && graphQLMatcher.GetPatterns().Any()) + if (requestMessageGraphQLMatcher.Matchers.OfType().FirstOrDefault() is { } graphQLMatcher && graphQLMatcher.GetPatterns().Any()) { sb.AppendLine($" .WithGraphQLSchema({GetString(graphQLMatcher)})"); } } -#endif #if MIMEKIT if (requestMessageMultiPartMatcher is { Matchers: { } }) @@ -259,7 +257,7 @@ public MappingModel ToMappingModel(IMapping mapping) var paramsMatchers = request.GetRequestMessageMatchers(); var methodMatcher = request.GetRequestMessageMatcher(); var bodyMatcher = request.GetRequestMessageMatcher(); - var graphQLMatcher = request.GetRequestMessageMatcher(); + var graphQLMatcher = request.GetRequestMessageMatcher(); var multiPartMatcher = request.GetRequestMessageMatcher(); var protoBufMatcher = request.GetRequestMessageMatcher(); var httpVersionMatcher = request.GetRequestMessageMatcher(); diff --git a/src/WireMock.Net/Serialization/MatcherMapper.cs b/src/WireMock.Net/Serialization/MatcherMapper.cs index 94c068d29..b7d04f229 100644 --- a/src/WireMock.Net/Serialization/MatcherMapper.cs +++ b/src/WireMock.Net/Serialization/MatcherMapper.cs @@ -65,10 +65,10 @@ public MatcherMapper(WireMockServerSettings settings) case nameof(ExactObjectMatcher): return CreateExactObjectMatcher(matchBehaviour, stringPatterns[0]); -#if GRAPHQL - case nameof(GraphQLMatcher): - return new GraphQLMatcher(stringPatterns[0].GetPattern(), matcherModel.CustomScalars, matchBehaviour, matchOperator); -#endif + + case "GraphQLMatcher": + var schema = new AnyOf(stringPatterns[0].GetPattern()); + return TypeLoader.Load(schema, matcherModel.CustomScalars, matchBehaviour, matchOperator); #if MIMEKIT case nameof(MimePartMatcher): @@ -164,7 +164,7 @@ public MatcherMapper(WireMockServerSettings settings) model.XmlNamespaceMap = xpathMatcher.XmlNamespaceMap; break; #if GRAPHQL - case GraphQLMatcher graphQLMatcher: + case IGraphQLMatcher graphQLMatcher: model.CustomScalars = graphQLMatcher.CustomScalars; break; #endif diff --git a/src/WireMock.Net/Util/TypeLoader.cs b/src/WireMock.Net/Util/TypeLoader.cs index fcd27e779..3786a6dcb 100644 --- a/src/WireMock.Net/Util/TypeLoader.cs +++ b/src/WireMock.Net/Util/TypeLoader.cs @@ -12,7 +12,7 @@ internal static class TypeLoader { private static readonly ConcurrentDictionary Assemblies = new(); - public static TInterface Load(params object[] args) where TInterface : class + public static TInterface Load(params object?[] args) where TInterface : class { var key = typeof(TInterface).FullName!; @@ -29,7 +29,7 @@ internal static class TypeLoader return (TInterface)Activator.CreateInstance(pluginType, args)!; } - public static TInterface LoadByFullName(string implementationTypeFullName, params object[] args) where TInterface : class + public static TInterface LoadByFullName(string implementationTypeFullName, params object?[] args) where TInterface : class { Guard.NotNullOrEmpty(implementationTypeFullName); diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index 7da97acd3..bbbf9a64c 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -150,8 +150,8 @@ - - + diff --git a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj index 97a7089c4..8576931d3 100644 --- a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj +++ b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj @@ -21,6 +21,8 @@ + + diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index d47c90573..a41bed5bd 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -44,6 +44,10 @@ + + + + - diff --git a/src/WireMock.Net/Serialization/MatcherMapper.cs b/src/WireMock.Net/Serialization/MatcherMapper.cs index b7d04f229..7698fa728 100644 --- a/src/WireMock.Net/Serialization/MatcherMapper.cs +++ b/src/WireMock.Net/Serialization/MatcherMapper.cs @@ -163,11 +163,10 @@ public MatcherMapper(WireMockServerSettings settings) case XPathMatcher xpathMatcher: model.XmlNamespaceMap = xpathMatcher.XmlNamespaceMap; break; -#if GRAPHQL + case IGraphQLMatcher graphQLMatcher: model.CustomScalars = graphQLMatcher.CustomScalars; break; -#endif } switch (matcher) diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index bbbf9a64c..f0e59c832 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -51,7 +51,7 @@ - $(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF + $(DefineConstants);MIMEKIT;PROTOBUF From 97e5c41d9a9364e6ee4e4d776a3b27d73dd4e428 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 26 Feb 2024 21:34:15 +0100 Subject: [PATCH 03/11] WireMock.Net.MimeKitLite --- WireMock.Net Solution.sln | 7 + .../IRequestMessage.cs | 2 - .../WireMock.Net.Abstractions.csproj | 2 +- .../WireMock.Net.GraphQL.csproj | 3 +- .../Matchers/MimePartMatcher.cs | 24 +-- .../Request/RequestMessageMultiPartMatcher.cs | 21 +-- .../Properties/AssemblyInfo.cs | 6 + .../IRequestBuilderExtensions.cs | 47 ++++++ .../Util/MimeKitUtils.cs | 15 +- .../WireMock.Net.MimeKitLite.csproj | 36 +++++ src/WireMock.Net/Matchers/IGraphQLMatcher.cs | 2 +- src/WireMock.Net/Matchers/IMimePartMatcher.cs | 28 ++++ .../IRequestMessageMultiPartMatcher.cs | 17 ++ src/WireMock.Net/Properties/AssemblyInfo.cs | 1 + .../IMultiPartRequestBuilder.cs | 34 ---- .../IProtoBufRequestBuilder.cs | 2 +- .../RequestBuilders/Request.WithMultiPart.cs | 28 ---- src/WireMock.Net/RequestMessage.cs | 8 +- .../Serialization/MappingConverter.cs | 8 +- .../Serialization/MatcherMapper.cs | 22 +-- src/WireMock.Net/Util/IMimeKitUtils.cs | 8 + src/WireMock.Net/Util/TypeLoader.cs | 50 +++--- src/WireMock.Net/WireMock.Net.csproj | 5 +- .../WireMock.Net.Tests/Util/JsonUtilsTests.cs | 145 ------------------ .../WireMock.Net.Tests.csproj | 5 +- 25 files changed, 220 insertions(+), 306 deletions(-) rename src/{WireMock.Net => WireMock.Net.MimeKitLite}/Matchers/MimePartMatcher.cs (88%) rename src/{WireMock.Net => WireMock.Net.MimeKitLite}/Matchers/Request/RequestMessageMultiPartMatcher.cs (85%) create mode 100644 src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs create mode 100644 src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs rename src/{WireMock.Net => WireMock.Net.MimeKitLite}/Util/MimeKitUtils.cs (82%) create mode 100644 src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj create mode 100644 src/WireMock.Net/Matchers/IMimePartMatcher.cs create mode 100644 src/WireMock.Net/Matchers/Request/IRequestMessageMultiPartMatcher.cs delete mode 100644 src/WireMock.Net/RequestBuilders/IMultiPartRequestBuilder.cs delete mode 100644 src/WireMock.Net/RequestBuilders/Request.WithMultiPart.cs create mode 100644 src/WireMock.Net/Util/IMimeKitUtils.cs diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index 91c951776..4356cc40e 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -116,6 +116,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.GrpcCl EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.GraphQL", "src\WireMock.Net.GraphQL\WireMock.Net.GraphQL.csproj", "{B6269AAC-170A-4346-8B9A-444DED3D9A45}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.MimeKitLite", "src\WireMock.Net.MimeKitLite\WireMock.Net.MimeKitLite.csproj", "{F8B4A93E-46EF-4237-88FE-15FDAB7635C2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -274,6 +276,10 @@ Global {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.Build.0 = Release|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -319,6 +325,7 @@ Global {7FC0B409-2682-40EE-B3B9-3930D6769D01} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {B1580A38-84E7-44BE-8FE7-3EE5031D74A1} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {B6269AAC-170A-4346-8B9A-444DED3D9A45} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} + {F8B4A93E-46EF-4237-88FE-15FDAB7635C2} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458} diff --git a/src/WireMock.Net.Abstractions/IRequestMessage.cs b/src/WireMock.Net.Abstractions/IRequestMessage.cs index 42d9c99fd..fe3e44303 100644 --- a/src/WireMock.Net.Abstractions/IRequestMessage.cs +++ b/src/WireMock.Net.Abstractions/IRequestMessage.cs @@ -116,13 +116,11 @@ public interface IRequestMessage /// byte[]? BodyAsBytes { get; } -#if MIMEKIT /// /// The original body as MimeMessage. /// Convenience getter for Handlebars and WireMockAssertions. /// object? BodyAsMimeMessage { get; } -#endif /// /// The detected body type. Convenience getter for Handlebars. diff --git a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj index 9cf9ca4f6..b1c504e99 100644 --- a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj +++ b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj @@ -31,7 +31,7 @@ - $(DefineConstants);MIMEKIT;PROTOBUF + $(DefineConstants);PROTOBUF diff --git a/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj index 4f6a77784..a873daef4 100644 --- a/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj +++ b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj @@ -1,7 +1,7 @@ - A GraphQL which can be used to match WireMock.Net Requests. + GraphQL support for WireMock.Net WireMock.Net.Matchers.GraphQL Stef Heyenrath netstandard2.0;netstandard2.1;net5.0;net6.0;net8.0 @@ -10,7 +10,6 @@ WireMock {B6269AAC-170A-4346-8B9A-444DED3D9A45} true - true true true diff --git a/src/WireMock.Net/Matchers/MimePartMatcher.cs b/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs similarity index 88% rename from src/WireMock.Net/Matchers/MimePartMatcher.cs rename to src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs index 145052826..fe6a84960 100644 --- a/src/WireMock.Net/Matchers/MimePartMatcher.cs +++ b/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs @@ -1,9 +1,6 @@ -#if MIMEKIT using System; using MimeKit; -using WireMock.Matchers; using WireMock.Matchers.Helpers; -using WireMock.Models; using WireMock.Util; namespace WireMock.Matchers; @@ -11,31 +8,23 @@ namespace WireMock.Matchers; /// /// MimePartMatcher /// -public class MimePartMatcher : IMatcher +public class MimePartMatcher : IMimePartMatcher { private readonly Func[] _funcs; /// public string Name => nameof(MimePartMatcher); - /// - /// ContentType Matcher (image/png; name=image.png.) - /// + /// public IStringMatcher? ContentTypeMatcher { get; } - /// - /// ContentDisposition Matcher (attachment; filename=image.png) - /// + /// public IStringMatcher? ContentDispositionMatcher { get; } - /// - /// ContentTransferEncoding Matcher (base64) - /// + /// public IStringMatcher? ContentTransferEncodingMatcher { get; } - /// - /// Content Matcher - /// + /// public IMatcher? ContentMatcher { get; } /// @@ -116,5 +105,4 @@ private MatchResult MatchOnContent(MimePart mimePart) { return contentType?.ToString().Replace("Content-Type: ", string.Empty); } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageMultiPartMatcher.cs b/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs similarity index 85% rename from src/WireMock.Net/Matchers/Request/RequestMessageMultiPartMatcher.cs rename to src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs index 4695cb71b..600ba9e23 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageMultiPartMatcher.cs +++ b/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using MimeKit; using Stef.Validation; using WireMock.Util; @@ -9,16 +10,12 @@ namespace WireMock.Matchers.Request; /// /// The request body MultiPart matcher. /// -public class RequestMessageMultiPartMatcher : IRequestMatcher +public class RequestMessageMultiPartMatcher : IRequestMessageMultiPartMatcher { - /// - /// The matchers. - /// + /// public IMatcher[]? Matchers { get; } - /// - /// The - /// + /// public MatchOperator MatchOperator { get; } = MatchOperator.Or; /// @@ -26,6 +23,8 @@ public class RequestMessageMultiPartMatcher : IRequestMatcher /// public MatchBehaviour MatchBehaviour { get; } + private readonly MimeKitUtils _mimeKitUtils = new(); + /// /// Initializes a new instance of the class. /// @@ -51,9 +50,6 @@ public RequestMessageMultiPartMatcher(MatchBehaviour matchBehaviour, MatchOperat /// public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResult requestMatchResult) { -#if !MIMEKIT - throw new System.NotSupportedException("The MultiPartMatcher can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower."); -#else var score = MatchScores.Mismatch; Exception? exception = null; @@ -62,7 +58,7 @@ public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResu return requestMatchResult.AddScore(GetType(), score, null); } - if (!MimeKitUtils.TryGetMimeMessage(requestMessage, out var message)) + if (!_mimeKitUtils.TryGetMimeMessage(requestMessage, out MimeMessage? message)) { return requestMatchResult.AddScore(GetType(), score, null); } @@ -71,7 +67,7 @@ public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResu { var mimePartMatchers = Matchers.OfType().ToArray(); - foreach (var mimePart in message.BodyParts.OfType()) + foreach (var mimePart in message.BodyParts.OfType()) { var matchesForMimePart = new List { default }; matchesForMimePart.AddRange(mimePartMatchers.Select(matcher => matcher.IsMatch(mimePart))); @@ -98,6 +94,5 @@ public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResu } return requestMatchResult.AddScore(GetType(), score, exception); -#endif } } \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs b/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ee5b32150 --- /dev/null +++ b/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] + +// Needed for Moq in the UnitTest project +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs b/src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs new file mode 100644 index 000000000..007eb05ca --- /dev/null +++ b/src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs @@ -0,0 +1,47 @@ +// ReSharper disable InconsistentNaming +using WireMock.Matchers; +using WireMock.Matchers.Request; + +namespace WireMock.RequestBuilders; + +/// +/// IRequestBuilderExtensions extensions for MultiPart Mime using MimeKitLite. +/// +public static class IRequestBuilderExtensions +{ + /// + /// WithMultiPart: IMatcher + /// + /// The . + /// The matcher. + /// The . + public static IRequestBuilder WithMultiPart(this IRequestBuilder requestBuilder, IMatcher matcher) + { + return requestBuilder.Add(new RequestMessageMultiPartMatcher(matcher)); + } + + /// + /// WithMultiPart: IMatcher[], MatchBehaviour and MatchOperator + /// + /// The . + /// The matchers. + /// The to use. + /// The to use. + /// The . + public static IRequestBuilder WithMultiPart(this IRequestBuilder requestBuilder, IMatcher[] matchers, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, MatchOperator matchOperator = MatchOperator.Or) + { + return requestBuilder.Add(new RequestMessageMultiPartMatcher(matchBehaviour, matchOperator, matchers)); + } + + /// + /// WithMultiPart: MatchBehaviour and IMatcher[] + /// + /// The . + /// The to use. + /// The matchers. + /// The . + public static IRequestBuilder WithMultiPart(this IRequestBuilder requestBuilder, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, params IMatcher[] matchers) + { + return requestBuilder.Add(new RequestMessageMultiPartMatcher(matchBehaviour, MatchOperator.Or, matchers)); + } +} \ No newline at end of file diff --git a/src/WireMock.Net/Util/MimeKitUtils.cs b/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs similarity index 82% rename from src/WireMock.Net/Util/MimeKitUtils.cs rename to src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs index 9bb5126e4..ea83c7c51 100644 --- a/src/WireMock.Net/Util/MimeKitUtils.cs +++ b/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs @@ -1,4 +1,3 @@ -#if MIMEKIT using System; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -11,9 +10,16 @@ namespace WireMock.Util; -internal static class MimeKitUtils +internal class MimeKitUtils : IMimeKitUtils { - public static bool TryGetMimeMessage(IRequestMessage requestMessage, [NotNullWhen(true)] out MimeMessage? mimeMessage) + public bool TryGetMimeMessage(IRequestMessage requestMessage, [NotNullWhen(true)] out object? mimeMessage) + { + var result = TryGetMimeMessage(requestMessage, out MimeMessage? value); + mimeMessage = value; + return result; + } + + public bool TryGetMimeMessage(IRequestMessage requestMessage, [NotNullWhen(true)] out MimeMessage? mimeMessage) { Guard.NotNull(requestMessage); @@ -59,5 +65,4 @@ private static byte[] FixBytes(byte[] bytes, WireMockList contentType) return result; } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj b/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj new file mode 100644 index 000000000..45ed9147d --- /dev/null +++ b/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj @@ -0,0 +1,36 @@ + + + + MultiPart Mime support for WireMock.Net + WireMock.Net.Matchers.GraphQL + Stef Heyenrath + netstandard2.0;netstandard2.1;net462;net47;net48;net6.0;net8.0 + true + wiremock;matchers;matcher;graphql + WireMock + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4} + true + true + true + true + ../WireMock.Net/WireMock.Net.ruleset + true + ../WireMock.Net/WireMock.Net.snk + + true + MIT + + + + true + + + + + + + + + + + \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/IGraphQLMatcher.cs b/src/WireMock.Net/Matchers/IGraphQLMatcher.cs index 4fc5767bb..b7a824143 100644 --- a/src/WireMock.Net/Matchers/IGraphQLMatcher.cs +++ b/src/WireMock.Net/Matchers/IGraphQLMatcher.cs @@ -6,7 +6,7 @@ namespace WireMock.Matchers; /// /// GraphQLMatcher /// -/// +/// public interface IGraphQLMatcher : IStringMatcher { /// diff --git a/src/WireMock.Net/Matchers/IMimePartMatcher.cs b/src/WireMock.Net/Matchers/IMimePartMatcher.cs new file mode 100644 index 000000000..d2fda6732 --- /dev/null +++ b/src/WireMock.Net/Matchers/IMimePartMatcher.cs @@ -0,0 +1,28 @@ +namespace WireMock.Matchers; + +/// +/// MimePartMatcher +/// +/// +public interface IMimePartMatcher : IMatcher +{ + /// + /// ContentType Matcher (image/png; name=image.png.) + /// + IStringMatcher? ContentTypeMatcher { get; } + + /// + /// ContentDisposition Matcher (attachment; filename=image.png) + /// + IStringMatcher? ContentDispositionMatcher { get; } + + /// + /// ContentTransferEncoding Matcher (base64) + /// + IStringMatcher? ContentTransferEncodingMatcher { get; } + + /// + /// Content Matcher + /// + IMatcher? ContentMatcher { get; } +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/IRequestMessageMultiPartMatcher.cs b/src/WireMock.Net/Matchers/Request/IRequestMessageMultiPartMatcher.cs new file mode 100644 index 000000000..269f989f8 --- /dev/null +++ b/src/WireMock.Net/Matchers/Request/IRequestMessageMultiPartMatcher.cs @@ -0,0 +1,17 @@ +namespace WireMock.Matchers.Request; + +/// +/// The request body MultiPart matcher. +/// +public interface IRequestMessageMultiPartMatcher : IRequestMatcher +{ + /// + /// The matchers. + /// + IMatcher[]? Matchers { get; } + + /// + /// The + /// + MatchOperator MatchOperator { get; } +} \ No newline at end of file diff --git a/src/WireMock.Net/Properties/AssemblyInfo.cs b/src/WireMock.Net/Properties/AssemblyInfo.cs index a032f0efb..84691ea2e 100644 --- a/src/WireMock.Net/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net/Properties/AssemblyInfo.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("WireMock.Net.MimeKitLite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] diff --git a/src/WireMock.Net/RequestBuilders/IMultiPartRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IMultiPartRequestBuilder.cs deleted file mode 100644 index 4db8bc175..000000000 --- a/src/WireMock.Net/RequestBuilders/IMultiPartRequestBuilder.cs +++ /dev/null @@ -1,34 +0,0 @@ -using WireMock.Matchers; -using WireMock.Matchers.Request; - -namespace WireMock.RequestBuilders; - -/// -/// The MultiPartRequestBuilder interface. -/// -public interface IMultiPartRequestBuilder : IHttpVersionBuilder -{ - /// - /// WithMultiPart: IMatcher - /// - /// The matcher. - /// The . - IRequestBuilder WithMultiPart(IMatcher matcher); - - /// - /// WithMultiPart: IMatcher[], MatchBehaviour and MatchOperator - /// - /// The matchers. - /// The to use. - /// The to use. - /// The . - IRequestBuilder WithMultiPart(IMatcher[] matchers, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, MatchOperator matchOperator = MatchOperator.Or); - - /// - /// WithMultiPart: MatchBehaviour and IMatcher[] - /// - /// The to use. - /// The matchers. - /// The . - IRequestBuilder WithMultiPart(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, params IMatcher[] matchers); -} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs index f5db82fda..4559ee8bb 100644 --- a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs @@ -5,7 +5,7 @@ namespace WireMock.RequestBuilders; /// /// The ProtoBufRequestBuilder interface. /// -public interface IProtoBufRequestBuilder : IMultiPartRequestBuilder +public interface IProtoBufRequestBuilder : IHttpVersionBuilder { /// /// WithGrpcProto diff --git a/src/WireMock.Net/RequestBuilders/Request.WithMultiPart.cs b/src/WireMock.Net/RequestBuilders/Request.WithMultiPart.cs deleted file mode 100644 index 64011c307..000000000 --- a/src/WireMock.Net/RequestBuilders/Request.WithMultiPart.cs +++ /dev/null @@ -1,28 +0,0 @@ -using WireMock.Matchers; -using WireMock.Matchers.Request; - -namespace WireMock.RequestBuilders; - -public partial class Request -{ - /// - public IRequestBuilder WithMultiPart(IMatcher matcher) - { - _requestMatchers.Add(new RequestMessageMultiPartMatcher(matcher)); - return this; - } - - /// - public IRequestBuilder WithMultiPart(IMatcher[] matchers, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, MatchOperator matchOperator = MatchOperator.Or) - { - _requestMatchers.Add(new RequestMessageMultiPartMatcher(matchBehaviour, matchOperator, matchers)); - return this; - } - - /// - public IRequestBuilder WithMultiPart(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch, params IMatcher[] matchers) - { - _requestMatchers.Add(new RequestMessageMultiPartMatcher(matchBehaviour, MatchOperator.Or, matchers)); - return this; - } -} \ No newline at end of file diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index 20b4518e9..50a86e37f 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -80,11 +80,9 @@ public class RequestMessage : IRequestMessage /// public byte[]? BodyAsBytes { get; } -#if MIMEKIT /// [Newtonsoft.Json.JsonIgnore] // Issue 1001 public object? BodyAsMimeMessage { get; } -#endif /// public string? DetectedBodyType { get; } @@ -180,19 +178,17 @@ public class RequestMessage : IRequestMessage ClientCertificate = clientCertificate; #endif -#if MIMEKIT try { - if (MimeKitUtils.TryGetMimeMessage(this, out var mimeMessage)) + if (TypeLoader.TryFindType(out _) && TypeLoader.Load().TryGetMimeMessage(this, out var mimeMessage)) { BodyAsMimeMessage = mimeMessage; } } catch { - // Ignore exception from MimeMessage.Load + // Ignore exception from IMimeKitUtils.TryGetMimeMessage } -#endif } /// diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index da4aae564..ce80c6ed4 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -49,7 +49,7 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings var requestMessageBodyMatcher = request.GetRequestMessageMatcher(); var requestMessageHttpVersionMatcher = request.GetRequestMessageMatcher(); var requestMessageGraphQLMatcher = request.GetRequestMessageMatcher(); - var requestMessageMultiPartMatcher = request.GetRequestMessageMatcher(); + var requestMessageMultiPartMatcher = request.GetRequestMessageMatcher(); var requestMessageProtoBufMatcher = request.GetRequestMessageMatcher(); var sb = new StringBuilder(); @@ -122,15 +122,13 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings } } -#if MIMEKIT if (requestMessageMultiPartMatcher is { Matchers: { } }) { - if (requestMessageMultiPartMatcher.Matchers.OfType().Any()) + if (requestMessageMultiPartMatcher.Matchers.OfType().Any()) { sb.AppendLine(" // .WithMultiPart() is not yet supported"); } } -#endif #if PROTOBUF if (requestMessageProtoBufMatcher is { Matcher: { } }) @@ -258,7 +256,7 @@ public MappingModel ToMappingModel(IMapping mapping) var methodMatcher = request.GetRequestMessageMatcher(); var bodyMatcher = request.GetRequestMessageMatcher(); var graphQLMatcher = request.GetRequestMessageMatcher(); - var multiPartMatcher = request.GetRequestMessageMatcher(); + var multiPartMatcher = request.GetRequestMessageMatcher(); var protoBufMatcher = request.GetRequestMessageMatcher(); var httpVersionMatcher = request.GetRequestMessageMatcher(); diff --git a/src/WireMock.Net/Serialization/MatcherMapper.cs b/src/WireMock.Net/Serialization/MatcherMapper.cs index 7698fa728..d00199905 100644 --- a/src/WireMock.Net/Serialization/MatcherMapper.cs +++ b/src/WireMock.Net/Serialization/MatcherMapper.cs @@ -70,10 +70,8 @@ public MatcherMapper(WireMockServerSettings settings) var schema = new AnyOf(stringPatterns[0].GetPattern()); return TypeLoader.Load(schema, matcherModel.CustomScalars, matchBehaviour, matchOperator); -#if MIMEKIT - case nameof(MimePartMatcher): + case "MimePartMatcher": return CreateMimePartMatcher(matchBehaviour, matcherModel); -#endif #if PROTOBUF case nameof(ProtoBufMatcher): @@ -198,14 +196,12 @@ public MatcherMapper(WireMockServerSettings settings) model.Pattern = objectMatcher.Value; break; -#if MIMEKIT - case MimePartMatcher mimePartMatcher: + case IMimePartMatcher mimePartMatcher: model.ContentDispositionMatcher = Map(mimePartMatcher.ContentDispositionMatcher); model.ContentMatcher = Map(mimePartMatcher.ContentMatcher); model.ContentTransferEncodingMatcher = Map(mimePartMatcher.ContentTransferEncodingMatcher); model.ContentTypeMatcher = Map(mimePartMatcher.ContentTypeMatcher); break; -#endif #if PROTOBUF case ProtoBufMatcher protoBufMatcher: @@ -263,17 +259,15 @@ private static ExactObjectMatcher CreateExactObjectMatcher(MatchBehaviour matchB return new ExactObjectMatcher(matchBehaviour, bytePattern); } -#if MIMEKIT - private MimePartMatcher CreateMimePartMatcher(MatchBehaviour matchBehaviour, MatcherModel matcher) + private IMimePartMatcher CreateMimePartMatcher(MatchBehaviour matchBehaviour, MatcherModel matcher) { - var contentTypeMatcher = Map(matcher?.ContentTypeMatcher) as IStringMatcher; - var contentDispositionMatcher = Map(matcher?.ContentDispositionMatcher) as IStringMatcher; - var contentTransferEncodingMatcher = Map(matcher?.ContentTransferEncodingMatcher) as IStringMatcher; - var contentMatcher = Map(matcher?.ContentMatcher); + var contentTypeMatcher = Map(matcher.ContentTypeMatcher) as IStringMatcher; + var contentDispositionMatcher = Map(matcher.ContentDispositionMatcher) as IStringMatcher; + var contentTransferEncodingMatcher = Map(matcher.ContentTransferEncodingMatcher) as IStringMatcher; + var contentMatcher = Map(matcher.ContentMatcher); - return new MimePartMatcher(matchBehaviour, contentTypeMatcher, contentDispositionMatcher, contentTransferEncodingMatcher, contentMatcher); + return TypeLoader.Load(matchBehaviour, contentTypeMatcher, contentDispositionMatcher, contentTransferEncodingMatcher, contentMatcher); } -#endif #if PROTOBUF private ProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, string protoDefinitionOrId, MatcherModel matcher) diff --git a/src/WireMock.Net/Util/IMimeKitUtils.cs b/src/WireMock.Net/Util/IMimeKitUtils.cs new file mode 100644 index 000000000..614e542a5 --- /dev/null +++ b/src/WireMock.Net/Util/IMimeKitUtils.cs @@ -0,0 +1,8 @@ +using System.Diagnostics.CodeAnalysis; + +namespace WireMock.Util; + +internal interface IMimeKitUtils +{ + bool TryGetMimeMessage(IRequestMessage requestMessage, [NotNullWhen(true)] out object? mimeMessage); +} \ No newline at end of file diff --git a/src/WireMock.Net/Util/TypeLoader.cs b/src/WireMock.Net/Util/TypeLoader.cs index 3786a6dcb..d52262480 100644 --- a/src/WireMock.Net/Util/TypeLoader.cs +++ b/src/WireMock.Net/Util/TypeLoader.cs @@ -10,43 +10,47 @@ namespace WireMock.Util; internal static class TypeLoader { - private static readonly ConcurrentDictionary Assemblies = new(); + private static readonly ConcurrentDictionary FoundTypes = new(); - public static TInterface Load(params object?[] args) where TInterface : class + public static bool TryFindType([NotNullWhen(true)] out Type? pluginType) where TInterface : class { var key = typeof(TInterface).FullName!; - var pluginType = Assemblies.GetOrAdd(key, _ => - { - if (TryFindTypeInDlls(null, out var foundType)) - { - return foundType; - } - - throw new DllNotFoundException($"No dll found which implements Interface '{key}'."); - }); + pluginType = FoundTypes.GetOrAdd(key, _ => TryFindTypeInDlls(null, out var foundType) ? foundType : null); - return (TInterface)Activator.CreateInstance(pluginType, args)!; + return pluginType != null; } - public static TInterface LoadByFullName(string implementationTypeFullName, params object?[] args) where TInterface : class + public static bool TryFindType(string implementationTypeFullName, [NotNullWhen(true)] out Type? pluginType) where TInterface : class { - Guard.NotNullOrEmpty(implementationTypeFullName); - var @interface = typeof(TInterface).FullName; var key = $"{@interface}_{implementationTypeFullName}"; - var pluginType = Assemblies.GetOrAdd(key, _ => + pluginType = FoundTypes.GetOrAdd(key, _ => TryFindTypeInDlls(implementationTypeFullName, out var foundType) ? foundType : null); + + return pluginType != null; + } + + public static TInterface Load(params object?[] args) where TInterface : class + { + if (TryFindType(out var pluginType)) { - if (TryFindTypeInDlls(implementationTypeFullName, out var foundType)) - { - return foundType; - } + return (TInterface)Activator.CreateInstance(pluginType, args)!; + } + + throw new DllNotFoundException($"No dll found which implements Interface '{typeof(TInterface).FullName}'."); + } - throw new DllNotFoundException($"No dll found which implements Interface '{@interface}' and has FullName '{implementationTypeFullName}'."); - }); + public static TInterface LoadByFullName(string implementationTypeFullName, params object?[] args) where TInterface : class + { + Guard.NotNullOrEmpty(implementationTypeFullName); + + if (TryFindType(implementationTypeFullName, out var pluginType)) + { + return (TInterface)Activator.CreateInstance(pluginType, args)!; + } - return (TInterface)Activator.CreateInstance(pluginType, args)!; + throw new DllNotFoundException($"No dll found which implements Interface '{typeof(TInterface).FullName}' and has FullName '{implementationTypeFullName}'."); } private static bool TryFindTypeInDlls(string? implementationTypeFullName, [NotNullWhen(true)] out Type? pluginType) where TInterface : class diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index f0e59c832..01b4f14af 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -51,7 +51,7 @@ - $(DefineConstants);MIMEKIT;PROTOBUF + $(DefineConstants);PROTOBUF @@ -150,9 +150,6 @@ - - diff --git a/test/WireMock.Net.Tests/Util/JsonUtilsTests.cs b/test/WireMock.Net.Tests/Util/JsonUtilsTests.cs index 600d80d07..dc240bfc8 100644 --- a/test/WireMock.Net.Tests/Util/JsonUtilsTests.cs +++ b/test/WireMock.Net.Tests/Util/JsonUtilsTests.cs @@ -1,10 +1,5 @@ using System; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Reflection; using FluentAssertions; -using Newtonsoft.Json.Linq; -using NFluent; using WireMock.Util; using Xunit; @@ -50,144 +45,4 @@ public void JsonUtils_ParseJTokenToObject_For_Invalid_Throws() // Assert action.Should().Throw(); } - - [Fact] - public void JsonUtils_GenerateDynamicLinqStatement_JToken() - { - // Assign - JToken instance = "Test"; - - // Act - string line = JsonUtils.GenerateDynamicLinqStatement(instance); - - // Assert - var queryable = new[] { instance }.AsQueryable().Select(line); - bool result = queryable.Any("it == \"Test\""); - Check.That(result).IsTrue(); - - Check.That(line).IsEqualTo("string(it)"); - } - - [Fact] - public void JsonUtils_GenerateDynamicLinqStatement_JArray_Indexer() - { - // Assign - var instance = new JObject - { - { "Items", new JArray(new JValue(4), new JValue(8)) } - }; - - // Act - string line = JsonUtils.GenerateDynamicLinqStatement(instance); - - // Assert 1 - line.Should().Be("new ((new [] { long(Items[0]), long(Items[1])}) as Items)"); - - // Assert 2 - var queryable = new[] { instance }.AsQueryable().Select(line); - bool result = queryable.Any("Items != null"); - result.Should().BeTrue(); - } - - [Fact] - public void JsonUtils_GenerateDynamicLinqStatement_JObject2() - { - // Assign - var instance = new JObject - { - {"U", new JValue(new Uri("http://localhost:80/abc?a=5"))}, - {"N", new JValue((object?) null)}, - {"G", new JValue(Guid.NewGuid())}, - {"Flt", new JValue(10.0f)}, - {"Dbl", new JValue(Math.PI)}, - {"Check", new JValue(true)}, - { - "Child", new JObject - { - {"ChildId", new JValue(4)}, - {"ChildDateTime", new JValue(new DateTime(2018, 2, 17))}, - {"TS", new JValue(TimeSpan.FromMilliseconds(999))} - } - }, - {"I", new JValue(9)}, - {"L", new JValue(long.MaxValue)}, - {"Name", new JValue("Test")} - }; - - // Act - string line = JsonUtils.GenerateDynamicLinqStatement(instance); - - // Assert 1 - line.Should().Be("new (Uri(U) as U, null as N, Guid(G) as G, double(Flt) as Flt, double(Dbl) as Dbl, bool(Check) as Check, new (long(Child.ChildId) as ChildId, DateTime(Child.ChildDateTime) as ChildDateTime, TimeSpan(Child.TS) as TS) as Child, long(I) as I, long(L) as L, string(Name) as Name)"); - - // Assert 2 - var queryable = new[] { instance }.AsQueryable().Select(line); - bool result = queryable.Any("I > 1 && L > 1"); - result.Should().BeTrue(); - } - - [Fact] - public void JsonUtils_GenerateDynamicLinqStatement_Throws() - { - // Assign - var instance = new JObject - { - { "B", new JValue(new byte[] {48, 49}) } - }; - - // Act and Assert - Check.ThatCode(() => JsonUtils.GenerateDynamicLinqStatement(instance)).Throws(); - } - - [Fact] - public void JsonUtils_CreateTypeFromJObject() - { - // Assign - var instance = new JObject - { - {"U", new JValue(new Uri("http://localhost:80/abc?a=5"))}, - {"N", new JValue((object?) null)}, - {"G", new JValue(Guid.NewGuid())}, - {"Flt", new JValue(10.0f)}, - {"Dbl", new JValue(Math.PI)}, - {"Check", new JValue(true)}, - { - "Child", new JObject - { - {"ChildId", new JValue(4)}, - {"ChildDateTime", new JValue(new DateTime(2018, 2, 17))}, - {"ChildTimeSpan", new JValue(TimeSpan.FromMilliseconds(999))} - } - }, - {"I", new JValue(9)}, - {"L", new JValue(long.MaxValue)}, - {"S", new JValue("Test")}, - {"C", new JValue('c')} - }; - - // Act - var type = JsonUtils.CreateTypeFromJObject(instance); - - // Assert - var setProperties = type - .GetProperties(BindingFlags.Public | BindingFlags.Instance) - .Where(pi => pi.GetMethod != null).Select(pi => $"{pi.GetMethod}") - .ToArray(); - - setProperties.Should().HaveCount(11); - setProperties.Should().BeEquivalentTo(new[] - { - "System.String get_U()", - "System.Object get_N()", - "System.Guid get_G()", - "Single get_Flt()", - "Single get_Dbl()", - "Boolean get_Check()", - "Child get_Child()", - "Int64 get_I()", - "Int64 get_L()", - "System.String get_S()", - "System.String get_C()" - }); - } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index a41bed5bd..976849b38 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -34,10 +34,6 @@ $(DefineConstants);TRAILINGHEADERS - - - - @@ -46,6 +42,7 @@ + + true + MIT + + + + true + + + + + + + + + + + \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/IProtoBufMatcher.cs b/src/WireMock.Net/Matchers/IProtoBufMatcher.cs index 576ee9c15..5d21f6872 100644 --- a/src/WireMock.Net/Matchers/IProtoBufMatcher.cs +++ b/src/WireMock.Net/Matchers/IProtoBufMatcher.cs @@ -1,3 +1,6 @@ +using System; +using WireMock.Models; + namespace WireMock.Matchers; /// @@ -5,4 +8,18 @@ namespace WireMock.Matchers; /// public interface IProtoBufMatcher : IDecodeBytesMatcher, IBytesMatcher { + /// + /// The Func to define the proto definition as text or id. + /// + public Func ProtoDefinition { get; } + + /// + /// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}". + /// + public string MessageType { get; } + + /// + /// The Matcher to use (optional). + /// + public IObjectMatcher? Matcher { get; } } \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/IRequestMessageProtoBufMatcher.cs b/src/WireMock.Net/Matchers/Request/IRequestMessageProtoBufMatcher.cs new file mode 100644 index 000000000..ca4bc2915 --- /dev/null +++ b/src/WireMock.Net/Matchers/Request/IRequestMessageProtoBufMatcher.cs @@ -0,0 +1,12 @@ +namespace WireMock.Matchers.Request; + +/// +/// The request body ProtoBuf matcher. +/// +public interface IRequestMessageProtoBufMatcher : IRequestMatcher +{ + /// + /// The ProtoBufMatcher. + /// + IProtoBufMatcher? Matcher { get; } +} \ No newline at end of file diff --git a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs index c1ceb39f4..8e179c643 100644 --- a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs +++ b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs @@ -142,11 +142,9 @@ private bool IsFault(IResponseMessage responseMessage) var jsonBody = JsonConvert.SerializeObject(responseMessage.BodyData.BodyAsJson, new JsonSerializerSettings { Formatting = formatting, NullValueHandling = NullValueHandling.Ignore }); return (responseMessage.BodyData.Encoding ?? _utf8NoBom).GetBytes(jsonBody); -#if PROTOBUF case BodyType.ProtoBuf: var protoDefinition = responseMessage.BodyData.ProtoDefinition?.Invoke().Text; - return await ProtoBufUtils.GetProtoBufMessageWithHeaderAsync(protoDefinition, responseMessage.BodyData.ProtoBufMessageType, responseMessage.BodyData.BodyAsJson).ConfigureAwait(false); -#endif + return await TypeLoader.Load().GetProtoBufMessageWithHeaderAsync(protoDefinition, responseMessage.BodyData.ProtoBufMessageType, responseMessage.BodyData.BodyAsJson).ConfigureAwait(false); case BodyType.Bytes: return responseMessage.BodyData.BodyAsBytes; diff --git a/src/WireMock.Net/Properties/AssemblyInfo.cs b/src/WireMock.Net/Properties/AssemblyInfo.cs index 84691ea2e..aa14015b8 100644 --- a/src/WireMock.Net/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net/Properties/AssemblyInfo.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.MimeKitLite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] diff --git a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs index 5eb301022..e666e8e2a 100644 --- a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs @@ -9,7 +9,7 @@ namespace WireMock.RequestBuilders; /// /// The BodyRequestBuilder interface. /// -public interface IBodyRequestBuilder : IProtoBufRequestBuilder +public interface IBodyRequestBuilder : IHttpVersionBuilder { /// /// WithBody: IMatcher diff --git a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs deleted file mode 100644 index 4559ee8bb..000000000 --- a/src/WireMock.Net/RequestBuilders/IProtoBufRequestBuilder.cs +++ /dev/null @@ -1,45 +0,0 @@ -using WireMock.Matchers; - -namespace WireMock.RequestBuilders; - -/// -/// The ProtoBufRequestBuilder interface. -/// -public interface IProtoBufRequestBuilder : IHttpVersionBuilder -{ - /// - /// WithGrpcProto - /// - /// The proto definition as text. - /// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}". - /// The match behaviour. (default = "AcceptOnMatch") - /// The . - IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); - - /// - /// WithGrpcProto - /// - /// The proto definition as text. - /// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}". - /// The matcher to use to match the ProtoBuf as (json) object. - /// The match behaviour. (default = "AcceptOnMatch") - /// The . - IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); - - /// - /// WithGrpcProto - /// - /// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}". - /// The match behaviour. (default = "AcceptOnMatch") - /// The . - IRequestBuilder WithBodyAsProtoBuf(string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); - - /// - /// WithGrpcProto - /// - /// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}". - /// The matcher to use to match the ProtoBuf as (json) object. - /// The match behaviour. (default = "AcceptOnMatch") - /// The . - IRequestBuilder WithBodyAsProtoBuf(string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); -} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs index 6ca5d13db..8e0e923f5 100644 --- a/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IRequestBuilder.cs @@ -7,5 +7,10 @@ namespace WireMock.RequestBuilders; /// public interface IRequestBuilder : IClientIPRequestBuilder { + /// + /// The link back to the Mapping. + /// + internal IMapping Mapping { get; set; } + internal IRequestBuilder Add(T requestMatcher) where T : IRequestMatcher; } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.WithBodyAsProtoBuf.cs b/src/WireMock.Net/RequestBuilders/Request.WithBodyAsProtoBuf.cs deleted file mode 100644 index 2c3eb187b..000000000 --- a/src/WireMock.Net/RequestBuilders/Request.WithBodyAsProtoBuf.cs +++ /dev/null @@ -1,31 +0,0 @@ -using WireMock.Matchers; -using WireMock.Matchers.Request; - -namespace WireMock.RequestBuilders; - -public partial class Request -{ - /// - public IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new (null, protoDefinition), messageType)); - } - - /// - public IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new(null, protoDefinition), messageType, matcher)); - } - - /// - public IRequestBuilder WithBodyAsProtoBuf(string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => Mapping.ProtoDefinition!.Value, messageType)); - } - - /// - public IRequestBuilder WithBodyAsProtoBuf(string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => Mapping.ProtoDefinition!.Value, messageType, matcher)); - } -} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index 251c61d9c..c27b6c13c 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -16,9 +16,7 @@ public partial class Request : RequestMessageCompositeMatcher, IRequestBuilder { private readonly IList _requestMatchers; - /// - /// The link back to the Mapping. - /// + /// public IMapping Mapping { get; set; } = null!; /// diff --git a/src/WireMock.Net/ResponseBuilders/Response.WithBody.cs b/src/WireMock.Net/ResponseBuilders/Response.WithBody.cs index 1fd6c451e..daf7add8c 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.WithBody.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.WithBody.cs @@ -221,18 +221,15 @@ public IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter Guard.NotNullOrWhiteSpace(messageType); Guard.NotNull(value); -#if !PROTOBUF - throw new System.NotSupportedException("The WithBodyAsProtoBuf method can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower."); -#else ResponseMessage.BodyDestination = null; ResponseMessage.BodyData = new BodyData { DetectedBodyType = BodyType.ProtoBuf, BodyAsJson = value, - ProtoDefinition = () => new (null, protoDefinition), + ProtoDefinition = () => new(null, protoDefinition), ProtoBufMessageType = messageType }; -#endif + return this; } @@ -247,9 +244,6 @@ public IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter Guard.NotNullOrWhiteSpace(messageType); Guard.NotNull(value); -#if !PROTOBUF - throw new System.NotSupportedException("The WithBodyAsProtoBuf method can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower."); -#else ResponseMessage.BodyDestination = null; ResponseMessage.BodyData = new BodyData { @@ -258,7 +252,7 @@ public IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter ProtoDefinition = () => Mapping.ProtoDefinition ?? throw new WireMockException("ProtoDefinition cannot be resolved. You probably forgot to call .WithProtoDefinition(...) on the mapping."), ProtoBufMessageType = messageType }; -#endif + return this; } } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 7932dcfde..1d13b886f 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -287,7 +287,7 @@ string RemoveFirstOccurrence(string source, string find) // Check if the body matcher is a RequestMessageProtoBufMatcher and try to to decode the byte-array to a BodyAsJson. if (mapping.RequestMatcher is Request requestMatcher && requestMessage is RequestMessage request) { - var protoBufMatcher = requestMatcher.GetRequestMessageMatcher()?.Matcher; + var protoBufMatcher = requestMatcher.GetRequestMessageMatcher()?.Matcher; if (protoBufMatcher != null) { var decoded = await protoBufMatcher.DecodeAsync(request.BodyData?.BodyAsBytes).ConfigureAwait(false); diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index ce80c6ed4..e0d4953b3 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -50,7 +50,7 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings var requestMessageHttpVersionMatcher = request.GetRequestMessageMatcher(); var requestMessageGraphQLMatcher = request.GetRequestMessageMatcher(); var requestMessageMultiPartMatcher = request.GetRequestMessageMatcher(); - var requestMessageProtoBufMatcher = request.GetRequestMessageMatcher(); + var requestMessageProtoBufMatcher = request.GetRequestMessageMatcher(); var sb = new StringBuilder(); @@ -130,12 +130,10 @@ public string ToCSharpCode(IMapping mapping, MappingConverterSettings? settings } } -#if PROTOBUF if (requestMessageProtoBufMatcher is { Matcher: { } }) { sb.AppendLine(" // .WithBodyAsProtoBuf() is not yet supported"); } -#endif if (requestMessageBodyMatcher is { Matchers: { } }) { @@ -254,11 +252,11 @@ public MappingModel ToMappingModel(IMapping mapping) var cookieMatchers = request.GetRequestMessageMatchers(); var paramsMatchers = request.GetRequestMessageMatchers(); var methodMatcher = request.GetRequestMessageMatcher(); + var httpVersionMatcher = request.GetRequestMessageMatcher(); var bodyMatcher = request.GetRequestMessageMatcher(); var graphQLMatcher = request.GetRequestMessageMatcher(); var multiPartMatcher = request.GetRequestMessageMatcher(); - var protoBufMatcher = request.GetRequestMessageMatcher(); - var httpVersionMatcher = request.GetRequestMessageMatcher(); + var protoBufMatcher = request.GetRequestMessageMatcher(); var mappingModel = new MappingModel { @@ -381,13 +379,11 @@ public MappingModel ToMappingModel(IMapping mapping) { void AfterMap(MatcherModel matcherModel) { -#if PROTOBUF // In case the ProtoDefinition is defined at the Mapping level, clear the Pattern at the Matcher level - if (bodyMatchers?.OfType().Any() == true && mappingModel.ProtoDefinition != null) + if (bodyMatchers?.OfType().Any() == true && mappingModel.ProtoDefinition != null) { matcherModel.Pattern = null; } -#endif } mappingModel.Request.Body = new BodyModel(); diff --git a/src/WireMock.Net/Serialization/MatcherMapper.cs b/src/WireMock.Net/Serialization/MatcherMapper.cs index d00199905..3efc88195 100644 --- a/src/WireMock.Net/Serialization/MatcherMapper.cs +++ b/src/WireMock.Net/Serialization/MatcherMapper.cs @@ -73,10 +73,9 @@ public MatcherMapper(WireMockServerSettings settings) case "MimePartMatcher": return CreateMimePartMatcher(matchBehaviour, matcherModel); -#if PROTOBUF - case nameof(ProtoBufMatcher): + case "ProtoBufMatcher": return CreateProtoBufMatcher(matchBehaviour, stringPatterns[0].GetPattern(), matcherModel); -#endif + case nameof(RegexMatcher): return new RegexMatcher(matchBehaviour, stringPatterns, ignoreCase, useRegexExtended, matchOperator); @@ -203,13 +202,11 @@ public MatcherMapper(WireMockServerSettings settings) model.ContentTypeMatcher = Map(mimePartMatcher.ContentTypeMatcher); break; -#if PROTOBUF - case ProtoBufMatcher protoBufMatcher: + case IProtoBufMatcher protoBufMatcher: model.Pattern = protoBufMatcher.ProtoDefinition().Value; model.ProtoBufMessageType = protoBufMatcher.MessageType; model.ContentMatcher = Map(protoBufMatcher.Matcher); break; -#endif } afterMap?.Invoke(model); @@ -269,8 +266,7 @@ private IMimePartMatcher CreateMimePartMatcher(MatchBehaviour matchBehaviour, Ma return TypeLoader.Load(matchBehaviour, contentTypeMatcher, contentDispositionMatcher, contentTransferEncodingMatcher, contentMatcher); } -#if PROTOBUF - private ProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, string protoDefinitionOrId, MatcherModel matcher) + private IProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, string protoDefinitionOrId, MatcherModel matcher) { var objectMatcher = Map(matcher.ContentMatcher) as IObjectMatcher; @@ -284,12 +280,11 @@ private ProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, st protoDefinition = new(null, protoDefinitionOrId); } - return new ProtoBufMatcher( + return TypeLoader.Load( () => protoDefinition, - matcher!.ProtoBufMessageType!, + matcher.ProtoBufMessageType!, matchBehaviour ?? MatchBehaviour.AcceptOnMatch, objectMatcher ); } -#endif } \ No newline at end of file diff --git a/src/WireMock.Net/Util/IProtoBufUtils.cs b/src/WireMock.Net/Util/IProtoBufUtils.cs new file mode 100644 index 000000000..48ffdb605 --- /dev/null +++ b/src/WireMock.Net/Util/IProtoBufUtils.cs @@ -0,0 +1,17 @@ +using System.Threading; +using System.Threading.Tasks; +using JsonConverter.Abstractions; + +namespace WireMock.Util; + +internal interface IProtoBufUtils +{ + Task GetProtoBufMessageWithHeaderAsync( + string? protoDefinition, + string? messageType, + object? value, + IJsonConverter? jsonConverter = null, + JsonConverterOptions? options = null, + CancellationToken cancellationToken = default + ); +} \ No newline at end of file diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index 01b4f14af..e80e1cfe9 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -50,10 +50,6 @@ $(DefineConstants);OPENAPIPARSER - - $(DefineConstants);PROTOBUF - - $(DefineConstants);TRAILINGHEADERS @@ -149,9 +145,9 @@ - + diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index 976849b38..18340ab3e 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -43,6 +43,7 @@ + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + \ No newline at end of file diff --git a/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj b/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj index 97440b252..99ca02939 100644 --- a/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj +++ b/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj @@ -1,52 +1,52 @@ - - A CSharpCodeMatcher which can be used to match WireMock.Net Requests using C# code. - WireMock.Net.Matchers.CSharpCode - Stef Heyenrath - net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 - true - wiremock;matchers;matcher;csharp;csharpcode - WireMock - {B6269AAC-170A-4346-8B9A-444DED3D9A44} - true - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - true - true - true - ../WireMock.Net/WireMock.Net.ruleset - true - ../WireMock.Net/WireMock.Net.snk - - true - MIT - - - - true - - - - - - - - - - - - - - - - - - - - - - - - + + A CSharpCodeMatcher which can be used to match WireMock.Net Requests using C# code. + WireMock.Net.Matchers.CSharpCode + Stef Heyenrath + net451;net452;net46;net461;net462;net47;net48;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + true + wiremock;matchers;matcher;csharp;csharpcode + WireMock + {B6269AAC-170A-4346-8B9A-444DED3D9A44} + true + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + true + true + ../WireMock.Net/WireMock.Net.ruleset + true + ../WireMock.Net/WireMock.Net.snk + + true + MIT + + + + true + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj index 82e6a675d..10163956b 100644 --- a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj +++ b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj @@ -1,46 +1,62 @@ - - Lightweight StandAlone Http Mocking Server for .Net. - WireMock.Net.StandAlone - Stef Heyenrath - net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 - true - WireMock.Net.StandAlone - WireMock.Net.StandAlone - tdd;mock;http;wiremock;test;server;unittest - WireMock.Net.StandAlone - {B6269AAC-170A-43D5-8B9A-579DED3D9A95} - true - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - true - true - true - WireMock.Net.StandAlone.ruleset - true - ../WireMock.Net/WireMock.Net.snk - - true - - - - - true - - - - NETSTANDARD;USE_ASPNETCORE - - - - USE_ASPNETCORE;NET46 - - - - - - - - - - + + Lightweight StandAlone Http Mocking Server for .NET which includes GraphQL-support, ProtoBuf-support, MimePartMatcher and CSharpCodeMatcher. + WireMock.Net.StandAlone + Stef Heyenrath + net451;net452;net46;net461;net462;net47;net48;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + true + WireMock.Net.StandAlone + WireMock.Net.StandAlone + tdd;mock;http;wiremock;test;server;unittest + WireMock.Net.StandAlone + {B6269AAC-170A-43D5-8B9A-579DED3D9A95} + true + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + true + true + WireMock.Net.StandAlone.ruleset + true + ../WireMock.Net/WireMock.Net.snk + + true + + + + + true + + + + NETSTANDARD;USE_ASPNETCORE + + + + USE_ASPNETCORE;NET46 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj index 1ebbcb929..4fa56a8e8 100644 --- a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj +++ b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj @@ -1,31 +1,31 @@ - - Exe - net8.0 - true - dotnet-wiremock - A dotnet commandline tool for WireMock.Net (A Lightweight Http Mocking Server for .NET) - tdd;mock;http;wiremock;test;server;unittest;dotnet;tool;dotnet-tool - MIT - Stef Heyenrath - + + Exe + net8.0 + true + dotnet-wiremock + A dotnet commandline tool for WireMock.Net (A Lightweight Http Mocking Server for .NET) which includes GraphQL-support, ProtoBuf-support, MimePartMatcher and CSharpCodeMatcher. + tdd;mock;http;wiremock;test;server;unittest;dotnet;tool;dotnet-tool + MIT + Stef Heyenrath + - - true - + + true + - - - - + + + + - - - - - - - + + + + + + + \ No newline at end of file From e86517cfe99d53a1a1c20b39284882792409bf36 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 2 Mar 2024 16:53:14 +0100 Subject: [PATCH 08/11] !!! --- WireMock.Net Solution.sln | 31 +-- .../Matchers/GraphQLMatcher.cs | 4 +- .../Models/WireMockCustomScalarGraphType.cs | 4 +- .../Request/RequestMessageGraphQLMatcher.cs | 4 +- .../Properties/AssemblyInfo.cs | 6 +- ...cs => IGraphQLRequestBuilderExtensions.cs} | 6 +- .../WireMock.Net.GraphQL.csproj | 4 +- .../Matchers/CSharpCodeMatcher.cs | 4 +- .../Properties/AssemblyInfo.cs | 6 +- .../WireMock.Net.Matchers.CSharpCode.csproj | 4 +- .../Matchers/MimePartMatcher.cs | 4 +- .../Request/RequestMessageMultiPartMatcher.cs | 4 +- .../Properties/AssemblyInfo.cs | 6 +- ... => IMultiPartRequestBuilderExtensions.cs} | 6 +- .../Util/MimeKitUtils.cs | 4 +- .../WireMock.Net.MimeKitLite.csproj | 2 +- .../Properties/AssemblyInfo.cs | 7 + .../WireMock.Net.Minimal.csproj | 204 ++++++++++++++++++ .../Matchers/ProtoBufMatcher.cs | 4 +- .../Request/RequestMessageProtoBufMatcher.cs | 4 +- .../Properties/AssemblyInfo.cs | 6 +- ...s => IProtoBufRequestBuilderExtensions.cs} | 8 +- .../Util/ProtoBufUtils.cs | 4 +- .../WireMock.Net.ProtoBuf.csproj | 2 +- .../WireMock.Net.StandAlone.csproj | 20 +- .../WireMock.Net.StandAlone.ruleset | 4 - src/WireMock.Net/Owin/AspNetCoreSelfHost.cs | 2 - src/WireMock.Net/Properties/AssemblyInfo.cs | 8 +- src/WireMock.Net/WireMock.Net.csproj | 64 +++++- .../dotnet-WireMock.csproj | 4 - .../WireMockAdminApiTests.GetMappingsAsync.cs | 2 +- .../WireMock.Net.Tests.csproj | 36 ++-- 32 files changed, 375 insertions(+), 103 deletions(-) rename src/WireMock.Net.GraphQL/RequestBuilders/{IRequestBuilderExtensions.cs => IGraphQLRequestBuilderExtensions.cs} (98%) rename src/WireMock.Net.MimeKitLite/RequestBuilders/{IRequestBuilderExtensions.cs => IMultiPartRequestBuilderExtensions.cs} (96%) create mode 100644 src/WireMock.Net.Minimal/Properties/AssemblyInfo.cs create mode 100644 src/WireMock.Net.Minimal/WireMock.Net.Minimal.csproj rename src/WireMock.Net.ProtoBuf/RequestBuilders/{IRequestBuilderExtensions.cs => IProtoBufRequestBuilderExtensions.cs} (96%) delete mode 100644 src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.ruleset diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index 80fa2696e..bfc0bbdbd 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -116,9 +116,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.GrpcCl EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.GraphQL", "src\WireMock.Net.GraphQL\WireMock.Net.GraphQL.csproj", "{B6269AAC-170A-4346-8B9A-444DED3D9A45}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.MimeKitLite", "src\WireMock.Net.MimeKitLite\WireMock.Net.MimeKitLite.csproj", "{F8B4A93E-46EF-4237-88FE-15FDAB7635C2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.MimeKitLite", "src\WireMock.Net.MimeKitLite\WireMock.Net.MimeKitLite.csproj", "{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.ProtoBuf", "src\WireMock.Net.ProtoBuf\WireMock.Net.ProtoBuf.csproj", "{B47413CD-55D3-49A7-896A-17ADBFF72407}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.ProtoBuf", "src\WireMock.Net.ProtoBuf\WireMock.Net.ProtoBuf.csproj", "{B47413AA-55D3-49A7-896A-17ADBFF72407}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Minimal", "src\WireMock.Net.Minimal\WireMock.Net.Minimal.csproj", "{A39C689E-B94B-4BBB-A270-B5A4C2B6D179}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -278,14 +280,18 @@ Global {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.Build.0 = Release|Any CPU - {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8B4A93E-46EF-4237-88FE-15FDAB7635C2}.Release|Any CPU.Build.0 = Release|Any CPU - {B47413CD-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B47413CD-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B47413CD-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B47413CD-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.Build.0 = Release|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.Build.0 = Release|Any CPU + {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.Build.0 = Release|Any CPU + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -331,8 +337,9 @@ Global {7FC0B409-2682-40EE-B3B9-3930D6769D01} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {B1580A38-84E7-44BE-8FE7-3EE5031D74A1} = {985E0ADB-D4B4-473A-AA40-567E279B7946} {B6269AAC-170A-4346-8B9A-444DED3D9A45} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} - {F8B4A93E-46EF-4237-88FE-15FDAB7635C2} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} - {B47413CD-55D3-49A7-896A-17ADBFF72407} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} + {F8B4A93E-46EF-4237-88FE-15FDAB7635D4} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} + {B47413AA-55D3-49A7-896A-17ADBFF72407} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458} diff --git a/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs b/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs index b399d74ae..2bdd28481 100644 --- a/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs +++ b/src/WireMock.Net.GraphQL/Matchers/GraphQLMatcher.cs @@ -1,3 +1,4 @@ +#if GRAPHQL using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; @@ -198,4 +199,5 @@ private ISchema BuildSchema(string typeDefinitions) return schema; } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs b/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs index 6389c8072..44d8bd7fa 100644 --- a/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs +++ b/src/WireMock.Net.GraphQL/Matchers/Models/WireMockCustomScalarGraphType.cs @@ -1,3 +1,4 @@ +#if GRAPHQL using System; using GraphQL.Types; @@ -25,4 +26,5 @@ public abstract class WireMockCustomScalarGraphType : ScalarGraphType return (T)Convert.ChangeType(value, typeof(T)); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs b/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs index ec7877451..b4dd7154e 100644 --- a/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs +++ b/src/WireMock.Net.GraphQL/Matchers/Request/RequestMessageGraphQLMatcher.cs @@ -1,3 +1,4 @@ +#if GRAPHQL using System; using System.Collections.Generic; using System.Linq; @@ -90,4 +91,5 @@ private static IMatcher[] CreateMatcherArray(MatchBehaviour matchBehaviour, AnyO { return new[] { TypeLoader.Load(schema, customScalars, matchBehaviour, MatchOperator.Or) }.Cast().ToArray(); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs b/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs index ee5b32150..a2f9571eb 100644 --- a/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net.GraphQL/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] // Needed for Moq in the UnitTest project -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file +// [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs b/src/WireMock.Net.GraphQL/RequestBuilders/IGraphQLRequestBuilderExtensions.cs similarity index 98% rename from src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs rename to src/WireMock.Net.GraphQL/RequestBuilders/IGraphQLRequestBuilderExtensions.cs index 76b6a6f29..d58932110 100644 --- a/src/WireMock.Net.GraphQL/RequestBuilders/IRequestBuilderExtensions.cs +++ b/src/WireMock.Net.GraphQL/RequestBuilders/IGraphQLRequestBuilderExtensions.cs @@ -1,3 +1,4 @@ +#if GRAPHQL // ReSharper disable InconsistentNaming using System; using System.Collections.Generic; @@ -10,7 +11,7 @@ namespace WireMock.RequestBuilders; /// /// IRequestBuilderExtensions extensions for GraphQL. /// -public static class IRequestBuilderExtensions +public static class IGraphQLRequestBuilderExtensions { /// /// WithGraphQLSchema: The GraphQL schema as a string. @@ -123,4 +124,5 @@ public static IRequestBuilder WithBodyAsGraphQLSchema(this IRequestBuilder reque { return WithGraphQLSchema(requestBuilder, body, matchBehaviour); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj index a873daef4..5a52a1d79 100644 --- a/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj +++ b/src/WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj @@ -4,7 +4,7 @@ GraphQL support for WireMock.Net WireMock.Net.Matchers.GraphQL Stef Heyenrath - netstandard2.0;netstandard2.1;net5.0;net6.0;net8.0 + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0 true wiremock;matchers;matcher;graphql WireMock @@ -31,7 +31,7 @@ - + \ No newline at end of file diff --git a/src/WireMock.Net.Matchers.CSharpCode/Matchers/CSharpCodeMatcher.cs b/src/WireMock.Net.Matchers.CSharpCode/Matchers/CSharpCodeMatcher.cs index 90dcd3bc7..4fa6ec044 100644 --- a/src/WireMock.Net.Matchers.CSharpCode/Matchers/CSharpCodeMatcher.cs +++ b/src/WireMock.Net.Matchers.CSharpCode/Matchers/CSharpCodeMatcher.cs @@ -1,3 +1,4 @@ +//#if CSHARPMATCHER using System; using System.Linq; using System.Reflection; @@ -231,4 +232,5 @@ private string GetSourceForIsMatchWithString(string pattern, bool isMatchWithStr /// public string Name => nameof(CSharpCodeMatcher); -} \ No newline at end of file +} +//#endif \ No newline at end of file diff --git a/src/WireMock.Net.Matchers.CSharpCode/Properties/AssemblyInfo.cs b/src/WireMock.Net.Matchers.CSharpCode/Properties/AssemblyInfo.cs index 4f81246fa..fd930200f 100644 --- a/src/WireMock.Net.Matchers.CSharpCode/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net.Matchers.CSharpCode/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] // Needed for Moq in the UnitTest project -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file +// [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj b/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj index 99ca02939..c516d0d8d 100644 --- a/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj +++ b/src/WireMock.Net.Matchers.CSharpCode/WireMock.Net.Matchers.CSharpCode.csproj @@ -4,7 +4,7 @@ A CSharpCodeMatcher which can be used to match WireMock.Net Requests using C# code. WireMock.Net.Matchers.CSharpCode Stef Heyenrath - net451;net452;net46;net461;net462;net47;net48;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net451;net452;net46;net461;net462;net47;net48;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0 true wiremock;matchers;matcher;csharp;csharpcode WireMock @@ -34,7 +34,7 @@ - + diff --git a/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs b/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs index fe6a84960..a60331671 100644 --- a/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs +++ b/src/WireMock.Net.MimeKitLite/Matchers/MimePartMatcher.cs @@ -1,3 +1,4 @@ +#if MIMEKIT using System; using MimeKit; using WireMock.Matchers.Helpers; @@ -105,4 +106,5 @@ private MatchResult MatchOnContent(MimePart mimePart) { return contentType?.ToString().Replace("Content-Type: ", string.Empty); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs b/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs index 600ba9e23..a516afbfa 100644 --- a/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs +++ b/src/WireMock.Net.MimeKitLite/Matchers/Request/RequestMessageMultiPartMatcher.cs @@ -1,3 +1,4 @@ +#if MIMEKIT using System; using System.Collections.Generic; using System.Linq; @@ -95,4 +96,5 @@ public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResu return requestMatchResult.AddScore(GetType(), score, exception); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs b/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs index ee5b32150..a2f9571eb 100644 --- a/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net.MimeKitLite/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] // Needed for Moq in the UnitTest project -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file +// [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs b/src/WireMock.Net.MimeKitLite/RequestBuilders/IMultiPartRequestBuilderExtensions.cs similarity index 96% rename from src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs rename to src/WireMock.Net.MimeKitLite/RequestBuilders/IMultiPartRequestBuilderExtensions.cs index 007eb05ca..3bfc372aa 100644 --- a/src/WireMock.Net.MimeKitLite/RequestBuilders/IRequestBuilderExtensions.cs +++ b/src/WireMock.Net.MimeKitLite/RequestBuilders/IMultiPartRequestBuilderExtensions.cs @@ -1,3 +1,4 @@ +#if MIMEKIT // ReSharper disable InconsistentNaming using WireMock.Matchers; using WireMock.Matchers.Request; @@ -7,7 +8,7 @@ namespace WireMock.RequestBuilders; /// /// IRequestBuilderExtensions extensions for MultiPart Mime using MimeKitLite. /// -public static class IRequestBuilderExtensions +public static class IMultiPartRequestBuilderExtensions { /// /// WithMultiPart: IMatcher @@ -44,4 +45,5 @@ public static IRequestBuilder WithMultiPart(this IRequestBuilder requestBuilder, { return requestBuilder.Add(new RequestMessageMultiPartMatcher(matchBehaviour, MatchOperator.Or, matchers)); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs b/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs index ea83c7c51..1c5fb1181 100644 --- a/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs +++ b/src/WireMock.Net.MimeKitLite/Util/MimeKitUtils.cs @@ -1,3 +1,4 @@ +#if MIMEKIT using System; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -65,4 +66,5 @@ private static byte[] FixBytes(byte[] bytes, WireMockList contentType) return result; } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj b/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj index 60620b981..9f6c9be9a 100644 --- a/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj +++ b/src/WireMock.Net.MimeKitLite/WireMock.Net.MimeKitLite.csproj @@ -30,7 +30,7 @@ - + \ No newline at end of file diff --git a/src/WireMock.Net.Minimal/Properties/AssemblyInfo.cs b/src/WireMock.Net.Minimal/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..1d42700e7 --- /dev/null +++ b/src/WireMock.Net.Minimal/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +[assembly: InternalsVisibleTo("WireMock.Net.MimeKitLite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +[assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +//[assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] diff --git a/src/WireMock.Net.Minimal/WireMock.Net.Minimal.csproj b/src/WireMock.Net.Minimal/WireMock.Net.Minimal.csproj new file mode 100644 index 000000000..a5286e6ea --- /dev/null +++ b/src/WireMock.Net.Minimal/WireMock.Net.Minimal.csproj @@ -0,0 +1,204 @@ + + + Minimal version for WireMock.Net + WireMock.Net.Minimal + Stef Heyenrath + net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0 + true + WireMock.Net.Minimal + WireMock.Net.Minimal + tdd;mock;http;wiremock;test;server;unittest;minimal + WireMock + {A39C689E-B94B-4BBB-A270-B5A4C2B6D179} + true + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + + true + ../WireMock.Net/WireMock.Net.snk + + true + + + + + + + + + true + + + + WireMock.Net.ruleset + + + + $(DefineConstants);NETSTANDARD;USE_ASPNETCORE + + + + $(DefineConstants);USE_ASPNETCORE + + + + $(DefineConstants);USE_ASPNETCORE;NET46 + + + + $(DefineConstants);OPENAPIPARSER + + + + $(DefineConstants);TRAILINGHEADERS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/Matchers/ProtoBufMatcher.cs b/src/WireMock.Net.ProtoBuf/Matchers/ProtoBufMatcher.cs index 4f4e63d3c..844a52d36 100644 --- a/src/WireMock.Net.ProtoBuf/Matchers/ProtoBufMatcher.cs +++ b/src/WireMock.Net.ProtoBuf/Matchers/ProtoBufMatcher.cs @@ -1,3 +1,4 @@ +#if PROTOBUF using System; using System.Threading; using System.Threading.Tasks; @@ -103,4 +104,5 @@ public async Task IsMatchAsync(byte[]? input, CancellationToken can return null; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/Matchers/Request/RequestMessageProtoBufMatcher.cs b/src/WireMock.Net.ProtoBuf/Matchers/Request/RequestMessageProtoBufMatcher.cs index f002d5442..57db5ac0a 100644 --- a/src/WireMock.Net.ProtoBuf/Matchers/Request/RequestMessageProtoBufMatcher.cs +++ b/src/WireMock.Net.ProtoBuf/Matchers/Request/RequestMessageProtoBufMatcher.cs @@ -1,3 +1,4 @@ +#if PROTOBUF using System; using WireMock.Models; @@ -36,4 +37,5 @@ private MatchResult GetMatchResult(IRequestMessage requestMessage) { return Matcher?.IsMatchAsync(requestMessage.BodyAsBytes).GetAwaiter().GetResult() ?? default; } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs b/src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs index ee5b32150..a2f9571eb 100644 --- a/src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] // Needed for Moq in the UnitTest project -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file +// [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/RequestBuilders/IRequestBuilderExtensions.cs b/src/WireMock.Net.ProtoBuf/RequestBuilders/IProtoBufRequestBuilderExtensions.cs similarity index 96% rename from src/WireMock.Net.ProtoBuf/RequestBuilders/IRequestBuilderExtensions.cs rename to src/WireMock.Net.ProtoBuf/RequestBuilders/IProtoBufRequestBuilderExtensions.cs index dcf63c538..66e769395 100644 --- a/src/WireMock.Net.ProtoBuf/RequestBuilders/IRequestBuilderExtensions.cs +++ b/src/WireMock.Net.ProtoBuf/RequestBuilders/IProtoBufRequestBuilderExtensions.cs @@ -1,3 +1,4 @@ +#if PROTOBUF // ReSharper disable InconsistentNaming using Stef.Validation; using WireMock.Matchers; @@ -6,9 +7,9 @@ namespace WireMock.RequestBuilders; /// -/// IRequestBuilderExtensions extensions for GraphQL. +/// IRequestBuilderExtensions extensions for ProtoBuf. /// -public static class IRequestBuilderExtensions +public static class IProtoBufRequestBuilderExtensions { /// /// WithGrpcProto @@ -61,4 +62,5 @@ public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBui { return Guard.NotNull(requestBuilder).Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => requestBuilder.Mapping.ProtoDefinition!.Value, messageType, matcher)); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/Util/ProtoBufUtils.cs b/src/WireMock.Net.ProtoBuf/Util/ProtoBufUtils.cs index b3b355758..958ff9c42 100644 --- a/src/WireMock.Net.ProtoBuf/Util/ProtoBufUtils.cs +++ b/src/WireMock.Net.ProtoBuf/Util/ProtoBufUtils.cs @@ -1,3 +1,4 @@ +#if PROTOBUF using System; using System.Threading; using System.Threading.Tasks; @@ -36,4 +37,5 @@ internal class ProtoBufUtils : IProtoBufUtils return await SingletonFactory.GetInstance().ConvertAsync(request, cancellationToken).ConfigureAwait(false); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj b/src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj index e7de51fd0..eb0102e11 100644 --- a/src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj +++ b/src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj @@ -30,7 +30,7 @@ - + \ No newline at end of file diff --git a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj index 10163956b..901e34a29 100644 --- a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj +++ b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj @@ -3,7 +3,7 @@ Lightweight StandAlone Http Mocking Server for .NET which includes GraphQL-support, ProtoBuf-support, MimePartMatcher and CSharpCodeMatcher. WireMock.Net.StandAlone Stef Heyenrath - net451;net452;net46;net461;net462;net47;net48;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net451;net452;net46;net461;net462;net47;net48;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0 true WireMock.Net.StandAlone WireMock.Net.StandAlone @@ -15,7 +15,7 @@ true true true - WireMock.Net.StandAlone.ruleset + ../WireMock.Net/WireMock.Net.ruleset true ../WireMock.Net/WireMock.Net.snk @@ -40,22 +40,6 @@ - - - - - - - - - - - - - - - - diff --git a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.ruleset b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.ruleset deleted file mode 100644 index 978d27ca3..000000000 --- a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.ruleset +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs b/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs index 7ffae3501..66127243a 100644 --- a/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs +++ b/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs @@ -144,8 +144,6 @@ private Task RunHost(CancellationToken token) _logger.Info("Server using .NET 5.0"); #elif NET6_0 _logger.Info("Server using .NET 6.0"); -#elif NET7_0 - _logger.Info("Server using .NET 7.0"); #elif NET8_0 _logger.Info("Server using .NET 8.0"); #elif NET46 diff --git a/src/WireMock.Net/Properties/AssemblyInfo.cs b/src/WireMock.Net/Properties/AssemblyInfo.cs index aa14015b8..cd3be9eb8 100644 --- a/src/WireMock.Net/Properties/AssemblyInfo.cs +++ b/src/WireMock.Net/Properties/AssemblyInfo.cs @@ -1,9 +1,9 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] -[assembly: InternalsVisibleTo("WireMock.Net.MimeKitLite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] -[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] -[assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.MimeKitLite, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] +// [assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] [assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")] diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index e80e1cfe9..a352a326c 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -54,6 +54,26 @@ $(DefineConstants);TRAILINGHEADERS + + $(DefineConstants);GRAPHQL + true + + + + $(DefineConstants);MIMEKIT + true + + + + $(DefineConstants);PROTOBUF + true + + + + $(DefineConstants);CSHARPMATCHER + true + + @@ -145,10 +165,6 @@ - - all @@ -192,4 +208,44 @@ + + + + %(RecursiveDir)/%(FileName)%(Extension) + + + %(RecursiveDir)/%(FileName)%(Extension) + + + %(RecursiveDir)/%(FileName)%(Extension) + + + %(RecursiveDir)/%(FileName)%(Extension) + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj index 4fa56a8e8..884eeb396 100644 --- a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj +++ b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj @@ -21,10 +21,6 @@ - - - - diff --git a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.GetMappingsAsync.cs b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.GetMappingsAsync.cs index 637db397b..de26bccba 100644 --- a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.GetMappingsAsync.cs +++ b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.GetMappingsAsync.cs @@ -1,4 +1,4 @@ -#if !(NET452 || NET461 || NETCOREAPP3_1) +#if PROTOBUF using System.Threading.Tasks; using RestEase; using VerifyXunit; diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index 18340ab3e..2178b0233 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -2,7 +2,7 @@ Stef Heyenrath - net452;net461;netcoreapp3.1;net6.0;net7.0;net8.0 + net452;net461;netcoreapp3.1;net6.0;net8.0 11 enable false @@ -26,36 +26,34 @@ NETFRAMEWORK - - $(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF + + $(DefineConstants);GRAPHQL + true + + + + $(DefineConstants);MIMEKIT + true + + + + $(DefineConstants);PROTOBUF + true $(DefineConstants);TRAILINGHEADERS - - + - @@ -119,7 +117,7 @@ - + From 919351b0abb80a87b40454c4283ba02ed03b54be Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 2 Mar 2024 16:59:25 +0100 Subject: [PATCH 09/11] 7 --- src/WireMock.Net/WireMock.Net.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index a352a326c..1a3e7a8b5 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -3,7 +3,7 @@ Lightweight Http Mocking Server for .Net, inspired by WireMock from the Java landscape. WireMock.Net Stef Heyenrath - net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0 true WireMock.Net WireMock.Net @@ -38,7 +38,7 @@ $(DefineConstants);NETSTANDARD;USE_ASPNETCORE - + $(DefineConstants);USE_ASPNETCORE @@ -54,7 +54,7 @@ $(DefineConstants);TRAILINGHEADERS - + $(DefineConstants);GRAPHQL true @@ -160,7 +160,7 @@ - + @@ -245,7 +245,7 @@ - + \ No newline at end of file From 3d3f57cfcb4d6bf9f5a0f584d16d369a181a349c Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 2 Mar 2024 17:07:17 +0100 Subject: [PATCH 10/11] test --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b2c5826..f6bb06026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ + # 1.5.48 (17 February 2024) - [#1047](https://github.com/WireMock-Net/WireMock.Net/pull/1047) - Add Grpc ProtoBuf support (request-response) [feature] contributed by [StefH](https://github.com/StefH) - [#1058](https://github.com/WireMock-Net/WireMock.Net/pull/1058) - Fix some SonarCloud issues [refactor] contributed by [StefH](https://github.com/StefH) From c0f46a700bd1c9ec782d83bb34a6db22b1b968c6 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 2 Mar 2024 17:14:43 +0100 Subject: [PATCH 11/11] 8 --- .github/workflows/ci.yml | 10 ++++------ WireMock.Net Solution.sln | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7bb91847b..f8d8bb6ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,16 +21,15 @@ jobs: - uses: actions/setup-dotnet@v3 with: dotnet-version: | - 7.0.x 8.0.x - name: 'Build Unit Tests' run: | - dotnet build './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net7.0 + dotnet build './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0 - name: 'Run Unit Tests' run: | - dotnet test './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net7.0 + dotnet test './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0 linux-build-and-run: runs-on: ubuntu-latest @@ -44,13 +43,12 @@ jobs: - uses: actions/setup-dotnet@v3 with: dotnet-version: | - 7.0.x 8.0.x - name: 'Build Unit Tests' run: | - dotnet build './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net7.0 + dotnet build './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0 - name: 'Run Unit Tests' run: | - dotnet test './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net7.0 \ No newline at end of file + dotnet test './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0 \ No newline at end of file diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index bfc0bbdbd..4736f80ea 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -70,7 +70,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.Net472 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Actions", "Actions", "{1DAEFF47-D117-4E95-8B3E-4F7C8B92011A}" ProjectSection(SolutionItems) = preProject - ..\System.Linq.Dynamic.Core\.github\workflows\ci.yml = ..\System.Linq.Dynamic.Core\.github\workflows\ci.yml + .github\workflows\ci.yml = .github\workflows\ci.yml .github\workflows\CreateRelease.yml = .github\workflows\CreateRelease.yml EndProjectSection EndProject