diff --git a/src/SanctionsSearch.Worker.Tests/Faker/AddressFaker.cs b/src/SanctionsSearch.Worker.Tests/Faker/AddressFaker.cs
new file mode 100644
index 0000000..fe4d43d
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Faker/AddressFaker.cs
@@ -0,0 +1,13 @@
+namespace SanctionsSearch.Worker.Tests.Faker;
+
+class AddressFaker : Faker
+{
+ public AddressFaker()
+ {
+ RuleFor(x => x.SdnId, f => f.Random.Int(1, int.MaxValue));
+ RuleFor(x => x.StreetAddress, f => f.Address.StreetAddress());
+ RuleFor(x => x.CityProvincePostal, f => $"{f.Address.City()}, {f.Address.StateAbbr()} {f.Address.ZipCode()}");
+ RuleFor(x => x.Country, f => f.Address.Country());
+ RuleFor(x => x.Remarks, f => f.Lorem.Sentence());
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Faker/AliasFaker.cs b/src/SanctionsSearch.Worker.Tests/Faker/AliasFaker.cs
new file mode 100644
index 0000000..85ade4c
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Faker/AliasFaker.cs
@@ -0,0 +1,12 @@
+namespace SanctionsSearch.Worker.Tests.Faker;
+
+class AliasFaker : Faker
+{
+ public AliasFaker()
+ {
+ RuleFor(x => x.SdnId, f => f.Random.Int(1, int.MaxValue));
+ RuleFor(x => x.Type, f => f.Lorem.Word());
+ RuleFor(x => x.Name, f => f.Person.FullName);
+ RuleFor(x => x.Remarks, f => f.Lorem.Sentence());
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Faker/CommentFaker.cs b/src/SanctionsSearch.Worker.Tests/Faker/CommentFaker.cs
new file mode 100644
index 0000000..1e2248c
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Faker/CommentFaker.cs
@@ -0,0 +1,10 @@
+namespace SanctionsSearch.Worker.Tests.Faker;
+
+class CommentFaker : Faker
+{
+ public CommentFaker()
+ {
+ RuleFor(x => x.SdnId, f => f.Random.Int(1, int.MaxValue));
+ RuleFor(x => x.Remarks, f => f.Lorem.Sentence());
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Integration/AddressRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Integration/AddressRepositoryTests.cs
new file mode 100644
index 0000000..1439c8b
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Integration/AddressRepositoryTests.cs
@@ -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(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().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().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().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);
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Integration/AliasRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Integration/AliasRepositoryTests.cs
new file mode 100644
index 0000000..c419fe7
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Integration/AliasRepositoryTests.cs
@@ -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(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().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().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().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);
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Integration/CommentRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Integration/CommentRepositoryTests.cs
new file mode 100644
index 0000000..6745411
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Integration/CommentRepositoryTests.cs
@@ -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(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().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().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().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);
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Integration/RepositoryTest.cs b/src/SanctionsSearch.Worker.Tests/Integration/RepositoryTest.cs
new file mode 100644
index 0000000..be0aa1d
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Integration/RepositoryTest.cs
@@ -0,0 +1,31 @@
+namespace SanctionsSearch.Worker.Tests.Integration;
+
+public class RepositoryTest : IAsyncLifetime
+{
+ private readonly AppDbContext _appDbContext;
+ protected readonly Mock _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);
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Integration/SdnRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Integration/SdnRepositoryTests.cs
index 70e2957..0a4d921 100644
--- a/src/SanctionsSearch.Worker.Tests/Integration/SdnRepositoryTests.cs
+++ b/src/SanctionsSearch.Worker.Tests/Integration/SdnRepositoryTests.cs
@@ -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 = 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(loggerFactory));
+ _repository = new SdnRepository(_context, new Logger(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().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().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().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);
- }
}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Unit/AddressRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Unit/AddressRepositoryTests.cs
new file mode 100644
index 0000000..8cb4941
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Unit/AddressRepositoryTests.cs
@@ -0,0 +1,63 @@
+namespace SanctionsSearch.Worker.Tests.Unit;
+
+public class AddressRepositoryTests
+{
+ private readonly Mock _context = new();
+ private readonly Mock> _logger = new();
+ private readonly AddressFaker _faker = new();
+ private readonly AddressRepository _repository;
+
+ public AddressRepositoryTests()
+ {
+ _repository = new AddressRepository(_context.Object, _logger.Object);
+ }
+
+ [Fact]
+ public async Task Upsert_WhenExceptionIsThrown_ItShouldLogError()
+ {
+ var entity = _faker.Generate();
+ var mockSet = new Mock>();
+
+ mockSet
+ .Setup(x => x.FindAsync(entity.Id))
+ .Throws();
+
+ _context
+ .Setup(x => x.Set())
+ .Returns(mockSet.Object);
+
+ await _repository.Upsert(entity);
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+
+ [Fact]
+ public async Task Find_WhenExceptionIsThrown_ItShouldReturnEmptyListAndLogError()
+ {
+ _context
+ .Setup(x => x.Set())
+ .Throws();
+
+ var result = await _repository.Find(x => x.Id == 1);
+
+ result.Should().BeEmpty();
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Unit/AliasRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Unit/AliasRepositoryTests.cs
new file mode 100644
index 0000000..294e8bb
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Unit/AliasRepositoryTests.cs
@@ -0,0 +1,63 @@
+namespace SanctionsSearch.Worker.Tests.Unit;
+
+public class AliasRepositoryTests
+{
+ private readonly Mock _context = new();
+ private readonly Mock> _logger = new();
+ private readonly AliasFaker _faker = new();
+ private readonly AliasRepository _repository;
+
+ public AliasRepositoryTests()
+ {
+ _repository = new AliasRepository(_context.Object, _logger.Object);
+ }
+
+ [Fact]
+ public async Task Upsert_WhenExceptionIsThrown_ItShouldLogError()
+ {
+ var entity = _faker.Generate();
+ var mockSet = new Mock>();
+
+ mockSet
+ .Setup(x => x.FindAsync(entity.Id))
+ .Throws();
+
+ _context
+ .Setup(x => x.Set())
+ .Returns(mockSet.Object);
+
+ await _repository.Upsert(entity);
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+
+ [Fact]
+ public async Task Find_WhenExceptionIsThrown_ItShouldReturnEmptyListAndLogError()
+ {
+ _context
+ .Setup(x => x.Set())
+ .Throws();
+
+ var result = await _repository.Find(x => x.Id == 1);
+
+ result.Should().BeEmpty();
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Unit/CommentRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Unit/CommentRepositoryTests.cs
new file mode 100644
index 0000000..daaa826
--- /dev/null
+++ b/src/SanctionsSearch.Worker.Tests/Unit/CommentRepositoryTests.cs
@@ -0,0 +1,63 @@
+namespace SanctionsSearch.Worker.Tests.Unit;
+
+public class CommentRepositoryTests
+{
+ private readonly Mock _context = new();
+ private readonly Mock> _logger = new();
+ private readonly CommentFaker _faker = new();
+ private readonly CommentRepository _repository;
+
+ public CommentRepositoryTests()
+ {
+ _repository = new CommentRepository(_context.Object, _logger.Object);
+ }
+
+ [Fact]
+ public async Task Upsert_WhenExceptionIsThrown_ItShouldLogError()
+ {
+ var entity = _faker.Generate();
+ var mockSet = new Mock>();
+
+ mockSet
+ .Setup(x => x.FindAsync(entity.Id))
+ .Throws();
+
+ _context
+ .Setup(x => x.Set())
+ .Returns(mockSet.Object);
+
+ await _repository.Upsert(entity);
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+
+ [Fact]
+ public async Task Find_WhenExceptionIsThrown_ItShouldReturnEmptyListAndLogError()
+ {
+ _context
+ .Setup(x => x.Set())
+ .Throws();
+
+ var result = await _repository.Find(x => x.Id == 1);
+
+ result.Should().BeEmpty();
+
+ _logger.Verify(
+ x => x.Log(
+ LogLevel.Error,
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny(),
+ It.IsAny>()
+ )
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker.Tests/Unit/SdnRepositoryTests.cs b/src/SanctionsSearch.Worker.Tests/Unit/SdnRepositoryTests.cs
index dc1abc2..0bb3496 100644
--- a/src/SanctionsSearch.Worker.Tests/Unit/SdnRepositoryTests.cs
+++ b/src/SanctionsSearch.Worker.Tests/Unit/SdnRepositoryTests.cs
@@ -4,29 +4,29 @@ public class SdnRepositoryTests
{
private readonly Mock _context = new();
private readonly Mock> _logger = new();
- private readonly SdnFaker _sdnFaker = new();
- private readonly SdnRepository _sdnRepository;
+ private readonly SdnFaker _faker = new();
+ private readonly SdnRepository _repository;
public SdnRepositoryTests()
{
- _sdnRepository = new SdnRepository(_context.Object, _logger.Object);
+ _repository = new SdnRepository(_context.Object, _logger.Object);
}
[Fact]
public async Task Upsert_WhenExceptionIsThrown_ItShouldLogError()
{
- var sdn = _sdnFaker.Generate();
+ var entity = _faker.Generate();
var mockSet = new Mock>();
mockSet
- .Setup(x => x.FindAsync(sdn.Id))
+ .Setup(x => x.FindAsync(entity.Id))
.Throws();
_context
.Setup(x => x.Set())
.Returns(mockSet.Object);
- await _sdnRepository.Upsert(sdn);
+ await _repository.Upsert(entity);
_logger.Verify(
x => x.Log(
@@ -46,7 +46,7 @@ public class SdnRepositoryTests
.Setup(x => x.Set())
.Throws();
- var result = await _sdnRepository.Find(x => x.Id == 1);
+ var result = await _repository.Find(x => x.Id == 1);
result.Should().BeEmpty();
diff --git a/src/SanctionsSearch.Worker/Interfaces/IAddressRepository.cs b/src/SanctionsSearch.Worker/Interfaces/IAddressRepository.cs
new file mode 100644
index 0000000..a025acc
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Interfaces/IAddressRepository.cs
@@ -0,0 +1,5 @@
+namespace SanctionsSearch.Worker.Interfaces;
+
+interface IAddressRepository : IRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Interfaces/IAliasRepository.cs b/src/SanctionsSearch.Worker/Interfaces/IAliasRepository.cs
new file mode 100644
index 0000000..63c8e41
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Interfaces/IAliasRepository.cs
@@ -0,0 +1,5 @@
+namespace SanctionsSearch.Worker.Interfaces;
+
+interface IAliasRepository : IRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Interfaces/ICommentRepository.cs b/src/SanctionsSearch.Worker/Interfaces/ICommentRepository.cs
new file mode 100644
index 0000000..a4d85cb
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Interfaces/ICommentRepository.cs
@@ -0,0 +1,5 @@
+namespace SanctionsSearch.Worker.Interfaces;
+
+interface ICommentRepository : IRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Interfaces/IUnitOfWork.cs b/src/SanctionsSearch.Worker/Interfaces/IUnitOfWork.cs
index 6a34797..e8b3fe8 100644
--- a/src/SanctionsSearch.Worker/Interfaces/IUnitOfWork.cs
+++ b/src/SanctionsSearch.Worker/Interfaces/IUnitOfWork.cs
@@ -3,5 +3,8 @@ namespace SanctionsSearch.Worker.Interfaces;
interface IUnitOfWork
{
ISdnRepository Sdns { get; }
+ IAddressRepository Addresses { get; }
+ IAliasRepository Aliases { get; }
+ ICommentRepository Comments { get; }
Task SaveChangesAsync();
}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Persistence/AddressRepository.cs b/src/SanctionsSearch.Worker/Persistence/AddressRepository.cs
new file mode 100644
index 0000000..04b71e9
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Persistence/AddressRepository.cs
@@ -0,0 +1,8 @@
+namespace SanctionsSearch.Worker.Persistence;
+
+class AddressRepository(
+ DbContext dbContext,
+ ILogger logger
+) : EfRepository(dbContext, logger), IAddressRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Persistence/AliasRepository.cs b/src/SanctionsSearch.Worker/Persistence/AliasRepository.cs
new file mode 100644
index 0000000..3b1a8bf
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Persistence/AliasRepository.cs
@@ -0,0 +1,8 @@
+namespace SanctionsSearch.Worker.Persistence;
+
+class AliasRepository(
+ DbContext dbContext,
+ ILogger logger
+) : EfRepository(dbContext, logger), IAliasRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Persistence/CommentRepository.cs b/src/SanctionsSearch.Worker/Persistence/CommentRepository.cs
new file mode 100644
index 0000000..fe10768
--- /dev/null
+++ b/src/SanctionsSearch.Worker/Persistence/CommentRepository.cs
@@ -0,0 +1,8 @@
+namespace SanctionsSearch.Worker.Persistence;
+
+class CommentRepository(
+ DbContext dbContext,
+ ILogger logger
+) : EfRepository(dbContext, logger), ICommentRepository
+{
+}
\ No newline at end of file
diff --git a/src/SanctionsSearch.Worker/Persistence/EfUnitOfWork.cs b/src/SanctionsSearch.Worker/Persistence/EfUnitOfWork.cs
index 9c372f4..8cb60b8 100644
--- a/src/SanctionsSearch.Worker/Persistence/EfUnitOfWork.cs
+++ b/src/SanctionsSearch.Worker/Persistence/EfUnitOfWork.cs
@@ -4,6 +4,9 @@ class EfUnitOfWork(AppDbContext context, ILoggerFactory loggerFactory) : IUnitOf
{
private readonly AppDbContext _context = context;
public ISdnRepository Sdns { get; } = new SdnRepository(context, loggerFactory.CreateLogger());
+ public IAddressRepository Addresses { get; } = new AddressRepository(context, loggerFactory.CreateLogger());
+ public IAliasRepository Aliases { get; } = new AliasRepository(context, loggerFactory.CreateLogger());
+ public ICommentRepository Comments { get; } = new CommentRepository(context, loggerFactory.CreateLogger());
public async Task SaveChangesAsync()
{
diff --git a/src/SanctionsSearch.Worker/Program.cs b/src/SanctionsSearch.Worker/Program.cs
index cda5156..2a57a86 100644
--- a/src/SanctionsSearch.Worker/Program.cs
+++ b/src/SanctionsSearch.Worker/Program.cs
@@ -63,7 +63,15 @@ class Program
builder.Services.AddScoped(rs => rs.GetRequiredService>().Value);
builder.Services.AddSingleton(TimeProvider.System);
+ builder.Services.AddScoped();
+
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
builder.Services.AddDbContext();
+
builder.Services.AddHostedService();
return builder;