Skip to content

Commit 01a3326

Browse files
committed
initial reproducer
1 parent ac4ac1a commit 01a3326

9 files changed

+641
-0
lines changed

.gitignore

+454
Large diffs are not rendered by default.

CSHARP-4488.sln

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoDbTest", "MongoDbTest\MongoDbTest.csproj", "{4361437F-CA83-42DC-ACB9-16A4E32D4A5F}"
4+
EndProject
5+
Global
6+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
7+
Debug|Any CPU = Debug|Any CPU
8+
Release|Any CPU = Release|Any CPU
9+
EndGlobalSection
10+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
11+
{4361437F-CA83-42DC-ACB9-16A4E32D4A5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
12+
{4361437F-CA83-42DC-ACB9-16A4E32D4A5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
13+
{4361437F-CA83-42DC-ACB9-16A4E32D4A5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
14+
{4361437F-CA83-42DC-ACB9-16A4E32D4A5F}.Release|Any CPU.Build.0 = Release|Any CPU
15+
EndGlobalSection
16+
EndGlobal
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using MongoDB.Bson;
2+
using MongoDB.Bson.Serialization;
3+
using MongoDB.Driver;
4+
using MongoDB.Driver.Core.Misc;
5+
using MongoDB.Driver.Linq;
6+
7+
namespace MongoDbTest.Driver;
8+
9+
/// <summary>
10+
/// This is a fix for an issue in the MongoDB driver.
11+
/// The issue is tracked here: https://jira.mongodb.org/browse/CSHARP-4488
12+
/// </summary>
13+
/// <typeparam name="TDocument">The type of the document.</typeparam>
14+
public sealed class FixedObjectUpdateDefinition<TDocument> : UpdateDefinition<TDocument>
15+
{
16+
private readonly object _obj;
17+
18+
/// <summary>
19+
/// Initializes a new instance of the <see cref="FixedObjectUpdateDefinition{TDocument}"/> class.
20+
/// </summary>
21+
/// <param name="obj">The object.</param>
22+
public FixedObjectUpdateDefinition(object obj)
23+
{
24+
_obj = Ensure.IsNotNull(obj, nameof(obj));
25+
}
26+
27+
/// <summary>
28+
/// Gets the object.
29+
/// </summary>
30+
public object Object
31+
{
32+
get { return _obj; }
33+
}
34+
35+
/// <inheritdoc />
36+
public override BsonValue Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry, LinqProvider linqProvider)
37+
{
38+
return new BsonDocumentWrapper(_obj, documentSerializer);
39+
}
40+
}

MongoDbTest/Dtos/Animal.cs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using MongoDB.Bson;
2+
using MongoDB.Bson.Serialization.Attributes;
3+
4+
namespace MongoDbTest.Dtos
5+
{
6+
[BsonKnownTypes(typeof(Cat))]
7+
public abstract class Animal
8+
{
9+
[BsonId]
10+
public ObjectId Id { get; set; }
11+
12+
public string Name { get; set; }
13+
}
14+
}

MongoDbTest/Dtos/Cat.cs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace MongoDbTest.Dtos
2+
{
3+
public class Cat : Animal
4+
{
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using MongoDB.Bson;
2+
using MongoDB.Driver;
3+
using MongoDbTest.Driver;
4+
using MongoDbTest.Dtos;
5+
6+
namespace MongoDbTest;
7+
8+
public class FixtureObjectUpdateDefinition : IClassFixture<MongoDbConnection>
9+
{
10+
private readonly MongoDbConnection _dbConnection;
11+
12+
public FixtureObjectUpdateDefinition(MongoDbConnection dbConnection)
13+
{
14+
_dbConnection = dbConnection;
15+
}
16+
17+
[Fact]
18+
public async Task UpdateUsingObjectDefinition()
19+
{
20+
var (collection, cat) = await SetupDb(nameof(UpdateUsingObjectDefinition));
21+
22+
cat.Name = "UpdatedCat";
23+
var update = new ObjectUpdateDefinition<Animal>(cat);
24+
await ExecuteUpdate(collection, cat.Id, update, cat.Name);
25+
}
26+
27+
[Fact]
28+
public async Task UpdateUsingFixedObjectDefinition()
29+
{
30+
var (collection, cat) = await SetupDb(nameof(UpdateUsingFixedObjectDefinition));
31+
32+
cat.Name = "UpdatedCat";
33+
var update = new FixedObjectUpdateDefinition<Animal>(cat);
34+
await ExecuteUpdate(collection, cat.Id, update, cat.Name);
35+
}
36+
37+
private async Task<(IMongoCollection<Animal> collection, Cat cat)> SetupDb(string testName)
38+
{
39+
var collection = _dbConnection.Database.GetCollection<Animal>(testName);
40+
41+
var cat = new Cat
42+
{
43+
Name = "TheCat"
44+
};
45+
await collection.InsertOneAsync(cat);
46+
47+
return (collection, cat);
48+
}
49+
50+
private async Task ExecuteUpdate(IMongoCollection<Animal> collection, ObjectId id, UpdateDefinition<Animal> update, string expectedName)
51+
{
52+
var updatedCat = await collection.FindOneAndUpdateAsync(new ExpressionFilterDefinition<Animal>(animal => animal.Id == id), update,
53+
new FindOneAndUpdateOptions<Animal>() { ReturnDocument = ReturnDocument.After });
54+
55+
Assert.Equal(expectedName, updatedCat.Name);
56+
}
57+
}

MongoDbTest/MongoDbConnection.cs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using MongoDB.Driver;
2+
3+
namespace MongoDbTest
4+
{
5+
public class MongoDbConnection : IAsyncLifetime
6+
{
7+
private const string MongoConnectionString = "mongodb://127.0.0.1:27018";
8+
9+
public MongoDbConnection()
10+
{
11+
DbClient = new MongoClient(MongoConnectionString);
12+
}
13+
14+
public MongoClient DbClient { get; }
15+
public IMongoDatabase Database { get; set; }
16+
17+
public Task InitializeAsync()
18+
{
19+
Database = DbClient.GetDatabase(Guid.NewGuid().ToString());
20+
return Task.CompletedTask;
21+
}
22+
23+
public Task DisposeAsync()
24+
{
25+
return DbClient.DropDatabaseAsync(Database.DatabaseNamespace.DatabaseName);
26+
}
27+
}
28+
}

MongoDbTest/MongoDbTest.csproj

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
13+
<PackageReference Include="MongoDB.Driver" Version="2.19.0" />
14+
<PackageReference Include="xunit" Version="2.4.1" />
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
<PrivateAssets>all</PrivateAssets>
18+
</PackageReference>
19+
<PackageReference Include="coverlet.collector" Version="3.1.2">
20+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
21+
<PrivateAssets>all</PrivateAssets>
22+
</PackageReference>
23+
</ItemGroup>
24+
25+
</Project>

MongoDbTest/Usings.cs

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
global using Xunit;

0 commit comments

Comments
 (0)