diff --git a/tests/Basket.UnitTests/BasketServiceTests.cs b/tests/Basket.UnitTests/BasketServiceTests.cs index 4e8abb4dc..b890ee75f 100644 --- a/tests/Basket.UnitTests/BasketServiceTests.cs +++ b/tests/Basket.UnitTests/BasketServiceTests.cs @@ -59,4 +59,83 @@ public async Task GetBasketReturnsEmptyForInvalidUserId() Assert.IsInstanceOfType(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(); + mockRepository.GetBasketAsync("1").Returns(Task.FromResult(null)); + var service = new BasketService(mockRepository, NullLogger.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(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(); + mockRepository.GetBasketAsync("1").Returns>(x => throw new Exception("Repository error")); + var service = new BasketService(mockRepository, NullLogger.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(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(); + List 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.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(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); + } }