using System.Net; using Microsoft.AspNetCore.Mvc.Testing; namespace CartWise.Web.Tests; public class ProductAccessControlTests : IClassFixture { private readonly CartWiseWebApplicationFactory _factory; public ProductAccessControlTests(CartWiseWebApplicationFactory factory) { _factory = factory; } [Fact] public async Task AnonymousUser_IsRedirectedToLoginWhenSearchingProducts() { var client = _factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); var response = await client.GetAsync("/products/search?q=milk"); Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); Assert.Contains("/Account/Login", response.Headers.Location?.ToString()); } [Fact] public async Task AuthenticatedUser_CanSearchWithNoResults() { var client = _factory.CreateClient(); await WebTestHelpers.RegisterAsync(client, "productsearch1@example.com", "Product Searcher"); var response = await client.GetAsync("/products/search?q=nonexistentitem"); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); HtmlAssert.Contains("No products matched", body); } [Fact] public async Task Details_ReturnsNotFoundForUnknownProduct() { var client = _factory.CreateClient(); await WebTestHelpers.RegisterAsync(client, "productdetails1@example.com", "Product Detailer"); var response = await client.GetAsync($"/products/{Guid.NewGuid()}"); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } }