Skip to content

Commit ce1c86a

Browse files
niemyjskiCopilot
andcommitted
Overhaul serialization tests: base class, full JSON assertions, lang=json constants
- Add SerializerTestBase with Serializer, Serialize(), Deserialize<T>(), RoundTrip<T>() helpers - Remove SerializerContractAssertions (partial assertions replaced with whole-string) - Rewrite all 22 model test classes to extend SerializerTestBase - All JSON strings are const with /* lang=json */ IDE hint comments - Assert.Equal(expected, actual) on full JSON strings — no more Contains() - Add DataDictionaryConverter tests: JObject→compact string, JArray→compact string - Add RequestInfoConverter test: JObject PostData→indented string - Add EnvironmentInfo o_s_name/o_s_version explicit [JsonProperty] attribute test - Add Event KnownDataKeys constants validation test - Add Theory tests for all Event.KnownTypes - Set LangVersion=11.0 in test project for raw string literals Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 97b16e0 commit ce1c86a

25 files changed

Lines changed: 1176 additions & 2546 deletions

test/Exceptionless.Tests/Exceptionless.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<OutputType>Exe</OutputType>
1515
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
1616
<AssemblyName>Exceptionless.Tests</AssemblyName>
17+
<LangVersion>11.0</LangVersion>
1718
</PropertyGroup>
1819

1920
<ItemGroup>
Lines changed: 25 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,164 +1,63 @@
11
using Exceptionless.Models;
2-
using Exceptionless.Models.Data;
3-
using Exceptionless.Serializer;
2+
using Exceptionless.Tests.Serializer;
43
using Xunit;
54

65
namespace Exceptionless.Tests.Serializer.Models {
7-
public class ClientConfigurationSerializerTests {
8-
protected virtual IJsonSerializer GetSerializer() {
9-
return new DefaultJsonSerializer();
10-
}
6+
public class ClientConfigurationSerializerTests : SerializerTestBase {
7+
private const string MinimalJson = /* lang=json */ """{"version":0,"settings":{}}""";
8+
private const string CompleteJson = /* lang=json */ """{"version":1,"settings":{"@@log:*":"Off"}}""";
119

1210
[Fact]
13-
public void Serialize_CompleteClientConfiguration_ProducesSnakeCaseJson() {
11+
public void Serialize_MinimalClientConfiguration_ProducesCorrectJson() {
1412
// Arrange
15-
var config = new ClientConfiguration {
16-
Version = 5,
17-
Settings = {
18-
{ "@@log:*", "Off" },
19-
{ "IncludeConditionalData", "true" },
20-
{ "DataExclusions", "password,credit_card" }
21-
}
22-
};
23-
24-
var serializer = GetSerializer();
13+
var configuration = new ClientConfiguration();
2514

2615
// Act
27-
string json = serializer.Serialize(config);
16+
string json = Serialize(configuration);
2817

2918
// Assert
30-
SerializerContractAssertions.IncludesProperties(json, "version", "settings");
31-
SerializerContractAssertions.ExcludesProperties(json, "Version", "Settings");
19+
Assert.Equal(MinimalJson, json);
3220
}
3321

3422
[Fact]
35-
public void Deserialize_RoundTrip_PreservesSettings() {
23+
public void Serialize_CompleteClientConfiguration_ProducesCorrectJson() {
3624
// Arrange
37-
var serializer = GetSerializer();
38-
var original = new ClientConfiguration {
39-
Version = 3,
40-
Settings = {
41-
{ "@@log:*", "Warn" },
42-
{ "TestKey", "TestValue" },
43-
{ "@@DataExclusions", "secret" }
44-
}
45-
};
25+
var configuration = new ClientConfiguration { Version = 1 };
26+
configuration.Settings[SettingsDictionary.KnownKeys.LogLevelPrefix + "*"] = "Off";
4627

4728
// Act
48-
string json = serializer.Serialize(original);
49-
var deserialized = (ClientConfiguration)serializer.Deserialize(json, typeof(ClientConfiguration));
29+
string json = Serialize(configuration);
5030

5131
// Assert
52-
Assert.Equal(3, deserialized.Version);
53-
Assert.NotNull(deserialized.Settings);
54-
Assert.Equal(3, deserialized.Settings.Count);
55-
Assert.Equal("Warn", deserialized.Settings.GetString("@@log:*"));
56-
Assert.Equal("TestValue", deserialized.Settings.GetString("TestKey"));
57-
}
58-
59-
[Fact]
60-
public void Deserialize_EmptySettings_ReturnsEmptyDictionary() {
61-
// Arrange
62-
var serializer = GetSerializer();
63-
string json = "{\"version\":1,\"settings\":{}}";
64-
65-
// Act
66-
var config = (ClientConfiguration)serializer.Deserialize(json, typeof(ClientConfiguration));
67-
68-
// Assert
69-
Assert.NotNull(config);
70-
Assert.Equal(1, config.Version);
71-
Assert.NotNull(config.Settings);
72-
Assert.Empty(config.Settings);
73-
}
74-
75-
[Fact]
76-
public void Deserialize_WithVersion_PreservesVersionNumber() {
77-
// Arrange
78-
var serializer = GetSerializer();
79-
string json = "{\"version\":42,\"settings\":{}}";
80-
81-
// Act
82-
var config = (ClientConfiguration)serializer.Deserialize(json, typeof(ClientConfiguration));
83-
84-
// Assert
85-
Assert.Equal(42, config.Version);
86-
}
87-
88-
[Fact]
89-
public void Serialize_SettingsDictionaryKeys_PreservesOriginalCasing() {
90-
// Arrange
91-
var config = new ClientConfiguration {
92-
Version = 1,
93-
Settings = {
94-
{ "MyCustomKey", "value" },
95-
{ "@@log:MyApp.*", "Debug" }
96-
}
97-
};
98-
99-
var serializer = GetSerializer();
100-
101-
// Act
102-
string json = serializer.Serialize(config);
103-
104-
// Assert - Dictionary keys should preserve their original casing
105-
Assert.Contains("\"MyCustomKey\"", json);
106-
Assert.Contains("\"@@log:MyApp.*\"", json);
107-
}
108-
109-
[Fact]
110-
public void Deserialize_SettingsAreCaseInsensitive() {
111-
// Arrange
112-
var serializer = GetSerializer();
113-
var config = new ClientConfiguration {
114-
Version = 1,
115-
Settings = {
116-
{ "TestKey", "TestValue" }
117-
}
118-
};
119-
120-
// Act
121-
string json = serializer.Serialize(config);
122-
var deserialized = (ClientConfiguration)serializer.Deserialize(json, typeof(ClientConfiguration));
123-
124-
// Assert - SettingsDictionary uses OrdinalIgnoreCase comparer
125-
Assert.Equal("TestValue", deserialized.Settings.GetString("testkey"));
126-
Assert.Equal("TestValue", deserialized.Settings.GetString("TESTKEY"));
32+
Assert.Equal(CompleteJson, json);
12733
}
12834

12935
[Fact]
130-
public void Serialize_DefaultConfiguration_ProducesMinimalJson() {
36+
public void Deserialize_ClientConfiguration_RoundTrips() {
13137
// Arrange
132-
var config = new ClientConfiguration();
133-
var serializer = GetSerializer();
38+
var configuration = new ClientConfiguration { Version = 1 };
39+
configuration.Settings[SettingsDictionary.KnownKeys.LogLevelPrefix + "*"] = "Off";
13440

13541
// Act
136-
string json = serializer.Serialize(config);
42+
ClientConfiguration roundTripped = RoundTrip(configuration);
13743

13844
// Assert
139-
Assert.Contains("\"version\":0", json);
140-
Assert.Contains("\"settings\":{}", json);
45+
Assert.Equal(1, roundTripped.Version);
46+
Assert.Equal("Off", roundTripped.Settings["@@log:*"]);
14147
}
14248

14349
[Fact]
144-
public void Deserialize_SettingsWithBooleanValues_ParsesCorrectly() {
50+
public void Deserialize_ClientConfiguration_FromKnownJson_MapsAllProperties() {
14551
// Arrange
146-
var serializer = GetSerializer();
147-
var config = new ClientConfiguration {
148-
Version = 1,
149-
Settings = {
150-
{ "IncludeConditionalData", "true" },
151-
{ "DisableFeature", "false" }
152-
}
153-
};
52+
const string json = CompleteJson;
15453

15554
// Act
156-
string json = serializer.Serialize(config);
157-
var deserialized = (ClientConfiguration)serializer.Deserialize(json, typeof(ClientConfiguration));
55+
ClientConfiguration configuration = Deserialize<ClientConfiguration>(json);
15856

15957
// Assert
160-
Assert.True(deserialized.Settings.GetBoolean("IncludeConditionalData"));
161-
Assert.False(deserialized.Settings.GetBoolean("DisableFeature"));
58+
Assert.Equal(1, configuration.Version);
59+
Assert.Single(configuration.Settings);
60+
Assert.Equal("Off", configuration.Settings["@@log:*"]);
16261
}
16362
}
16463
}

0 commit comments

Comments
 (0)