Skip to content

Commit dc6c879

Browse files
fix failing tests
1 parent 5152050 commit dc6c879

5 files changed

Lines changed: 94 additions & 10 deletions

File tree

MessagingService.IntegrationTests/Common/DockerHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ public override async Task StartContainersForScenarioRun(String scenarioName, Do
9090

9191
String Serialise(Object arg)
9292
{
93-
return StringSerialiser.Serialise<Object>(arg);
93+
return StringSerialiser.Serialise<Object>(arg, new SerialiserOptions(SerialiserPropertyFormat.SnakeCase));
9494
}
9595

9696
Object Deserialise(String arg, Type type)
9797
{
98-
return StringSerialiser.DeserializeObject<Object>(arg, type);
98+
return StringSerialiser.DeserializeObject<Object>(arg, type, new SerialiserOptions(SerialiserPropertyFormat.SnakeCase));
9999
}
100100

101101
private HttpClient CreateHttpClient() {

MessagingService.IntegrationTests/MessagingService.IntegrationTests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" />
1515
<PackageReference Include="Reqnroll" Version="3.3.3" />
1616
<PackageReference Include="Reqnroll.NUnit" Version="3.3.3" />
17-
<PackageReference Include="SecurityService.Client" Version="2026.4.3-build154" />
18-
<PackageReference Include="SecurityService.IntegrationTesting.Helpers" Version="2026.4.3-build154" />
17+
<PackageReference Include="SecurityService.Client" Version="2026.4.3-build156" />
18+
<PackageReference Include="SecurityService.IntegrationTesting.Helpers" Version="2026.4.3-build156" />
1919
<PackageReference Include="Shared.IntegrationTesting" Version="2026.5.4" />
2020
<PackageReference Include="Shouldly" Version="4.3.0" />
2121
<PackageReference Include="coverlet.collector" Version="8.0.0">

MessagingService/Bootstrapper/MiddlewareRegistry.cs

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
using Microsoft.IdentityModel.Tokens;
44
using Microsoft.OpenApi;
55
using Shared.Authorisation;
6+
using System;
7+
using System.Text.Json;
8+
using System.Text.Json.Serialization;
9+
using Shared.Serialisation;
610

711
namespace MessagingService.Bootstrapper
812
{
@@ -50,6 +54,8 @@ public MiddlewareRegistry() {
5054
RequestResponseMiddlewareLoggingConfig config = new(middlewareLogLevel, logRequests, logResponses);
5155

5256
this.AddSingleton(config);
57+
58+
this.ConfigureHttpJsonOptions(jsonOptions => JsonSerializerConfiguration.ConfigureMinimalApi(jsonOptions.SerializerOptions));
5359
}
5460

5561
private void ConfigureAuthentication() {
@@ -87,11 +93,11 @@ private void ConfigureAuthentication() {
8793
this.AddClientCredentialsOnlyPolicy();
8894
this.AddClientCredentialsHandler();
8995

90-
this.ConfigureHttpJsonOptions(options =>
91-
{
92-
options.SerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy();
93-
options.SerializerOptions.PropertyNameCaseInsensitive = true; // optional, but safer
94-
});
96+
//this.ConfigureHttpJsonOptions(options =>
97+
//{
98+
// options.SerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy();
99+
// options.SerializerOptions.PropertyNameCaseInsensitive = true; // optional, but safer
100+
//});
95101
}
96102
private void ConfigureSwagger() {
97103

@@ -127,3 +133,57 @@ private void ConfigureSwagger() {
127133
}
128134
}
129135
}
136+
137+
public static class JsonSerializerConfiguration
138+
{
139+
public static void ConfigureMinimalApi(JsonSerializerOptions serializerOptions)
140+
{
141+
var defaultOptions = SystemTextJsonSerializer.GetDefaultJsonSerializerOptions();
142+
serializerOptions.PropertyNamingPolicy = defaultOptions.PropertyNamingPolicy;
143+
serializerOptions.DictionaryKeyPolicy = defaultOptions.DictionaryKeyPolicy;
144+
serializerOptions.ReferenceHandler = defaultOptions.ReferenceHandler;
145+
serializerOptions.WriteIndented = defaultOptions.WriteIndented;
146+
serializerOptions.Converters.Add(new UtcDateTimeJsonConverter());
147+
serializerOptions.Converters.Add(new NullableUtcDateTimeJsonConverter());
148+
149+
}
150+
151+
private sealed class UtcDateTimeJsonConverter : System.Text.Json.Serialization.JsonConverter<DateTime>
152+
{
153+
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
154+
{
155+
var value = reader.GetDateTime();
156+
return value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime();
157+
}
158+
159+
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
160+
{
161+
writer.WriteStringValue(value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime());
162+
}
163+
}
164+
165+
private sealed class NullableUtcDateTimeJsonConverter : System.Text.Json.Serialization.JsonConverter<DateTime?>
166+
{
167+
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
168+
{
169+
if (reader.TokenType == JsonTokenType.Null)
170+
{
171+
return null;
172+
}
173+
174+
var value = reader.GetDateTime();
175+
return value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime();
176+
}
177+
178+
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
179+
{
180+
if (value.HasValue == false)
181+
{
182+
writer.WriteNullValue();
183+
return;
184+
}
185+
186+
writer.WriteStringValue(value.Value.Kind == DateTimeKind.Utc ? value.Value : value.Value.ToUniversalTime());
187+
}
188+
}
189+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Diagnostics.CodeAnalysis;
3+
using Lamar;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Shared.Serialisation;
6+
7+
namespace MessagingService.Bootstrapper;
8+
9+
[ExcludeFromCodeCoverage]
10+
public class SerialiserRegistry : ServiceRegistry
11+
{
12+
public SerialiserRegistry()
13+
{
14+
this.AddSingleton<IStringSerialiser, SystemTextJsonSerializer>();
15+
this.AddSingleton<Func<Object, String>>(_ => obj => StringSerialiser.Serialise(obj));
16+
this.AddSingleton<Func<String, Type, Object>>(_ => (str, type) => StringSerialiser.DeserializeObject<Object>(str, type));
17+
this.AddSingleton(SystemTextJsonSerializer.GetDefaultJsonSerializerOptions());
18+
}
19+
}

MessagingService/Startup.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using MessagingService.Endpoints;
12
using Microsoft.AspNetCore.Builder;
23
using Microsoft.AspNetCore.Hosting;
34
using Microsoft.Extensions.Configuration;
@@ -6,7 +7,6 @@
67
using Microsoft.Extensions.Logging;
78
using System;
89
using System.Collections.Generic;
9-
using MessagingService.Endpoints;
1010

1111
namespace MessagingService
1212
{
@@ -26,6 +26,7 @@ namespace MessagingService
2626
using Shared.General;
2727
using Shared.Logger;
2828
using Shared.Middleware;
29+
using Shared.Serialisation;
2930
using SMSMessage.DomainEvents;
3031
using System.Diagnostics;
3132
using System.Diagnostics.CodeAnalysis;
@@ -56,8 +57,12 @@ public void ConfigureContainer(ServiceRegistry services)
5657
services.IncludeRegistry<DomainServiceRegistry>();
5758
services.IncludeRegistry<DomainEventHandlerRegistry>();
5859
services.IncludeRegistry<MessagingProxyRegistry>();
60+
services.IncludeRegistry<SerialiserRegistry>();
5961

6062
Startup.Container = new Container(services);
63+
64+
var serialiser = Container.GetRequiredService<IStringSerialiser>();
65+
StringSerialiser.Initialise(serialiser);
6166
}
6267

6368
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

0 commit comments

Comments
 (0)