234 lines
6.6 KiB
C#
234 lines
6.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using FluentAssertions;
|
|
using TeleBot.Models;
|
|
using Xunit;
|
|
|
|
namespace TeleBot.Tests.Models
|
|
{
|
|
public class ShoppingCartTests
|
|
{
|
|
[Fact]
|
|
public void NewCart_ShouldBeEmpty()
|
|
{
|
|
// Arrange & Act
|
|
var cart = new ShoppingCart();
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeTrue();
|
|
cart.GetTotalItems().Should().Be(0);
|
|
cart.GetTotalAmount().Should().Be(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_ShouldAddToCart()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
|
|
// Act
|
|
cart.AddItem(productId, "Test Product", 10.50m, 2);
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeFalse();
|
|
cart.GetTotalItems().Should().Be(2);
|
|
cart.GetTotalAmount().Should().Be(21.00m);
|
|
cart.Items.Should().HaveCount(1);
|
|
cart.Items.First().ProductName.Should().Be("Test Product");
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_SameProduct_ShouldIncreaseQuantity()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
|
|
// Act
|
|
cart.AddItem(productId, "Product A", 5.00m, 1);
|
|
cart.AddItem(productId, "Product A", 5.00m, 2);
|
|
|
|
// Assert
|
|
cart.Items.Should().HaveCount(1);
|
|
cart.Items.First().Quantity.Should().Be(3);
|
|
cart.GetTotalAmount().Should().Be(15.00m);
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_DifferentProducts_ShouldAddSeparately()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId1 = Guid.NewGuid();
|
|
var productId2 = Guid.NewGuid();
|
|
|
|
// Act
|
|
cart.AddItem(productId1, "Product A", 10.00m, 1);
|
|
cart.AddItem(productId2, "Product B", 20.00m, 2);
|
|
|
|
// Assert
|
|
cart.Items.Should().HaveCount(2);
|
|
cart.GetTotalItems().Should().Be(3);
|
|
cart.GetTotalAmount().Should().Be(50.00m);
|
|
}
|
|
|
|
[Fact]
|
|
public void RemoveItem_ShouldRemoveFromCart()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
cart.AddItem(productId, "Test Product", 10.00m, 2);
|
|
|
|
// Act
|
|
cart.RemoveItem(productId);
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeTrue();
|
|
cart.GetTotalItems().Should().Be(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void RemoveItem_NonExistent_ShouldNotThrow()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
|
|
// Act & Assert
|
|
var act = () => cart.RemoveItem(productId);
|
|
act.Should().NotThrow();
|
|
}
|
|
|
|
[Fact]
|
|
public void UpdateQuantity_ShouldUpdateExistingItem()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
cart.AddItem(productId, "Test Product", 10.00m, 2);
|
|
|
|
// Act
|
|
cart.UpdateQuantity(productId, 5);
|
|
|
|
// Assert
|
|
cart.Items.First().Quantity.Should().Be(5);
|
|
cart.GetTotalAmount().Should().Be(50.00m);
|
|
}
|
|
|
|
[Fact]
|
|
public void UpdateQuantity_ToZero_ShouldRemoveItem()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
cart.AddItem(productId, "Test Product", 10.00m, 2);
|
|
|
|
// Act
|
|
cart.UpdateQuantity(productId, 0);
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void UpdateQuantity_Negative_ShouldRemoveItem()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var productId = Guid.NewGuid();
|
|
cart.AddItem(productId, "Test Product", 10.00m, 2);
|
|
|
|
// Act
|
|
cart.UpdateQuantity(productId, -1);
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Clear_ShouldEmptyCart()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
cart.AddItem(Guid.NewGuid(), "Product A", 10.00m, 2);
|
|
cart.AddItem(Guid.NewGuid(), "Product B", 20.00m, 1);
|
|
|
|
// Act
|
|
cart.Clear();
|
|
|
|
// Assert
|
|
cart.IsEmpty().Should().BeTrue();
|
|
cart.GetTotalItems().Should().Be(0);
|
|
cart.GetTotalAmount().Should().Be(0);
|
|
}
|
|
|
|
[Fact]
|
|
public void CartItem_UpdateTotalPrice_ShouldCalculateCorrectly()
|
|
{
|
|
// Arrange
|
|
var item = new CartItem
|
|
{
|
|
UnitPrice = 15.50m,
|
|
Quantity = 3
|
|
};
|
|
|
|
// Act
|
|
item.UpdateTotalPrice();
|
|
|
|
// Assert
|
|
item.TotalPrice.Should().Be(46.50m);
|
|
}
|
|
|
|
[Fact]
|
|
public void Cart_UpdatedAt_ShouldUpdateOnModification()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
var originalTime = cart.UpdatedAt;
|
|
System.Threading.Thread.Sleep(10);
|
|
|
|
// Act
|
|
cart.AddItem(Guid.NewGuid(), "Product", 10.00m, 1);
|
|
|
|
// Assert
|
|
cart.UpdatedAt.Should().BeAfter(originalTime);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(10.99, 1, 10.99)]
|
|
[InlineData(5.50, 3, 16.50)]
|
|
[InlineData(0.99, 100, 99.00)]
|
|
[InlineData(123.45, 2, 246.90)]
|
|
public void GetTotalAmount_ShouldCalculateCorrectly(decimal price, int quantity, decimal expectedTotal)
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
|
|
// Act
|
|
cart.AddItem(Guid.NewGuid(), "Product", price, quantity);
|
|
|
|
// Assert
|
|
cart.GetTotalAmount().Should().Be(expectedTotal);
|
|
}
|
|
|
|
[Fact]
|
|
public void ComplexCart_ShouldCalculateCorrectTotals()
|
|
{
|
|
// Arrange
|
|
var cart = new ShoppingCart();
|
|
|
|
// Act
|
|
cart.AddItem(Guid.NewGuid(), "Laptop", 999.99m, 1);
|
|
cart.AddItem(Guid.NewGuid(), "Mouse", 25.50m, 2);
|
|
cart.AddItem(Guid.NewGuid(), "Keyboard", 75.00m, 1);
|
|
cart.AddItem(Guid.NewGuid(), "Monitor", 350.00m, 2);
|
|
|
|
// Assert
|
|
cart.Items.Should().HaveCount(4);
|
|
cart.GetTotalItems().Should().Be(6);
|
|
cart.GetTotalAmount().Should().Be(1825.99m);
|
|
}
|
|
}
|
|
} |