using ZB.MOM.WW.CBDD.Bson; using ZB.MOM.WW.CBDD.Core.Collections; using ZB.MOM.WW.CBDD.Core.Storage; using ZB.MOM.WW.CBDD.Core.Transactions; using ZB.MOM.WW.CBDD.Shared; using ZB.MOM.WW.CBDD.Shared.TestDbContext_TestDbContext_Mappers; namespace ZB.MOM.WW.CBDD.Tests; public class DocumentCollectionTests : IDisposable { private readonly string _dbPath; private readonly string _walPath; private readonly Shared.TestDbContext _db; /// /// Initializes a new instance of the class. /// public DocumentCollectionTests() { _dbPath = Path.Combine(Path.GetTempPath(), $"test_collection_{Guid.NewGuid()}.db"); _walPath = Path.Combine(Path.GetTempPath(), $"test_collection_{Guid.NewGuid()}.wal"); _db = new Shared.TestDbContext(_dbPath); } /// /// Verifies insert and find-by-id operations. /// [Fact] public void Insert_And_FindById_Works() { // Arrange var user = new User { Name = "Alice", Age = 30 }; // Act var id = _db.Users.Insert(user); _db.SaveChanges(); var found = _db.Users.FindById(id); // Assert found.ShouldNotBeNull(); found.Id.ShouldBe(id); found.Name.ShouldBe("Alice"); found.Age.ShouldBe(30); } /// /// Verifies find-by-id returns null when no document is found. /// [Fact] public void FindById_Returns_Null_When_Not_Found() { // Act var found = _db.Users.FindById(ObjectId.NewObjectId()); // Assert found.ShouldBeNull(); } /// /// Verifies find-all returns all entities. /// [Fact] public void FindAll_Returns_All_Entities() { // Arrange _db.Users.Insert(new User { Name = "Alice", Age = 30 }); _db.Users.Insert(new User { Name = "Bob", Age = 25 }); _db.Users.Insert(new User { Name = "Charlie", Age = 35 }); _db.SaveChanges(); // Act var all = _db.Users.FindAll().ToList(); // Assert all.Count.ShouldBe(3); all.ShouldContain(u => u.Name == "Alice"); all.ShouldContain(u => u.Name == "Bob"); all.ShouldContain(u => u.Name == "Charlie"); } /// /// Verifies update modifies an existing entity. /// [Fact] public void Update_Modifies_Entity() { // Arrange var user = new User { Name = "Alice", Age = 30 }; var id = _db.Users.Insert(user); _db.SaveChanges(); // Act user.Age = 31; var updated = _db.Users.Update(user); _db.SaveChanges(); // Assert updated.ShouldBeTrue(); var found = _db.Users.FindById(id); found.ShouldNotBeNull(); found.Age.ShouldBe(31); } /// /// Verifies update returns false when the entity does not exist. /// [Fact] public void Update_Returns_False_When_Not_Found() { // Arrange var user = new User { Id = ObjectId.NewObjectId(), Name = "Ghost", Age = 99 }; // Act var updated = _db.Users.Update(user); _db.SaveChanges(); // Assert updated.ShouldBeFalse(); } /// /// Verifies delete removes an entity. /// [Fact] public void Delete_Removes_Entity() { // Arrange var user = new User { Name = "Alice", Age = 30 }; var id = _db.Users.Insert(user); _db.SaveChanges(); // Act var deleted = _db.Users.Delete(id); _db.SaveChanges(); // Assert deleted.ShouldBeTrue(); _db.Users.FindById(id).ShouldBeNull(); } /// /// Verifies delete returns false when the entity does not exist. /// [Fact] public void Delete_Returns_False_When_Not_Found() { // Act var deleted = _db.Users.Delete(ObjectId.NewObjectId()); _db.SaveChanges(); // Assert deleted.ShouldBeFalse(); } /// /// Verifies count returns the correct entity count. /// [Fact] public void Count_Returns_Correct_Count() { // Arrange _db.Users.Insert(new User { Name = "Alice", Age = 30 }); _db.Users.Insert(new User { Name = "Bob", Age = 25 }); _db.SaveChanges(); // Act var count = _db.Users.Count(); // Assert count.ShouldBe(2); } /// /// Verifies predicate queries filter entities correctly. /// [Fact] public void Find_With_Predicate_Filters_Correctly() { // Arrange _db.Users.Insert(new User { Name = "Alice", Age = 30 }); _db.Users.Insert(new User { Name = "Bob", Age = 25 }); _db.Users.Insert(new User { Name = "Charlie", Age = 35 }); _db.SaveChanges(); // Act var over30 = _db.Users.Find(u => u.Age > 30).ToList(); // Assert over30.Count().ShouldBe(1); over30[0].Name.ShouldBe("Charlie"); } /// /// Verifies bulk insert stores multiple entities. /// [Fact] public void InsertBulk_Inserts_Multiple_Entities() { // Arrange var users = new[] { new User { Name = "User1", Age = 20 }, new User { Name = "User2", Age = 21 }, new User { Name = "User3", Age = 22 } }; // Act var count = _db.Users.InsertBulk(users); _db.SaveChanges(); // Assert count.Count.ShouldBe(3); _db.Users.Count().ShouldBe(3); } /// /// Verifies inserts preserve an explicitly assigned identifier. /// [Fact] public void Insert_With_SpecifiedId_RetainsId() { // Arrange var id = ObjectId.NewObjectId(); var user = new User { Id = id, Name = "SpecifiedID", Age = 40 }; // Act var insertedId = _db.Users.Insert(user); _db.SaveChanges(); // Assert insertedId.ShouldBe(id); var found = _db.Users.FindById(id); found.ShouldNotBeNull(); found.Id.ShouldBe(id); found.Name.ShouldBe("SpecifiedID"); } /// /// Releases test resources. /// public void Dispose() { _db?.Dispose(); } }