Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions tests/Basket.UnitTests/BasketServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,83 @@ public async Task GetBasketReturnsEmptyForInvalidUserId()
Assert.IsInstanceOfType<CustomerBasketResponse>(response);
Assert.AreEqual(response.Items.Count(), 0);
}

[TestMethod]
public async Task GetBasketReturnsEmptyWhenRepositoryReturnsNull()
{
// Arrange: Mock IBasketRepository.GetBasketAsync to return null for a valid user ID
var mockRepository = Substitute.For<IBasketRepository>();
mockRepository.GetBasketAsync("1").Returns(Task.FromResult<CustomerBasket>(null));
var service = new BasketService(mockRepository, NullLogger<BasketService>.Instance);
var serverCallContext = TestServerCallContext.Create();
var httpContext = new DefaultHttpContext();
httpContext.User = new ClaimsPrincipal(new ClaimsIdentity([new Claim("sub", "1")]));
serverCallContext.SetUserState("__HttpContext", httpContext);

// Act: Call GetBasket with a valid user context
var response = await service.GetBasket(new GetBasketRequest(), serverCallContext);

// Assert: The response is a CustomerBasketResponse with zero items
Assert.IsInstanceOfType<CustomerBasketResponse>(response);
Assert.AreEqual(0, response.Items.Count());
}

[TestMethod]
public async Task GetBasketHandlesRepositoryExceptionGracefully()
{
// Arrange: Mock IBasketRepository.GetBasketAsync to throw an exception for a valid user ID
var mockRepository = Substitute.For<IBasketRepository>();
mockRepository.GetBasketAsync("1").Returns<Task<CustomerBasket>>(x => throw new Exception("Repository error"));
var service = new BasketService(mockRepository, NullLogger<BasketService>.Instance);
var serverCallContext = TestServerCallContext.Create();
var httpContext = new DefaultHttpContext();
httpContext.User = new ClaimsPrincipal(new ClaimsIdentity([new Claim("sub", "1")]));
serverCallContext.SetUserState("__HttpContext", httpContext);

// Act: Call GetBasket with a valid user context
// Assert: The service throws the exception (current implementation behavior)
await Assert.ThrowsExactlyAsync<Exception>(async () =>
{
await service.GetBasket(new GetBasketRequest(), serverCallContext);
});
}

[TestMethod]
public async Task GetBasketReturnsMultipleItemsForValidUserId()
{
// Arrange: Mock IBasketRepository.GetBasketAsync to return a CustomerBasket with multiple BasketItem objects
var mockRepository = Substitute.For<IBasketRepository>();
List<BasketItem> items = [
new BasketItem { Id = "item-1", ProductId = 1, ProductName = "Product 1", Quantity = 2, UnitPrice = 10.50m },
new BasketItem { Id = "item-2", ProductId = 2, ProductName = "Product 2", Quantity = 1, UnitPrice = 25.00m },
new BasketItem { Id = "item-3", ProductId = 3, ProductName = "Product 3", Quantity = 3, UnitPrice = 5.75m }
];
mockRepository.GetBasketAsync("1").Returns(Task.FromResult(new CustomerBasket { BuyerId = "1", Items = items }));
var service = new BasketService(mockRepository, NullLogger<BasketService>.Instance);
var serverCallContext = TestServerCallContext.Create();
var httpContext = new DefaultHttpContext();
httpContext.User = new ClaimsPrincipal(new ClaimsIdentity([new Claim("sub", "1")]));
serverCallContext.SetUserState("__HttpContext", httpContext);

// Act: Call GetBasket with a valid user context
var response = await service.GetBasket(new GetBasketRequest(), serverCallContext);

// Assert: The response contains the correct number of items and the expected item details
Assert.IsInstanceOfType<CustomerBasketResponse>(response);
Assert.AreEqual(3, response.Items.Count());

var itemsList = response.Items.ToList();

// Verify first item details
Assert.AreEqual(1, itemsList[0].ProductId);
Assert.AreEqual(2, itemsList[0].Quantity);

// Verify second item details
Assert.AreEqual(2, itemsList[1].ProductId);
Assert.AreEqual(1, itemsList[1].Quantity);

// Verify third item details
Assert.AreEqual(3, itemsList[2].ProductId);
Assert.AreEqual(3, itemsList[2].Quantity);
}
}