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; using Xunit; namespace ZB.MOM.WW.CBDD.Tests; public class DocumentCollectionDeleteTests : IDisposable { private readonly string _dbPath; private readonly string _walPath; private readonly Shared.TestDbContext _dbContext; /// /// Initializes a new instance of the class. /// public DocumentCollectionDeleteTests() { _dbPath = Path.Combine(Path.GetTempPath(), $"test_delete_{Guid.NewGuid()}.db"); _walPath = Path.Combine(Path.GetTempPath(), $"test_delete_{Guid.NewGuid()}.wal"); _dbContext = new Shared.TestDbContext(_dbPath); } /// /// Releases test resources. /// public void Dispose() { _dbContext.Dispose(); } /// /// Verifies delete removes both the document and its index entry. /// [Fact] public void Delete_RemovesDocumentAndIndexEntry() { var user = new User { Id = ObjectId.NewObjectId(), Name = "To Delete", Age = 10 }; _dbContext.Users.Insert(user); _dbContext.SaveChanges(); // Verify inserted _dbContext.Users.FindById(user.Id).ShouldNotBeNull(); // Delete var deleted = _dbContext.Users.Delete(user.Id); _dbContext.SaveChanges(); // Assert deleted.ShouldBeTrue("Delete returned false"); // Verify deleted from storage _dbContext.Users.FindById(user.Id).ShouldBeNull(); // Verify Index is clean (FindAll uses index scan) var all = _dbContext.Users.FindAll(); all.ShouldBeEmpty(); } /// /// Verifies delete returns false for a non-existent document. /// [Fact] public void Delete_NonExistent_ReturnsFalse() { var id = ObjectId.NewObjectId(); var deleted = _dbContext.Users.Delete(id); _dbContext.SaveChanges(); deleted.ShouldBeFalse(); } /// /// Verifies deletes inside a transaction commit successfully. /// [Fact] public void Delete_WithTransaction_CommitsSuccessfully() { var user = new User { Id = ObjectId.NewObjectId(), Name = "Txn Delete", Age = 20 }; _dbContext.Users.Insert(user); _dbContext.SaveChanges(); using (var txn = _dbContext.BeginTransaction()) { _dbContext.Users.Delete(user.Id); _dbContext.SaveChanges(); } // Verify _dbContext.Users.FindById(user.Id).ShouldBeNull(); } }