feat: add additional repository

This commit is contained in:
Stevan Freeborn
2024-08-22 16:04:41 -05:00
parent 88c8babe09
commit 0aa58c5b1a
21 changed files with 596 additions and 49 deletions
@@ -0,0 +1,86 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class AddressRepositoryTests : RepositoryTest
{
private readonly AddressRepository _repository;
private readonly AddressFaker _faker = new();
public AddressRepositoryTests()
{
var loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
_repository = new(_context, new Logger<AddressRepository>(loggerFactory));
}
[Fact]
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
var result = await _context.Set<Address>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().Be(now.DateTime);
result.UpdatedAt.Should().Be(now.DateTime);
}
[Fact]
public async Task Upsert_WithExistingEntity_ShouldUpdateEntityInDatabase()
{
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
// Insert the entity
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was created
var createdEntity = await _context.Set<Address>().FindAsync(entity.Id);
createdEntity.Should().BeEquivalentTo(entity);
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.StreetAddress = "Updated";
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was updated
var result = await _context.Set<Address>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().BeSameDateAs(createdTimeStamp.DateTime);
result.UpdatedAt.Should().BeSameDateAs(updatedTimeStamp.DateTime);
}
[Fact]
public async Task Find_WithPredicate_ShouldReturnEntitiesMatchingPredicate()
{
var entities = _faker.Generate(3);
foreach (var entity in entities)
{
await _repository.Upsert(entity);
}
await _context.SaveChangesAsync();
var target = entities[0];
var result = await _repository.Find(x => x.Id == target.Id);
result.Should().HaveCount(1);
result.First().Should().BeEquivalentTo(target);
}
}
@@ -0,0 +1,86 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class AliasRepositoryTests : RepositoryTest
{
private readonly AliasRepository _repository;
private readonly AliasFaker _faker = new();
public AliasRepositoryTests()
{
var loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
_repository = new(_context, new Logger<AliasRepository>(loggerFactory));
}
[Fact]
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
var result = await _context.Set<Alias>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().Be(now.DateTime);
result.UpdatedAt.Should().Be(now.DateTime);
}
[Fact]
public async Task Upsert_WithExistingEntity_ShouldUpdateEntityInDatabase()
{
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
// Insert the entity
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was created
var createdEntity = await _context.Set<Alias>().FindAsync(entity.Id);
createdEntity.Should().BeEquivalentTo(entity);
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.Remarks = "Updated";
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was updated
var result = await _context.Set<Alias>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().BeSameDateAs(createdTimeStamp.DateTime);
result.UpdatedAt.Should().BeSameDateAs(updatedTimeStamp.DateTime);
}
[Fact]
public async Task Find_WithPredicate_ShouldReturnEntitiesMatchingPredicate()
{
var entities = _faker.Generate(3);
foreach (var entity in entities)
{
await _repository.Upsert(entity);
}
await _context.SaveChangesAsync();
var target = entities[0];
var result = await _repository.Find(x => x.Id == target.Id);
result.Should().HaveCount(1);
result.First().Should().BeEquivalentTo(target);
}
}
@@ -0,0 +1,86 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class CommentRepositoryTests : RepositoryTest
{
private readonly CommentRepository _repository;
private readonly CommentFaker _faker = new();
public CommentRepositoryTests()
{
var loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
_repository = new(_context, new Logger<CommentRepository>(loggerFactory));
}
[Fact]
public async Task Upsert_WithNewEntity_ShouldAddEntityToDatabase()
{
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
var entity = _faker.Generate();
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
var result = await _context.Set<Comment>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().Be(now.DateTime);
result.UpdatedAt.Should().Be(now.DateTime);
}
[Fact]
public async Task Upsert_WithExistingEntity_ShouldUpdateEntityInDatabase()
{
var createdTimeStamp = DateTimeOffset.UtcNow;
var updatedTimeStamp = createdTimeStamp.AddSeconds(2);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var entity = _faker.Generate();
// Insert the entity
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was created
var createdEntity = await _context.Set<Comment>().FindAsync(entity.Id);
createdEntity.Should().BeEquivalentTo(entity);
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
entity.Remarks = "Updated";
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was updated
var result = await _context.Set<Comment>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().BeSameDateAs(createdTimeStamp.DateTime);
result.UpdatedAt.Should().BeSameDateAs(updatedTimeStamp.DateTime);
}
[Fact]
public async Task Find_WithPredicate_ShouldReturnEntitiesMatchingPredicate()
{
var entities = _faker.Generate(3);
foreach (var entity in entities)
{
await _repository.Upsert(entity);
}
await _context.SaveChangesAsync();
var target = entities[0];
var result = await _repository.Find(x => x.Id == target.Id);
result.Should().HaveCount(1);
result.First().Should().BeEquivalentTo(target);
}
}
@@ -0,0 +1,31 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class RepositoryTest : IAsyncLifetime
{
private readonly AppDbContext _appDbContext;
protected readonly Mock<TimeProvider> _timeProvider = new();
protected readonly DbContext _context;
public RepositoryTest()
{
var options = new DbOptions { DatabaseName = $"{Guid.NewGuid()}.db" };
var context = new AppDbContext(options, _timeProvider.Object);
_appDbContext = context;
_context = context;
}
public async Task InitializeAsync()
{
await _context.Database.MigrateAsync();
}
public async Task DisposeAsync()
{
await _appDbContext.DisposeAsync();
SqliteConnection.ClearAllPools();
File.Delete(_appDbContext.DatabasePath);
}
}
@@ -1,19 +1,14 @@
namespace SanctionsSearch.Worker.Tests.Integration;
public class SdnRepositoryTests : IAsyncLifetime
public class SdnRepositoryTests : RepositoryTest
{
private readonly AppDbContext _context;
private readonly SdnRepository _sdnRepository;
private readonly SdnFaker _sdnFaker = new();
private readonly Mock<TimeProvider> _timeProvider = new();
private readonly SdnRepository _repository;
private readonly SdnFaker _faker = new();
public SdnRepositoryTests()
{
var loggerFactory = LoggerFactory.Create(builder => builder.ClearProviders());
var options = new DbOptions { DatabaseName = $"{Guid.NewGuid()}.db" };
_context = new AppDbContext(options, _timeProvider.Object);
_sdnRepository = new SdnRepository(_context, new Logger<SdnRepository>(loggerFactory));
_repository = new SdnRepository(_context, new Logger<SdnRepository>(loggerFactory));
}
[Fact]
@@ -22,14 +17,14 @@ public class SdnRepositoryTests : IAsyncLifetime
var now = DateTimeOffset.UtcNow;
_timeProvider.Setup(x => x.GetUtcNow()).Returns(now);
var sdn = _sdnFaker.Generate();
var entity = _faker.Generate();
await _sdnRepository.Upsert(sdn);
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
var result = await _context.Sdns.FindAsync(sdn.Id);
var result = await _context.Set<Sdn>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(sdn);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().Be(now.DateTime);
result.UpdatedAt.Should().Be(now.DateTime);
}
@@ -42,30 +37,30 @@ public class SdnRepositoryTests : IAsyncLifetime
_timeProvider.Setup(x => x.GetUtcNow()).Returns(createdTimeStamp);
var sdn = _sdnFaker.Generate();
var entity = _faker.Generate();
// Insert the entity
await _sdnRepository.Upsert(sdn);
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was created
var createdSdn = await _context.Sdns.FindAsync(sdn.Id);
var createdEntity = await _context.Set<Sdn>().FindAsync(entity.Id);
createdSdn.Should().BeEquivalentTo(sdn);
createdSdn!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdSdn.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.Should().BeEquivalentTo(entity);
createdEntity!.CreatedAt.Should().Be(createdTimeStamp.DateTime);
createdEntity.UpdatedAt.Should().Be(createdTimeStamp.DateTime);
_timeProvider.Setup(x => x.GetUtcNow()).Returns(updatedTimeStamp);
// Update the entity
sdn.Name = "Updated";
await _sdnRepository.Upsert(sdn);
entity.Name = "Updated";
await _repository.Upsert(entity);
await _context.SaveChangesAsync();
// Assert the entity was updated
var result = await _context.Sdns.FindAsync(sdn.Id);
var result = await _context.Set<Sdn>().FindAsync(entity.Id);
result.Should().BeEquivalentTo(sdn);
result.Should().BeEquivalentTo(entity);
result!.CreatedAt.Should().BeSameDateAs(createdTimeStamp.DateTime);
result.UpdatedAt.Should().BeSameDateAs(updatedTimeStamp.DateTime);
}
@@ -73,33 +68,19 @@ public class SdnRepositoryTests : IAsyncLifetime
[Fact]
public async Task Find_WithPredicate_ShouldReturnEntitiesMatchingPredicate()
{
var sdns = _sdnFaker.Generate(3);
var entities = _faker.Generate(3);
foreach (var sdn in sdns)
foreach (var entity in entities)
{
await _sdnRepository.Upsert(sdn);
await _repository.Upsert(entity);
}
await _context.SaveChangesAsync();
var target = sdns[0];
var result = await _sdnRepository.Find(x => x.Id == target.Id);
var target = entities[0];
var result = await _repository.Find(x => x.Id == target.Id);
result.Should().HaveCount(1);
result.First().Should().BeEquivalentTo(target);
}
public async Task InitializeAsync()
{
await _context.Database.MigrateAsync();
}
public async Task DisposeAsync()
{
await _context.DisposeAsync();
SqliteConnection.ClearAllPools();
File.Delete(_context.DatabasePath);
}
}