Skip to content

Commit 5decc9e

Browse files
Jabenclaude
andcommitted
fix: handle Guid to BsonValue mapping (#91)
Added explicit Guid to string conversion in ToBsonValue to prevent ArgumentException when MongoDB.Driver attempts to map Guid types. Also registered GuidSerializer with Standard representation in test setup to ensure consistent Guid handling across test suite. Fixes #91 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c1de440 commit 5decc9e

4 files changed

Lines changed: 194 additions & 10 deletions

File tree

src/Serilog.Sinks.MongoDB/Helpers/MongoDbDocumentHelpers.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,16 @@ internal static string SanitizedElementName(this string? name)
5656

5757
if (value is ScalarValue scalar)
5858
{
59+
if (scalar.Value is null) return null;
60+
5961
if (scalar.Value is Uri uri) return BsonValue.Create(uri.ToString());
6062

6163
if (scalar.Value is TimeSpan ts) return BsonValue.Create(ts.ToString());
6264

6365
if (scalar.Value is DateTimeOffset dto) return BsonValue.Create(dto.ToString());
6466

67+
if (scalar.Value is Guid guid) return BsonValue.Create(guid.ToString());
68+
6569
return BsonValue.Create(scalar.Value);
6670
}
6771

test/Serilog.Sinks.MongoDB.Tests/LoggerConfigurationMongoDBExtensionsTests.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@
22

33
using Microsoft.Extensions.Configuration;
44

5+
using MongoDB.Bson;
6+
using MongoDB.Bson.Serialization;
7+
using MongoDB.Bson.Serialization.Serializers;
58
using MongoDB.Driver;
69

10+
using NUnit.Framework;
11+
712
using Serilog.Helpers;
813

914
namespace Serilog.Sinks.MongoDB.Tests;
1015

11-
using NUnit.Framework;
12-
1316
[TestFixture]
1417
public class LoggerConfigurationMongoDbExtensionsTests
1518
{
19+
[OneTimeSetUp]
20+
public void SetupMongo()
21+
{
22+
BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
23+
}
24+
1625
private const string MongoConnectionString = "mongodb://localhost:27017";
1726

1827
private const string MongoDatabaseName = "mongodb-sink";
@@ -29,14 +38,13 @@ private static void TestCollectionAndDocumentExists(RollingInterval? rollingInte
2938
const string Message = "some message logged into mongodb";
3039

3140
using (var logger = new LoggerConfiguration()
32-
.WriteTo.MongoDBBson(
33-
configuration =>
34-
{
35-
configuration.SetMongoDatabase(mongoDatabase);
36-
if (rollingInterval is not null)
37-
configuration.SetRollingInterval(rollingInterval.Value);
38-
configuration.SetCollectionName(MongoCollectionName);
39-
}).CreateLogger())
41+
.WriteTo.MongoDBBson(configuration =>
42+
{
43+
configuration.SetMongoDatabase(mongoDatabase);
44+
if (rollingInterval is not null)
45+
configuration.SetRollingInterval(rollingInterval.Value);
46+
configuration.SetCollectionName(MongoCollectionName);
47+
}).CreateLogger())
4048
{
4149
logger.Information(Message);
4250
}

test/Serilog.Sinks.MongoDB.Tests/LoggerWithTraceIdTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
using Microsoft.Extensions.Configuration;
44

5+
using MongoDB.Bson;
6+
using MongoDB.Bson.Serialization;
7+
using MongoDB.Bson.Serialization.Serializers;
58
using MongoDB.Driver;
69

710
using Serilog.Helpers;
@@ -14,6 +17,12 @@ namespace Serilog.Sinks.MongoDB.Tests;
1417
[TestFixture]
1518
public class LoggerWithTraceIdTests
1619
{
20+
[OneTimeSetUp]
21+
public void SetupMongo()
22+
{
23+
BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
24+
}
25+
1726
private const string MongoConnectionString = "mongodb://localhost:27017";
1827

1928
private const string MongoDatabaseName = "mongodb-sink";
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
using FluentAssertions;
2+
using MongoDB.Bson;
3+
using NUnit.Framework;
4+
using Serilog.Events;
5+
using Serilog.Helpers;
6+
using System;
7+
8+
using MongoDB.Bson.Serialization;
9+
using MongoDB.Bson.Serialization.Serializers;
10+
11+
namespace Serilog.Sinks.MongoDB.Tests;
12+
13+
[TestFixture]
14+
public class MongoDbDocumentHelpersTests
15+
{
16+
[OneTimeSetUp]
17+
public void SetupMongo()
18+
{
19+
BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
20+
}
21+
22+
[Test]
23+
public void ToBsonValue_WithGuid_ShouldConvertToStringBsonValue()
24+
{
25+
// Arrange
26+
var guid = Guid.NewGuid();
27+
var scalarValue = new ScalarValue(guid);
28+
29+
// Act
30+
var result = scalarValue.ToBsonValue();
31+
32+
// Assert
33+
result.Should().NotBeNull();
34+
result.Should().BeOfType<BsonString>();
35+
result.AsString.Should().Be(guid.ToString());
36+
}
37+
38+
[Test]
39+
public void ToBsonValue_WithEmptyGuid_ShouldConvertToStringBsonValue()
40+
{
41+
// Arrange
42+
var guid = Guid.Empty;
43+
var scalarValue = new ScalarValue(guid);
44+
45+
// Act
46+
var result = scalarValue.ToBsonValue();
47+
48+
// Assert
49+
result.Should().NotBeNull();
50+
result.Should().BeOfType<BsonString>();
51+
result.AsString.Should().Be(guid.ToString());
52+
}
53+
54+
[Test]
55+
public void ToBsonValue_WithNullableGuid_ShouldConvertToStringBsonValue()
56+
{
57+
// Arrange
58+
Guid? guid = Guid.NewGuid();
59+
var scalarValue = new ScalarValue(guid);
60+
61+
// Act
62+
var result = scalarValue.ToBsonValue();
63+
64+
// Assert
65+
result.Should().NotBeNull();
66+
result.Should().BeOfType<BsonString>();
67+
result.AsString.Should().Be(guid.ToString());
68+
}
69+
70+
[Test]
71+
public void ToBsonValue_WithNullGuid_ShouldReturnNull()
72+
{
73+
// Arrange
74+
Guid? guid = null;
75+
var scalarValue = new ScalarValue(guid);
76+
77+
// Act
78+
var result = scalarValue.ToBsonValue();
79+
80+
// Assert
81+
result.Should().BeNull();
82+
}
83+
84+
[Test]
85+
public void ToBsonValue_WithUri_ShouldConvertToStringBsonValue()
86+
{
87+
// Arrange
88+
var uri = new Uri("https://example.com");
89+
var scalarValue = new ScalarValue(uri);
90+
91+
// Act
92+
var result = scalarValue.ToBsonValue();
93+
94+
// Assert
95+
result.Should().NotBeNull();
96+
result.Should().BeOfType<BsonString>();
97+
result.AsString.Should().Be(uri.ToString());
98+
}
99+
100+
[Test]
101+
public void ToBsonValue_WithTimeSpan_ShouldConvertToStringBsonValue()
102+
{
103+
// Arrange
104+
var timeSpan = TimeSpan.FromMinutes(30);
105+
var scalarValue = new ScalarValue(timeSpan);
106+
107+
// Act
108+
var result = scalarValue.ToBsonValue();
109+
110+
// Assert
111+
result.Should().NotBeNull();
112+
result.Should().BeOfType<BsonString>();
113+
result.AsString.Should().Be(timeSpan.ToString());
114+
}
115+
116+
[Test]
117+
public void ToBsonValue_WithDateTimeOffset_ShouldConvertToStringBsonValue()
118+
{
119+
// Arrange
120+
var dateTimeOffset = DateTimeOffset.Now;
121+
var scalarValue = new ScalarValue(dateTimeOffset);
122+
123+
// Act
124+
var result = scalarValue.ToBsonValue();
125+
126+
// Assert
127+
result.Should().NotBeNull();
128+
result.Should().BeOfType<BsonString>();
129+
result.AsString.Should().Be(dateTimeOffset.ToString());
130+
}
131+
132+
[Test]
133+
public void ToBsonValue_WithString_ShouldConvertToStringBsonValue()
134+
{
135+
// Arrange
136+
var stringValue = "test string";
137+
var scalarValue = new ScalarValue(stringValue);
138+
139+
// Act
140+
var result = scalarValue.ToBsonValue();
141+
142+
// Assert
143+
result.Should().NotBeNull();
144+
result.Should().BeOfType<BsonString>();
145+
result.AsString.Should().Be(stringValue);
146+
}
147+
148+
[Test]
149+
public void ToBsonValue_WithInteger_ShouldConvertToInt32BsonValue()
150+
{
151+
// Arrange
152+
var intValue = 42;
153+
var scalarValue = new ScalarValue(intValue);
154+
155+
// Act
156+
var result = scalarValue.ToBsonValue();
157+
158+
// Assert
159+
result.Should().NotBeNull();
160+
result.Should().BeOfType<BsonInt32>();
161+
result.AsInt32.Should().Be(intValue);
162+
}
163+
}

0 commit comments

Comments
 (0)