Files
Masterarbeit/QuellCode/CentronERP/tests/backend/Centron.Tests.BL/Warehousing/StockManagement/StoragePlaceBLTest.cs
T
Christoph Schwörer f045b99a25 Codebasis als Dateien ins Arbeitsrepo statt als Gitlink
QuellCode/CentronERP war nur als Gitlink (Submodul-Referenz auf 79c1142)
getrackt, ohne .gitmodules und ohne erreichbares Remote. Der
Untersuchungsgegenstand der Versuchsreihe war damit nicht reproduzierbar
gesichert: Ein Klon haette ein leeres Verzeichnis erhalten, und die Belege
der 3.287 Anforderungen waeren nicht ueberpruefbar gewesen.

Umstellung:
- Historie nach c:\DEV\CentronERP_git_snapshot_79c1142 ausgelagert
  (vollstaendig lesbar, enthaelt 79c1142 und Vorgaenger 89ccfd6)
- Gitlink aus dem Index entfernt
- Dateiinhalt aufgenommen: 24.557 Dateien, rund 333 MB

Die verschachtelte .gitignore der Codebasis gilt weiter, Build-Artefakte
bleiben ausgeschlossen. Details in Versuche/Versuch_01/_Codebasis-Nachweis.md
2026-08-26 07:43:51 +02:00

174 lines
5.7 KiB
C#

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;
/// <summary>
/// Integration tests for the StoragePlaceBL class.
/// These tests verify the behavior of storage place operations, particularly the cascading delete functionality.
/// </summary>
[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>(storagePlace.I3D);
Assert.Equal(0, updatedStoragePlace.State);
// Verify all associated storage areas are marked as deleted
var updatedStorageArea1 = session.Get<StorageArea>(storageArea1.I3D);
var updatedStorageArea2 = session.Get<StorageArea>(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>(storagePlace.I3D);
Assert.Equal(2, updatedStoragePlace.State);
// Verify storage areas remain active (not changed)
var updatedStorageArea1 = session.Get<StorageArea>(storageArea1.I3D);
var updatedStorageArea2 = session.Get<StorageArea>(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<StoragePlaceMaps>();
m.FluentMappings.Add<StorageAreaMaps>();
});
var sessionFactory = fluentConfig.BuildSessionFactory();
var session = sessionFactory.OpenSession();
new SchemaExport(fluentConfig.BuildConfiguration()).Execute(true, true, false, session.Connection, Console.Out);
return session;
}
}