From 8699e2ea788994caff02e494ffa4694aea9b7875 Mon Sep 17 00:00:00 2001 From: Christian Helle Date: Tue, 28 Jan 2025 13:40:27 +0100 Subject: [PATCH 1/3] Fix date formatting for date-time types --- src/Refitter.Core/ParameterExtractor.cs | 2 +- .../Examples/UseIsoDateFormatTests.cs | 129 +++++++++--------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/src/Refitter.Core/ParameterExtractor.cs b/src/Refitter.Core/ParameterExtractor.cs index 4453afc7..1bc20158 100644 --- a/src/Refitter.Core/ParameterExtractor.cs +++ b/src/Refitter.Core/ParameterExtractor.cs @@ -97,7 +97,7 @@ private static string GetQueryAttribute(CSharpParameterModel parameter, RefitGen return (parameter, settings) switch { { parameter.IsArray: true } => "Query(CollectionFormat.Multi)", - { parameter.IsDateOrDateTime: true, settings.UseIsoDateFormat: true } => "Query(Format = \"yyyy-MM-dd\")", + { parameter.IsDate: true, settings.UseIsoDateFormat: true } => "Query(Format = \"yyyy-MM-dd\")", { parameter.IsDateOrDateTime: true, settings.CodeGeneratorSettings: not null } => $"Query(Format = \"{settings.CodeGeneratorSettings?.DateFormat}\")", _ => "Query", }; diff --git a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs index 4c56c24c..b49d9d25 100644 --- a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs +++ b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs @@ -8,66 +8,54 @@ namespace Refitter.Tests.Examples; public class UseIsoDateFormatTests { private const string OpenApiSpec = @" -{ - ""swagger"": ""2.0"", - ""info"": { - ""title"": ""XX"", - ""version"": ""0.0.0"" - }, - ""host"": ""x.io"", - ""basePath"": ""/"", - ""schemes"": [ - ""https"" - ], - ""paths"": { - ""/t/dummy/{employee_id}"": { - ""get"": { - ""summary"": ""X"", - ""description"": ""X"", - ""operationId"": ""dummy"", - ""parameters"": [ - { - ""name"": ""employee_id"", - ""in"": ""path"", - ""description"": ""the specific employee"", - ""required"": true, - ""format"": ""int64"", - ""type"": ""integer"" - }, - { - ""name"": ""valid_from"", - ""in"": ""query"", - ""description"": ""the start of the period"", - ""required"": true, - ""format"": ""date"", - ""type"": ""string"" - }, - { - ""name"": ""valid_to"", - ""in"": ""query"", - ""description"": ""the end of the period"", - ""required"": true, - ""format"": ""date"", - ""type"": ""string"" - }, - { - ""name"": ""test_time"", - ""in"": ""query"", - ""description"": ""test parameter"", - ""required"": true, - ""format"": ""time"", - ""type"": ""string"" - } - ], - ""responses"": { - ""200"": { - ""description"": ""No response was specified"" - } - } - } - }, - } -} +swagger: '2.0' +info: + title: XX + version: 0.0.0 +host: x.io +basePath: / +schemes: + - https +paths: + '/t/dummy/{employee_id}': + get: + summary: X + description: X + operationId: dummy + parameters: + - name: employee_id + in: path + description: the specific employee + required: true + format: int64 + type: integer + - name: valid_from + in: query + description: the start of the period + required: true + format: date + type: string + - name: valid_to + in: query + description: the end of the period + required: true + format: date + type: string + - name: test_time + in: query + description: test parameter + required: true + format: time + type: string + - name: test_datetime + in: query + description: test parameter + required: true + format: date-time + type: string + responses: + '200': + description: No response was specified "; [Fact] @@ -81,7 +69,16 @@ public async Task Can_Generate_Code() public async Task GeneratedCode_Contains_Date_Format_String() { string generateCode = await GenerateCode(); - generateCode.Should().Contain(@"[Query(Format = ""yyyy-MM-dd"")] "); + generateCode.Should().Contain(@"[Query(Format = ""yyyy-MM-dd"")] System.DateTimeOffset valid_from"); + generateCode.Should().Contain(@"[Query(Format = ""yyyy-MM-dd"")] System.DateTimeOffset valid_to"); + } + + [Fact] + public async Task GeneratedCode_NotContains_DateTime_Format_String() + { + string generateCode = await GenerateCode(); + generateCode.Should().Contain(@"[Query] System.DateTimeOffset test_datetime"); + generateCode.Should().NotContain(@"[Query(Format = ""yyyy-MM-dd"")] System.DateTimeOffset time_datetime"); } [Fact] @@ -104,11 +101,7 @@ public async Task Can_Build_Generated_Code() private static async Task GenerateCode() { var swaggerFile = await CreateSwaggerFile(OpenApiSpec); - var settings = new RefitGeneratorSettings - { - OpenApiPath = swaggerFile, - UseIsoDateFormat = true - }; + var settings = new RefitGeneratorSettings { OpenApiPath = swaggerFile, UseIsoDateFormat = true }; var sut = await RefitGenerator.CreateAsync(settings); var generateCode = sut.Generate(); @@ -117,11 +110,11 @@ private static async Task GenerateCode() private static async Task CreateSwaggerFile(string contents) { - var filename = $"{Guid.NewGuid()}.json"; + var filename = $"{Guid.NewGuid()}.yaml"; var folder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); Directory.CreateDirectory(folder); var swaggerFile = Path.Combine(folder, filename); await File.WriteAllTextAsync(swaggerFile, contents); return swaggerFile; } -} \ No newline at end of file +} From 3dd5e46bf5bb2b9480d42a6bc871efa1bba5ab80 Mon Sep 17 00:00:00 2001 From: Christian Helle Date: Tue, 28 Jan 2025 14:02:00 +0100 Subject: [PATCH 2/3] Simplify yaml in example --- .../Examples/UseIsoDateFormatTests.cs | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs index b49d9d25..accba2b4 100644 --- a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs +++ b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs @@ -8,48 +8,36 @@ namespace Refitter.Tests.Examples; public class UseIsoDateFormatTests { private const string OpenApiSpec = @" -swagger: '2.0' -info: - title: XX - version: 0.0.0 -host: x.io -basePath: / -schemes: - - https +openapi: '3.0.1' paths: - '/t/dummy/{employee_id}': + '/t/foo/{id}': get: summary: X description: X - operationId: dummy + operationId: foo parameters: - - name: employee_id + - name: id in: path - description: the specific employee required: true format: int64 type: integer - name: valid_from in: query - description: the start of the period required: true format: date type: string - name: valid_to in: query - description: the end of the period required: true format: date type: string - name: test_time in: query - description: test parameter required: true format: time type: string - name: test_datetime in: query - description: test parameter required: true format: date-time type: string From 170483f151650e17e2e566984ad131c81ecaab8e Mon Sep 17 00:00:00 2001 From: Christian Helle Date: Tue, 28 Jan 2025 14:04:10 +0100 Subject: [PATCH 3/3] Yaml adjustments in example --- src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs index accba2b4..7b45f4f0 100644 --- a/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs +++ b/src/Refitter.Tests/Examples/UseIsoDateFormatTests.cs @@ -12,9 +12,7 @@ public class UseIsoDateFormatTests paths: '/t/foo/{id}': get: - summary: X - description: X - operationId: foo + operationId: getFoo parameters: - name: id in: path