diff --git a/src/Refitter.SourceGenerator.Tests/Build/ProjectFileContents.cs b/src/Refitter.SourceGenerator.Tests/Build/ProjectFileContents.cs index 6360e50db..ed27886ec 100644 --- a/src/Refitter.SourceGenerator.Tests/Build/ProjectFileContents.cs +++ b/src/Refitter.SourceGenerator.Tests/Build/ProjectFileContents.cs @@ -9,14 +9,14 @@ public static class ProjectFileContents true - + - - - - + + + + @@ -36,14 +36,14 @@ public static class ProjectFileContents true - + - - - - + + + + diff --git a/src/Refitter.SourceGenerator.Tests/Refitter.SourceGenerator.Tests.csproj b/src/Refitter.SourceGenerator.Tests/Refitter.SourceGenerator.Tests.csproj index edb56da92..81bad3298 100644 --- a/src/Refitter.SourceGenerator.Tests/Refitter.SourceGenerator.Tests.csproj +++ b/src/Refitter.SourceGenerator.Tests/Refitter.SourceGenerator.Tests.csproj @@ -21,7 +21,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/src/Refitter.Tests/Build/BuildHelper.cs b/src/Refitter.Tests/Build/BuildHelper.cs index b37af55ff..cf73edca0 100644 --- a/src/Refitter.Tests/Build/BuildHelper.cs +++ b/src/Refitter.Tests/Build/BuildHelper.cs @@ -19,6 +19,7 @@ public static bool BuildCSharp(string targetFramework, params string[] generated var projectContent = targetFramework switch { "net9.0" => ProjectFileContents.Net90App, + "net10.0" => ProjectFileContents.Net100App, _ => ProjectFileContents.Net80App }; File.WriteAllText(projectFile, projectContent); diff --git a/src/Refitter.Tests/Build/ProjectFileContents.cs b/src/Refitter.Tests/Build/ProjectFileContents.cs index 730fb25d9..c222bbc9c 100644 --- a/src/Refitter.Tests/Build/ProjectFileContents.cs +++ b/src/Refitter.Tests/Build/ProjectFileContents.cs @@ -9,14 +9,14 @@ public static class ProjectFileContents true - - - + + + - - - - + + + + @@ -36,14 +36,41 @@ public static class ProjectFileContents true - - - + + + - - - - + + + + + + + + + + + + + + +"; + + public const string Net100App = @" + + + net10.0 + true + + + + + + + + + + diff --git a/src/Refitter.Tests/Scenarios/GenerateJsonSerializerContextPolymorphismTests.cs b/src/Refitter.Tests/Scenarios/GenerateJsonSerializerContextPolymorphismTests.cs index 234c94513..2b36b8715 100644 --- a/src/Refitter.Tests/Scenarios/GenerateJsonSerializerContextPolymorphismTests.cs +++ b/src/Refitter.Tests/Scenarios/GenerateJsonSerializerContextPolymorphismTests.cs @@ -64,7 +64,7 @@ public class GenerateJsonSerializerContextPolymorphismTests packages - + """; diff --git a/src/Refitter.Tests/Scenarios/Refit11CompatibilityTests.cs b/src/Refitter.Tests/Scenarios/Refit11CompatibilityTests.cs new file mode 100644 index 000000000..4d138a368 --- /dev/null +++ b/src/Refitter.Tests/Scenarios/Refit11CompatibilityTests.cs @@ -0,0 +1,306 @@ +using FluentAssertions; +using Refitter.Core; +using Refitter.Tests.Build; +using Refitter.Tests.Resources; +using Refitter.Tests.TestUtilities; +using TUnit.Core; + +namespace Refitter.Tests.Scenarios; + +public class Refit11CompatibilityTests +{ + private const string Refit11TargetFramework = "net10.0"; + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV2, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Refit_11(SampleOpenSpecifications version, string filename) + { + var generatedCode = await GenerateCode(version, filename); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_IApiResponse_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + ReturnIApiResponse = true + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_IObservableResponse_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + ReturnIObservable = true + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Multiple_Interfaces_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + MultipleInterfaces = MultipleInterfaces.ByEndpoint + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Multiple_Interfaces_ByTag_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + MultipleInterfaces = MultipleInterfaces.ByTag + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Dependency_Injection_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + DependencyInjectionSettings = new DependencyInjectionSettings + { + BaseUrl = "https://petstore3.swagger.io/api/v3" + } + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Polly_Error_Handler_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + DependencyInjectionSettings = new DependencyInjectionSettings + { + BaseUrl = "https://petstore3.swagger.io/api/v3", + TransientErrorHandler = TransientErrorHandler.Polly + } + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Microsoft_Http_Resilience_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + DependencyInjectionSettings = new DependencyInjectionSettings + { + BaseUrl = "https://petstore3.swagger.io/api/v3", + TransientErrorHandler = TransientErrorHandler.HttpResilience + } + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Cancellation_Tokens_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + UseCancellationTokens = true + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Operation_Headers_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + GenerateOperationHeaders = true + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders, "SwaggerPetstoreWithBearerAuthenticationHeaders.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders, "SwaggerPetstoreWithBearerAuthenticationHeaders.yaml")] + public async Task Can_Build_Generated_Code_With_Bearer_Authentication_Method_Style_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + AuthenticationHeaderStyle = AuthenticationHeaderStyle.Method + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders, "SwaggerPetstoreWithBearerAuthenticationHeaders.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders, "SwaggerPetstoreWithBearerAuthenticationHeaders.yaml")] + public async Task Can_Build_Generated_Code_With_Bearer_Authentication_Parameter_Style_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + AuthenticationHeaderStyle = AuthenticationHeaderStyle.Parameter + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Immutable_Records_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + ImmutableRecords = true + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_Internal_Type_Accessibility_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + TypeAccessibility = TypeAccessibility.Internal + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_NonNullable_Reference_Types_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + CodeGeneratorSettings = new CodeGeneratorSettings + { + GenerateNullableReferenceTypes = true, + GenerateOptionalPropertiesAsNullable = true + } + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + [Test] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreJsonV3, "SwaggerPetstore.json")] + [Arguments(SampleOpenSpecifications.SwaggerPetstoreYamlV3, "SwaggerPetstore.yaml")] + public async Task Can_Build_Generated_Code_With_JsonSerializerContext_Using_Refit_11(SampleOpenSpecifications version, string filename) + { + var settings = new RefitGeneratorSettings + { + GenerateJsonSerializerContext = true, + Naming = new NamingSettings + { + UseOpenApiTitle = false, + InterfaceName = "ISwaggerPetstore" + } + }; + var generatedCode = await GenerateCode(version, filename, settings); + BuildHelper + .BuildCSharp(Refit11TargetFramework, generatedCode) + .Should() + .BeTrue(); + } + + private static async Task GenerateCode( + SampleOpenSpecifications version, + string filename, + RefitGeneratorSettings? settings = null) + { + var swaggerFile = await TestFile.CreateSwaggerFile(EmbeddedResources.GetSwaggerPetstore(version), filename); + if (settings is null) + { + settings = new RefitGeneratorSettings { OpenApiPath = swaggerFile }; + } + else + { + settings.OpenApiPath = swaggerFile; + } + + var sut = await RefitGenerator.CreateAsync(settings); + return sut.Generate(); + } +} diff --git a/test/ConsoleApp/Directory.Build.props b/test/ConsoleApp/Directory.Build.props index a42db01a2..2c476dd28 100644 --- a/test/ConsoleApp/Directory.Build.props +++ b/test/ConsoleApp/Directory.Build.props @@ -31,8 +31,8 @@ - - + + diff --git a/test/HelloWorld/HelloWorld/HelloWorld.csproj b/test/HelloWorld/HelloWorld/HelloWorld.csproj index 2af4c2d7a..8d4b78bcc 100644 --- a/test/HelloWorld/HelloWorld/HelloWorld.csproj +++ b/test/HelloWorld/HelloWorld/HelloWorld.csproj @@ -12,7 +12,7 @@ - + diff --git a/test/MSBuild/Refitter.MSBuild.Tests.csproj b/test/MSBuild/Refitter.MSBuild.Tests.csproj index a2db32fb0..18b574b83 100644 --- a/test/MSBuild/Refitter.MSBuild.Tests.csproj +++ b/test/MSBuild/Refitter.MSBuild.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/test/MinimalApi/MinimalApi.csproj b/test/MinimalApi/MinimalApi.csproj index 51ae68f1b..106105182 100644 --- a/test/MinimalApi/MinimalApi.csproj +++ b/test/MinimalApi/MinimalApi.csproj @@ -20,7 +20,7 @@ - + diff --git a/test/MultipleFiles/Client/Client.csproj b/test/MultipleFiles/Client/Client.csproj index 448b5c810..0a184f6ce 100644 --- a/test/MultipleFiles/Client/Client.csproj +++ b/test/MultipleFiles/Client/Client.csproj @@ -6,8 +6,8 @@ - - + +