tests: add test for unit of work

This commit is contained in:
Stevan Freeborn
2024-08-23 08:32:34 -05:00
parent 886eb2f855
commit 3739164960
14 changed files with 428 additions and 36 deletions
@@ -14,7 +14,7 @@ public class AddressRepositoryTests : RepositoryTest
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -35,7 +35,7 @@ public class AddressRepositoryTests : RepositoryTest
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -51,7 +51,7 @@ public class AddressRepositoryTests : RepositoryTest
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.StreetAddress = "Updated";
@@ -14,7 +14,7 @@ public class AliasRepositoryTests : RepositoryTest
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -35,7 +35,7 @@ public class AliasRepositoryTests : RepositoryTest
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -51,7 +51,7 @@ public class AliasRepositoryTests : RepositoryTest
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.Remarks = "Updated";
@@ -14,7 +14,7 @@ public class CommentRepositoryTests : RepositoryTest
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -35,7 +35,7 @@ public class CommentRepositoryTests : RepositoryTest
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
entity.SdnId = SdnId;
@@ -51,7 +51,7 @@ public class CommentRepositoryTests : RepositoryTest
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.Remarks = "Updated";
@@ -0,0 +1,33 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class DatabaseTest : IAsyncLifetime
{
private readonly AppDbContext _appDbContext;
protected readonly Mock<TimeProvider> _timeProviderMock = new();
protected readonly DbContext _context;
protected readonly ILoggerFactory _loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
public DatabaseTest()
{
var options = new DbOptions { DatabaseName = $"{Guid.NewGuid()}.db" };
var context = new AppDbContext(options, _timeProviderMock.Object);
_appDbContext = context;
_context = context;
}
public virtual async Task InitializeAsync()
{
await _context.Database.MigrateAsync();
}
public virtual async Task DisposeAsync()
{
await _appDbContext.DisposeAsync();
SqliteConnection.ClearAllPools();
File.Delete(_appDbContext.DatabasePath);
}
}
@@ -0,0 +1,81 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class EfUnitOfWorkTests : DatabaseTest
{
private readonly EfUnitOfWork _uow;
private readonly SdnFaker _sdnFaker = new();
private readonly AddressFaker _addressFaker = new();
private readonly AliasFaker _aliasFaker = new();
private readonly CommentFaker _commentFaker = new();
public EfUnitOfWorkTests()
{
var logger = LoggerFactory.Create(c => c.ClearProviders());
_uow = new(_context, logger);
}
[Fact]
public async Task SaveChangesAsync_WhenCalled_ItShouldPersistChangesToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProviderMock
.Setup(m => m.GetUtcNow())
.Returns(now);
var sdn = _sdnFaker.Generate();
var address = _addressFaker.Generate();
address.SdnId = sdn.Id;
var alias = _aliasFaker.Generate();
alias.SdnId = sdn.Id;
var comment = _commentFaker.Generate();
comment.SdnId = sdn.Id;
await _uow.Sdns.Upsert(sdn);
await _uow.Addresses.Upsert(address);
await _uow.Aliases.Upsert(alias);
await _uow.Comments.Upsert(comment);
await _uow.SaveChangesAsync();
var savedSdn = await _context.Set<Sdn>()
.Include(s => s.Addresses)
.Include(s => s.Aliases)
.Include(s => s.Comments)
.FirstOrDefaultAsync();
savedSdn.Should().NotBeNull();
savedSdn.Should().BeEquivalentTo(
sdn,
opts => opts
.Excluding(s => s.Addresses)
.Excluding(s => s.Aliases)
.Excluding(s => s.Comments)
);
savedSdn!.Addresses.Should().HaveCount(1);
savedSdn.Aliases.Should().HaveCount(1);
savedSdn.Comments.Should().HaveCount(1);
var savedAddress = savedSdn.Addresses.First(a => a.Id == address.Id);
var savedAlias = savedSdn.Aliases.First(a => a.Id == alias.Id);
var savedComment = savedSdn.Comments.First(a => a.Id == comment.Id);
savedAddress.Should().BeEquivalentTo(address);
savedAlias.Should().BeEquivalentTo(alias);
savedComment.Should().BeEquivalentTo(comment);
}
[Fact]
public async Task DisposeAsync_WhenCalled_ItShouldDisposeContext()
{
await _uow.DisposeAsync();
var action = () => _context.SaveChangesAsync();
await action.Should().ThrowAsync<ObjectDisposedException>();
}
}
@@ -1,38 +1,25 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class RepositoryTest : IAsyncLifetime
public class RepositoryTest : DatabaseTest, IAsyncLifetime
{
private readonly AppDbContext _appDbContext;
private readonly SdnFaker _faker = new();
private readonly Sdn _sdn;
protected readonly Mock<TimeProvider> _timeProvider = new();
protected readonly DbContext _context;
protected int SdnId => _sdn.Id;
protected readonly ILoggerFactory _loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
public RepositoryTest()
{
var options = new DbOptions { DatabaseName = $"{Guid.NewGuid()}.db" };
var context = new AppDbContext(options, _timeProvider.Object);
_appDbContext = context;
_context = context;
_sdn = _faker.Generate();
_sdn.Id = SdnFaker.ReservedId;
}
public async Task InitializeAsync()
public override async Task InitializeAsync()
{
await _context.Database.MigrateAsync();
await base.InitializeAsync();
await _context.Set<Sdn>().AddAsync(_sdn);
}
public async Task DisposeAsync()
public override async Task DisposeAsync()
{
await _appDbContext.DisposeAsync();
SqliteConnection.ClearAllPools();
File.Delete(_appDbContext.DatabasePath);
await base.DisposeAsync();
}
}
@@ -14,7 +14,7 @@ public class SdnRepositoryTests : RepositoryTest
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
@@ -34,7 +34,7 @@ public class SdnRepositoryTests : RepositoryTest
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
@@ -49,7 +49,7 @@ public class SdnRepositoryTests : RepositoryTest
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
_timeProviderMock.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.Name = "Updated";