Skip to content

Commit 45768d3

Browse files
author
Bart Koelman
committed
Added FreeStringMongoIdentifiable, updated tests for client-generated IDs
1 parent 02c7951 commit 45768d3

File tree

7 files changed

+45
-23
lines changed

7 files changed

+45
-23
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using MongoDB.Bson.Serialization.Attributes;
2+
using MongoDB.Bson.Serialization.IdGenerators;
3+
4+
namespace JsonApiDotNetCore.MongoDb.Resources;
5+
6+
/// <summary>
7+
/// Basic implementation of a JSON:API resource whose Id is stored as a free-format string in MongoDB. Useful for resources that are created using
8+
/// client-generated IDs.
9+
/// </summary>
10+
public abstract class FreeStringMongoIdentifiable : IMongoIdentifiable
11+
{
12+
/// <inheritdoc />
13+
[BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
14+
public virtual string? Id { get; set; }
15+
16+
/// <inheritdoc />
17+
[BsonIgnore]
18+
public string? StringId
19+
{
20+
get => Id;
21+
set => Id = value;
22+
}
23+
24+
/// <inheritdoc />
25+
[BsonIgnore]
26+
public string? LocalId { get; set; }
27+
}

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using JsonApiDotNetCore.Configuration;
44
using JsonApiDotNetCore.Serialization.Objects;
55
using Microsoft.Extensions.DependencyInjection;
6-
using MongoDB.Bson;
76
using TestBuildingBlocks;
87
using Xunit;
98

@@ -28,7 +27,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
2827
{
2928
// Arrange
3029
TextLanguage newLanguage = _fakers.TextLanguage.Generate();
31-
newLanguage.Id = ObjectId.GenerateNewId().ToString();
30+
newLanguage.Id = "free-format-client-generated-id";
3231

3332
var requestBody = new
3433
{
@@ -82,8 +81,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
8281
public async Task Can_create_resource_with_client_generated_string_ID_having_no_side_effects()
8382
{
8483
// Arrange
85-
MusicTrack newTrack = _fakers.MusicTrack.Generate();
86-
newTrack.Id = ObjectId.GenerateNewId().ToString();
84+
Playlist newPlaylist = _fakers.Playlist.Generate();
85+
newPlaylist.Id = "free-format-client-generated-id";
8786

8887
var requestBody = new
8988
{
@@ -94,13 +93,11 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_no_
9493
op = "add",
9594
data = new
9695
{
97-
type = "musicTracks",
98-
id = newTrack.StringId,
96+
type = "playlists",
97+
id = newPlaylist.StringId,
9998
attributes = new
10099
{
101-
title = newTrack.Title,
102-
lengthInSeconds = newTrack.LengthInSeconds,
103-
releasedAt = newTrack.ReleasedAt
100+
name = newPlaylist.Name
104101
}
105102
}
106103
}
@@ -119,10 +116,9 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_no_
119116

120117
await _testContext.RunOnDatabaseAsync(async dbContext =>
121118
{
122-
MusicTrack trackInDatabase = await dbContext.MusicTracks.FirstWithIdAsync(newTrack.Id);
119+
Playlist playlistInDatabase = await dbContext.Playlists.FirstWithIdAsync(newPlaylist.Id);
123120

124-
trackInDatabase.Title.Should().Be(newTrack.Title);
125-
trackInDatabase.LengthInSeconds.Should().BeApproximately(newTrack.LengthInSeconds);
121+
playlistInDatabase.Name.Should().Be(newPlaylist.Name);
126122
});
127123
}
128124

@@ -131,7 +127,7 @@ public async Task Cannot_create_resource_for_existing_client_generated_ID()
131127
{
132128
// Arrange
133129
TextLanguage existingLanguage = _fakers.TextLanguage.Generate();
134-
existingLanguage.Id = ObjectId.GenerateNewId().ToString();
130+
existingLanguage.Id = "existing-free-format-client-generated-id";
135131

136132
string newIsoCode = _fakers.TextLanguage.Generate().IsoCode!;
137133

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Playlist.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
77

88
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
99
[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations")]
10-
public sealed class Playlist : HexStringMongoIdentifiable
10+
public sealed class Playlist : FreeStringMongoIdentifiable
1111
{
1212
[Attr]
1313
public string Name { get; set; } = null!;

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/TextLanguage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations;
77

88
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
99
[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.AtomicOperations")]
10-
public sealed class TextLanguage : HexStringMongoIdentifiable
10+
public sealed class TextLanguage : FreeStringMongoIdentifiable
1111
{
1212
[Attr]
1313
public string? IsoCode { get; set; }

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/Creating/CreateResourceWithClientGeneratedIdTests.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using JsonApiDotNetCore.Configuration;
44
using JsonApiDotNetCore.Serialization.Objects;
55
using Microsoft.Extensions.DependencyInjection;
6-
using MongoDB.Bson;
76
using TestBuildingBlocks;
87
using Xunit;
98

@@ -35,7 +34,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
3534
{
3635
// Arrange
3736
WorkItemGroup newGroup = _fakers.WorkItemGroup.Generate();
38-
newGroup.Id = ObjectId.GenerateNewId().ToString();
37+
newGroup.Id = "free-format-client-generated-id-1";
3938

4039
var requestBody = new
4140
{
@@ -79,7 +78,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
7978
{
8079
// Arrange
8180
WorkItemGroup newGroup = _fakers.WorkItemGroup.Generate();
82-
newGroup.Id = ObjectId.GenerateNewId().ToString();
81+
newGroup.Id = "free-format-client-generated-id-2";
8382

8483
var requestBody = new
8584
{
@@ -124,7 +123,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_no_
124123
{
125124
// Arrange
126125
RgbColor newColor = _fakers.RgbColor.Generate();
127-
newColor.Id = ObjectId.GenerateNewId().ToString();
126+
newColor.Id = "free-format-client-generated-id-3";
128127

129128
var requestBody = new
130129
{
@@ -162,7 +161,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_no_
162161
{
163162
// Arrange
164163
RgbColor newColor = _fakers.RgbColor.Generate();
165-
newColor.Id = ObjectId.GenerateNewId().ToString();
164+
newColor.Id = "free-format-client-generated-id-4";
166165

167166
var requestBody = new
168167
{
@@ -200,7 +199,7 @@ public async Task Cannot_create_resource_for_existing_client_generated_ID()
200199
{
201200
// Arrange
202201
RgbColor existingColor = _fakers.RgbColor.Generate();
203-
existingColor.Id = ObjectId.GenerateNewId().ToString();
202+
existingColor.Id = "free-format-client-generated-id-5";
204203

205204
string newDisplayName = _fakers.RgbColor.Generate().DisplayName;
206205

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/RgbColor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
77

88
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
99
[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite")]
10-
public sealed class RgbColor : HexStringMongoIdentifiable
10+
public sealed class RgbColor : FreeStringMongoIdentifiable
1111
{
1212
[Attr]
1313
public string DisplayName { get; set; } = null!;

test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/ReadWrite/WorkItemGroup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite;
77

88
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
99
[Resource(ControllerNamespace = "JsonApiDotNetCoreMongoDbTests.IntegrationTests.ReadWrite")]
10-
public sealed class WorkItemGroup : HexStringMongoIdentifiable
10+
public sealed class WorkItemGroup : FreeStringMongoIdentifiable
1111
{
1212
[Attr]
1313
public string Name { get; set; } = null!;

0 commit comments

Comments
 (0)