diff --git a/DigitalData.Core.Abstractions/DigitalData.Core.Abstractions.csproj b/DigitalData.Core.Abstractions/DigitalData.Core.Abstractions.csproj
index 57b7f71..cdb3a9c 100644
--- a/DigitalData.Core.Abstractions/DigitalData.Core.Abstractions.csproj
+++ b/DigitalData.Core.Abstractions/DigitalData.Core.Abstractions.csproj
@@ -54,15 +54,15 @@
-
-
-
+
+
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/Abstractions/FactoryTests.cs b/DigitalData.Core.Tests/Abstractions/FactoryTests.cs
new file mode 100644
index 0000000..8f9ea16
--- /dev/null
+++ b/DigitalData.Core.Tests/Abstractions/FactoryTests.cs
@@ -0,0 +1,173 @@
+using Microsoft.Extensions.DependencyInjection;
+using DigitalData.Core.Abstractions;
+
+namespace DigitalData.Core.Tests.Abstractions
+{
+ [TestFixture]
+ public class FactoryTests
+ {
+ private Factory _factory;
+
+ [SetUp]
+ public void Setup()
+ {
+ _factory = new Factory();
+ }
+
+ [Test]
+ public void Add_ServiceDescriptor_ShouldIncreaseCount()
+ {
+ // Arrange
+ var descriptor = ServiceDescriptor.Singleton(typeof(string), "test");
+
+ // Act
+ _factory.Add(descriptor);
+
+ // Assert
+ Assert.That(_factory.Count, Is.EqualTo(1));
+ Assert.That(_factory.Contains(descriptor), Is.True);
+ }
+
+ [Test]
+ public void Clear_ShouldRemoveAllServices()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "test"));
+ _factory.Add(ServiceDescriptor.Singleton(typeof(int), 42));
+
+ // Act
+ _factory.Clear();
+
+ // Assert
+ Assert.That(_factory.Count, Is.EqualTo(0));
+ }
+
+ [Test]
+ public void GetService_ShouldReturnRegisteredInstance()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "Hello World"));
+
+ // Act
+ var result = _factory.GetService(typeof(string));
+
+ // Assert
+ Assert.That(result, Is.EqualTo("Hello World"));
+ }
+
+ [Test]
+ public void GetService_UnregisteredType_ShouldReturnNull()
+ {
+ // Act
+ var result = _factory.GetService(typeof(int));
+
+ // Assert
+ Assert.That(result, Is.Null);
+ }
+
+ [Test]
+ public void ModifyAfterBuild_ShouldThrowInvalidOperationException()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "x"));
+ var _ = _factory.GetService(typeof(string)); // trigger build
+
+ // Act & Assert
+ Assert.Throws(() => _factory.Add(ServiceDescriptor.Singleton(typeof(int), 1)));
+ }
+
+ [Test]
+ public void Remove_ShouldWorkBeforeBuild()
+ {
+ // Arrange
+ var descriptor = ServiceDescriptor.Singleton(typeof(string), "Test");
+ _factory.Add(descriptor);
+
+ // Act
+ var removed = _factory.Remove(descriptor);
+
+ // Assert
+ Assert.That(removed, Is.True);
+ Assert.That(_factory.Count, Is.EqualTo(0));
+ }
+
+ [Test]
+ public void Insert_ShouldInsertAtCorrectIndex()
+ {
+ // Arrange
+ var d1 = ServiceDescriptor.Singleton(typeof(string), "A");
+ var d2 = ServiceDescriptor.Singleton(typeof(int), 1);
+
+ _factory.Add(d1);
+ _factory.Insert(0, d2);
+
+ // Act
+ var first = _factory[0];
+
+ // Assert
+ Assert.That(first.ServiceType, Is.EqualTo(typeof(int)));
+ }
+
+ [Test]
+ public void Enumerator_ShouldIterateOverServices()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "a"));
+ _factory.Add(ServiceDescriptor.Singleton(typeof(int), 5));
+
+ // Act
+ var list = _factory.ToList();
+
+ // Assert
+ Assert.That(list.Count, Is.EqualTo(2));
+ Assert.That(list.Any(sd => sd.ServiceType == typeof(string)), Is.True);
+ Assert.That(list.Any(sd => sd.ServiceType == typeof(int)), Is.True);
+ }
+
+ [Test]
+ public void CopyTo_ShouldCopyElements()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "x"));
+ _factory.Add(ServiceDescriptor.Singleton(typeof(int), 10));
+ var array = new ServiceDescriptor[2];
+
+ // Act
+ _factory.CopyTo(array, 0);
+
+ // Assert
+ Assert.That(array[0].ServiceType, Is.EqualTo(typeof(string)));
+ Assert.That(array[1].ServiceType, Is.EqualTo(typeof(int)));
+ }
+
+ [Test]
+ public void RemoveAt_ShouldRemoveItemAtIndex()
+ {
+ // Arrange
+ _factory.Add(ServiceDescriptor.Singleton(typeof(string), "x"));
+ _factory.Add(ServiceDescriptor.Singleton(typeof(int), 5));
+
+ // Act
+ _factory.RemoveAt(0);
+
+ // Assert
+ Assert.That(_factory.Count, Is.EqualTo(1));
+ Assert.That(_factory[0].ServiceType, Is.EqualTo(typeof(int)));
+ }
+
+ [Test]
+ public void Indexer_Set_ShouldReplaceItem()
+ {
+ // Arrange
+ var original = ServiceDescriptor.Singleton(typeof(string), "A");
+ var replacement = ServiceDescriptor.Singleton(typeof(string), "B");
+ _factory.Add(original);
+
+ // Act
+ _factory[0] = replacement;
+
+ // Assert
+ Assert.That(_factory[0], Is.EqualTo(replacement));
+ }
+ }
+}
diff --git a/DigitalData.Core.Tests/Infrastructure/DbRepositoryTests.cs b/DigitalData.Core.Tests/Infrastructure/DbRepositoryTests.cs
deleted file mode 100644
index 99149a1..0000000
--- a/DigitalData.Core.Tests/Infrastructure/DbRepositoryTests.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using DigitalData.Core.Tests.Mock;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using System.Reflection;
-using DigitalData.Core.Abstraction.Application.Repository;
-using DigitalData.Core.Infrastructure;
-
-namespace DigitalData.Core.Tests.Infrastructure;
-
-public class DbRepositoryTests
-{
- private IHost _host;
-
- private IRepository Repo;
-
- [SetUp]
- public void Setup()
- {
- var builder = Host.CreateApplicationBuilder();
-
- builder.Services.AddDbContext(opt => opt.UseInMemoryDatabase("MockDB"));
-
- builder.Services.AddDbRepository(opt =>
- {
- opt.RegisterFromAssembly(typeof(User).Assembly);
- });
-
- builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly());
-
- _host = builder.Build();
-
- Repo = _host.Services.GetRequiredService();
- }
-
- [TearDown]
- public void TearDown()
- {
- if (_host is IDisposable disposableHost)
- disposableHost.Dispose();
- }
-
- [TestCase(true, TestName = "WhenGivenMultipleUsers")]
- [TestCase(false, TestName = "WhenGivenSingleUser")]
- public void CreateAsync_ShouldNotThrow(bool multiple)
- {
- // Arrange
- var faker = Fake.CreateUserFaker();
-
- // Act & Assert
- if (multiple)
- Assert.DoesNotThrowAsync(async () => await Repo.CreateAsync(faker.Generate(Random.Shared.Next(1, 10))));
- else
- Assert.DoesNotThrowAsync(async () => await Repo.CreateAsync(faker.Generate()));
- }
-
- [TestCase(true, TestName = "WhenDtoUsed")]
- [TestCase(false, TestName = "WhenEntityUsed")]
- public async Task ReadAsync_ShouldReturnCreated(bool useDto)
- {
- // Act
- var createdUser = useDto
- ? await Repo.CreateAsync(Fake.UserCreateDto)
- : await Repo.CreateAsync(Fake.User);
-
- var readUser = await Repo.Where(u => u.Id == createdUser.Id).FirstOrDefaultAsync();
-
- // Assert
- Assert.Multiple(() =>
- {
- Assert.That(readUser, Is.Not.Null);
- Assert.That(readUser, Is.EqualTo(createdUser));
- });
- }
-
- [Test]
- public async Task ReadAsync_ShouldReturnUpdated()
- {
- // Arrange
- var createdUser = await Repo.CreateAsync(Fake.UserCreateDto);
- var userUpdateDto = new UserUpdateDto() { Age = 10, Email = "Bar", FirstName = "Foo" };
-
- // Act
- await Repo.UpdateAsync(userUpdateDto, u => u.Id == createdUser!.Id);
- var upToDateUser = await Repo.Where(u => u.Id == createdUser!.Id).FirstOrDefaultAsync();
-
- // Assert
- Assert.Multiple(() =>
- {
- Assert.That(upToDateUser, Is.Not.Null);
- Assert.That(upToDateUser?.FirstName, Is.EqualTo(userUpdateDto.FirstName));
- Assert.That(upToDateUser?.Email, Is.EqualTo(userUpdateDto.Email));
- Assert.That(upToDateUser?.Age, Is.EqualTo(userUpdateDto.Age));
- });
- }
-
- [Test]
- public async Task ReadAsync_ShouldNotReturnDeleted()
- {
- // Arrange
- var createdUser = await Repo.CreateAsync(Fake.UserCreateDto);
- var readUser = await Repo.Where(u => u.Id == createdUser.Id).FirstOrDefaultAsync();
-
- // Act
- await Repo.DeleteAsync(u => u.Id == createdUser.Id);
- var deletedUser = await Repo.Where(u => u.Id == createdUser.Id).FirstOrDefaultAsync();
-
- // Assert
- Assert.Multiple(() =>
- {
- Assert.That(readUser, Is.Not.Null);
- Assert.That(deletedUser, Is.Null);
- });
- }
-}
diff --git a/DigitalData.Core.Tests/Mock/User.cs b/DigitalData.Core.Tests/Mock/User.cs
index cb65892..0779fec 100644
--- a/DigitalData.Core.Tests/Mock/User.cs
+++ b/DigitalData.Core.Tests/Mock/User.cs
@@ -1,4 +1,4 @@
-using DigitalData.Core.Abstraction.Application.Repository;
+using DigitalData.Core.Abstractions.Interfaces;
using System.ComponentModel.DataAnnotations.Schema;
namespace DigitalData.Core.Tests.Mock;
@@ -13,4 +13,4 @@ public class User : UserBase, IEntity
public override bool Equals(object? obj)
=> (obj is User user && user.GetHashCode() == GetHashCode())
|| (obj is UserBase userBase && userBase.GetHashCode() == base.GetHashCode());
-}
+}
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/Mock/UserCreateDto.cs b/DigitalData.Core.Tests/Mock/UserCreateDto.cs
index 831638c..53ad14c 100644
--- a/DigitalData.Core.Tests/Mock/UserCreateDto.cs
+++ b/DigitalData.Core.Tests/Mock/UserCreateDto.cs
@@ -1,7 +1,7 @@
-using DigitalData.Core.Abstraction.Application.Repository;
+using DigitalData.Core.Abstractions.Interfaces;
namespace DigitalData.Core.Tests.Mock;
public class UserCreateDto : UserBase, IDto
{
-}
+}
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/Mock/UserReadDto.cs b/DigitalData.Core.Tests/Mock/UserReadDto.cs
index 424e440..5e3a059 100644
--- a/DigitalData.Core.Tests/Mock/UserReadDto.cs
+++ b/DigitalData.Core.Tests/Mock/UserReadDto.cs
@@ -1,7 +1,7 @@
-using DigitalData.Core.Abstraction.Application.Repository;
+using DigitalData.Core.Abstractions.Interfaces;
namespace DigitalData.Core.Tests.Mock;
public class UserReadDto : UserBase, IDto
{
-}
+}
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/Mock/UserUpdateDto.cs b/DigitalData.Core.Tests/Mock/UserUpdateDto.cs
index c0c3c7b..245453f 100644
--- a/DigitalData.Core.Tests/Mock/UserUpdateDto.cs
+++ b/DigitalData.Core.Tests/Mock/UserUpdateDto.cs
@@ -1,7 +1,7 @@
-using DigitalData.Core.Abstraction.Application.Repository;
+using DigitalData.Core.Abstractions.Interfaces;
namespace DigitalData.Core.Tests.Mock;
public class UserUpdateDto : UserBase, IDto
{
-}
+}
\ No newline at end of file