This commit is contained in:
2025-10-27 17:39:18 -04:00
commit 31f723bea4
1579 changed files with 642409 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
using System.Linq;
using Prefab.Web.Client.Models.Home;
using Prefab.Web.Client.Models.Shared;
using Prefab.Web.Client.Pages;
using Prefab.Web.Client.Services;
using Prefab.Web.Client.ViewModels.Catalog;
using Shouldly;
using Telerik.Blazor.Components;
namespace Prefab.Tests.Web.Client.Pages;
[Trait(TraitName.Category, TraitCategory.Unit)]
public sealed class HomeComponentShould
{
[Fact]
public async Task LoadHomeContentPopulatesProductsAndCategories()
{
var payload = new HomePageModel
{
FeaturedProducts = Enumerable.Range(0, 3)
.Select(index => new ProductCardModel
{
Title = $"Product {index}",
Url = $"/product/{index}",
FromPrice = new MoneyModel
{
Amount = index,
Currency = "USD"
},
IsPriced = true,
Sku = $"SKU-{index}",
LastModifiedOn = DateTimeOffset.UtcNow
})
.ToList(),
LatestCategories = new List<CategoryCardModel>
{
new()
{
Title = "Leaf A",
Url = "/catalog/category?category-slug=leaf-a",
SecondaryText = "2 Products"
}
}
};
var service = new FakeHomePageService(Result<HomePageModel>.Success(payload));
var component = new TestableHomeComponent();
component.ConfigureServices(service, new NoopNotificationService());
await component.InitializeAsync();
component.IsProductsLoading.ShouldBeFalse();
component.IsCategoriesLoading.ShouldBeFalse();
component.FeaturedProductsView.Count.ShouldBe(3);
component.CategoriesView.Count.ShouldBe(1);
}
[Fact]
public async Task LeaveCollectionsEmptyWhenServiceReturnsNoData()
{
var service = new FakeHomePageService(Result<HomePageModel>.Success(new HomePageModel()));
var component = new TestableHomeComponent();
component.ConfigureServices(service, new NoopNotificationService());
await component.InitializeAsync();
component.FeaturedProductsView.ShouldBeEmpty();
component.CategoriesView.ShouldBeEmpty();
component.HasFeaturedProducts.ShouldBeFalse();
component.HasCategories.ShouldBeFalse();
}
private sealed class FakeHomePageService(Result<HomePageModel> result) : IHomePageService
{
private Result<HomePageModel> Result { get; set; } = result;
public Task<Result<HomePageModel>> Get(CancellationToken cancellationToken) => Task.FromResult(Result);
}
private sealed class NoopNotificationService : INotificationService
{
public void Attach(TelerikNotification notification)
{
}
public void ShowError(string message)
{
}
public void ShowSuccess(string message)
{
}
public void ShowWarning(string message)
{
}
}
private sealed class TestableHomeComponent : HomeComponent
{
public void ConfigureServices(IHomePageService homePageService, INotificationService notificationService)
{
HomePageService = homePageService;
NotificationService = notificationService;
}
public Task InitializeAsync() => OnInitializedAsync();
public IReadOnlyList<ProductCardModel> FeaturedProductsView => base.FeaturedProducts;
public IReadOnlyList<CategoryCardModel> CategoriesView => base.LatestCategories;
public bool IsProductsLoading => IsFeaturedProductsLoading;
public bool IsCategoriesLoading => base.AreCategoriesLoading;
public bool HasFeaturedProducts => FeaturedProductsHaveItemsToShow;
public bool HasCategories => CategoriesHaveItemsToShow;
}
}