Skip to content

Commit 56f47eb

Browse files
fix: make sure the right migration gets marked as completed or failed
1 parent 006c776 commit 56f47eb

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/Rapidata.MongoDB.Migrations/Repositories/MigrationRepository.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,15 @@ public async Task<bool> StartMigration(IMigration migration, CancellationToken c
8484
.UpdateOneAsync(filter, update, options, cancellationToken)
8585
.ConfigureAwait(false);
8686

87-
return result.UpsertedId != null;
87+
return result.UpsertedId is not null;
8888
}
8989

9090
public async Task CompleteMigration(IMigration migration, CancellationToken cancellationToken)
9191
{
9292
var collection = GetCollection();
9393

94-
var filter = Builders<Migration>.Filter.Eq(x => x.Version, migration.Version) &
94+
var filter = Builders<Migration>.Filter.Eq(x => x.Date, migration.Date) &
95+
Builders<Migration>.Filter.Eq(x => x.Version, migration.Version) &
9596
Builders<Migration>.Filter.Eq(x => x.DeveloperId, migration.DeveloperId);
9697

9798
var update = Builders<Migration>.Update
@@ -106,7 +107,8 @@ public async Task FailMigration(IMigration migration, CancellationToken cancella
106107
{
107108
var collection = GetCollection();
108109

109-
var filter = Builders<Migration>.Filter.Eq(x => x.Version, migration.Version) &
110+
var filter = Builders<Migration>.Filter.Eq(x => x.Date, migration.Date) &
111+
Builders<Migration>.Filter.Eq(x => x.Version, migration.Version) &
110112
Builders<Migration>.Filter.Eq(x => x.DeveloperId, migration.DeveloperId);
111113

112114
var update = Builders<Migration>.Update

tests/Rapidata.MongoDB.Migrations.Tests.Integration/Core/MigrationEngineTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,4 +299,44 @@ public async Task Migrate_WhenTwoMigrationsAndOneAlreadyApplied_AppliesOnlyOne()
299299
var count = await DefaultCollection.CountDocumentsAsync(FilterDefinition<Migration>.Empty);
300300
count.Should().Be(2);
301301
}
302+
303+
[Test]
304+
public async Task Migrate_WhenTwoMigrationsWithSameVersionButDifferentDate_AppliesBoth()
305+
{
306+
// Arrange
307+
var migration1 = new MigrationMockBuilder().WithVersion(1).WithDate(DateOnly.FromDateTime(DateTime.Today))
308+
.Build();
309+
var migration2 = new MigrationMockBuilder().WithVersion(1)
310+
.WithDate(DateOnly.FromDateTime(DateTime.Today.AddDays(1))).Build();
311+
Setup(configure: null, migration1.Object, migration2.Object);
312+
313+
// Act
314+
await Subject.Migrate(CancellationToken.None);
315+
316+
// Assert
317+
var count = await DefaultCollection.CountDocumentsAsync(FilterDefinition<Migration>.Empty);
318+
count.Should().Be(2);
319+
}
320+
321+
[Test]
322+
public async Task Migrate_WhenMigrationWithSameVersionButDifferentDateAlreadyApplied_StillsAppliesMigration()
323+
{
324+
// Arrange
325+
var migration1 = new MigrationMockBuilder().WithVersion(1).WithDate(DateOnly.FromDateTime(DateTime.Today))
326+
.Build();
327+
Setup(configure: null, migration1.Object);
328+
await Subject.Migrate(CancellationToken.None);
329+
330+
var migration2 = new MigrationMockBuilder().WithVersion(1)
331+
.WithDate(DateOnly.FromDateTime(DateTime.Today.AddDays(1))).Build();
332+
MigrationResolver.Setup(x => x.GetMigrations(It.IsAny<IEnumerable<Assembly>>()))
333+
.Returns([migration2.Object]);
334+
335+
// Act
336+
await Subject.Migrate(CancellationToken.None);
337+
338+
// Assert
339+
var count = await DefaultCollection.CountDocumentsAsync(FilterDefinition<Migration>.Empty);
340+
count.Should().Be(2);
341+
}
302342
}

0 commit comments

Comments
 (0)