namespace Centron.Tests.BL.Warehousing.StockManagement; using System.Linq; using Centron.BusinessLogic.Warehousing.StockManagement; using Centron.DAO; using Centron.DAO.Mappings.Storage; using Centron.DAO.Mappings.Warehousing.StockManagement; using Centron.Data.Entities.Storage; using Centron.Data.Entities.Warehousing.StockManagement; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using JetBrains.Annotations; using NHibernate; using NHibernate.Tool.hbm2ddl; using Xunit; /// /// Integration tests for the StoragePlaceBL class. /// These tests verify the behavior of storage place operations, particularly the cascading delete functionality. /// [TestSubject(typeof(StoragePlaceBL))] public class StoragePlaceBLTest { [Fact] public void SaveOrUpdateStoragePlace_CascadesDeleteToStorageAreas_WhenStateIsZero() { // Arrange using var session = CreateSession(); var daoSession = new DAOSession(session); // Create a storage place var storagePlace = new StoragePlace { Name = "TestPlace", Description = "Test Storage Place", State = 1 // Active }; // Save the storage place to get an I3D session.Save(storagePlace); session.Flush(); // Create associated storage areas var storageArea1 = new StorageArea { ShortDescription = "Area1", Description = "Test Storage Area 1", StoragePlaceI3D = storagePlace.I3D, State = 1 // Active }; var storageArea2 = new StorageArea { ShortDescription = "Area2", Description = "Test Storage Area 2", StoragePlaceI3D = storagePlace.I3D, State = 1 // Active }; // Save the storage areas session.Save(storageArea1); session.Save(storageArea2); session.Flush(); // Create the system under test (SUT) var storagePlaceBL = new StoragePlaceBL(daoSession); // Mark the storage place as deleted storagePlace.State = 0; // Act storagePlaceBL.SaveOrUpdateStoragePlace(storagePlace); // Refresh session to ensure we're getting fresh data session.Clear(); // Assert // Verify the storage place is marked as deleted var updatedStoragePlace = session.Get(storagePlace.I3D); Assert.Equal(0, updatedStoragePlace.State); // Verify all associated storage areas are marked as deleted var updatedStorageArea1 = session.Get(storageArea1.I3D); var updatedStorageArea2 = session.Get(storageArea2.I3D); Assert.Equal(0, updatedStorageArea1.State); Assert.Equal(0, updatedStorageArea2.State); } [Fact] public void SaveOrUpdateStoragePlace_DoesNotCascadeDelete_WhenStateIsNotZero() { // Arrange using var session = CreateSession(); var daoSession = new DAOSession(session); // Create a storage place var storagePlace = new StoragePlace { Name = "TestPlace", Description = "Test Storage Place", State = 1 // Initially active }; // Save the storage place to get an I3D session.Save(storagePlace); session.Flush(); // Create associated storage areas var storageArea1 = new StorageArea { ShortDescription = "Area1", Description = "Test Storage Area 1", StoragePlaceI3D = storagePlace.I3D, State = 1 // Initially active }; var storageArea2 = new StorageArea { ShortDescription = "Area2", Description = "Test Storage Area 2", StoragePlaceI3D = storagePlace.I3D, State = 1 // Initially active }; // Save the storage areas session.Save(storageArea1); session.Save(storageArea2); session.Flush(); // Create the system under test (SUT) var storagePlaceBL = new StoragePlaceBL(daoSession); // Update the storage place to a different non-deleted state (e.g., 2 for a different active state) storagePlace.State = 2; // Act storagePlaceBL.SaveOrUpdateStoragePlace(storagePlace); // Refresh session to ensure we're getting fresh data session.Clear(); // Assert // Verify the storage place has the new state var updatedStoragePlace = session.Get(storagePlace.I3D); Assert.Equal(2, updatedStoragePlace.State); // Verify storage areas remain active (not changed) var updatedStorageArea1 = session.Get(storageArea1.I3D); var updatedStorageArea2 = session.Get(storageArea2.I3D); Assert.Equal(1, updatedStorageArea1.State); Assert.Equal(1, updatedStorageArea2.State); } private static ISession CreateSession() { var fluentConfig = Fluently.Configure() .Database(SQLiteConfiguration.Standard.InMemory) .Mappings(m => { m.FluentMappings.Add(); m.FluentMappings.Add(); }); var sessionFactory = fluentConfig.BuildSessionFactory(); var session = sessionFactory.OpenSession(); new SchemaExport(fluentConfig.BuildConfiguration()).Execute(true, true, false, session.Connection, Console.Out); return session; } }