using WildPlumContracts.DataModels; using WildPlumContracts.Enums; using WildPlumContracts.Exceptions; namespace WildPlumTests.DataModelTests; [TestFixture] public class OrderDataModelTests { [Test] public void Validate_ThrowsException_WhenIdIsNullOrEmpty() { Assert.Multiple(() => { Assert.That(() => CreateDataModel(null, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); Assert.That(() => CreateDataModel(string.Empty, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); }); } [Test] public void Validate_ThrowsException_WhenIdIsNotGuid() { Assert.That(() => CreateDataModel("invalid-guid", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); } [Test] public void Validate_ThrowsException_WhenWarehouseIdIsNullOrEmpty() { Assert.Multiple(() => { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), null, Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), string.Empty, Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); }); } [Test] public void Validate_ThrowsException_WhenWarehouseIdIsNotGuid() { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), "invalid-guid", Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); } [Test] public void Validate_ThrowsException_WhenWorkerIdIsNullOrEmpty() { Assert.Multiple(() => { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null, "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), string.Empty, "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); }); } [Test] public void Validate_ThrowsException_WhenWorkerIdIsNotGuid() { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "invalid-guid", "John Doe", OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); } [Test] public void Validate_ThrowsException_WhenCustomerNameIsNullOrEmpty() { Assert.Multiple(() => { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null, OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), string.Empty, OrderStatus.Pending, DateTime.Now, CreateSubDataModel()).Validate(), Throws.TypeOf()); }); } [Test] public void Validate_ThrowsException_WhenProductsListIsEmptyOrNull() { Assert.Multiple(() => { Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, null).Validate(), Throws.TypeOf()); Assert.That(() => CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "John Doe", OrderStatus.Pending, DateTime.Now, new List()).Validate(), Throws.TypeOf()); }); } [Test] public void AllFieldsAreCorrectTest() { var id = Guid.NewGuid().ToString(); var warehouseId = Guid.NewGuid().ToString(); var workerId = Guid.NewGuid().ToString(); var customerName = "John Doe"; var status = OrderStatus.Pending; var orderDate = DateTime.Now; var products = CreateSubDataModel(); var order = CreateDataModel(id, warehouseId, workerId, customerName, status, orderDate, products); Assert.That(() => order.Validate(), Throws.Nothing); Assert.Multiple(() => { Assert.That(order.Id, Is.EqualTo(id)); Assert.That(order.WarehouseId, Is.EqualTo(warehouseId)); Assert.That(order.WorkerId, Is.EqualTo(workerId)); Assert.That(order.CustomerName, Is.EqualTo(customerName)); Assert.That(order.Status, Is.EqualTo(status)); Assert.That(order.OrderDate, Is.EqualTo(orderDate).Within(TimeSpan.FromSeconds(1))); Assert.That(order.Products, Is.EquivalentTo(products)); }); } private static OrderDataModel CreateDataModel(string? id, string? warehouseId, string? workerId, string? customerName, OrderStatus status, DateTime orderDate, List? products) => new(id, warehouseId, workerId, customerName, status, orderDate, products); private static List CreateSubDataModel() => new() { new OrderProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 1) }; }