public async Task WHEN_Product_Without_A_Category_SHOULD_Return_Minimal_Breadcrumb() { // Arrange var service = _container.CreateInstance <ProductBreadcrumbService>(); var homeUrl = GetRandom.Url(); var productName = GetRandom.String(12); var parameters = new GetProductBreadcrumbParam() { CategoryId = null, CultureInfo = CultureInfo.InvariantCulture, HomeUrl = homeUrl, ProductName = productName, Scope = GetRandom.String(7) }; // Act var vm = await service.CreateBreadcrumbAsync(parameters); // Assert vm.Should().NotBeNull(); vm.Items.Should().HaveCount(1); vm.Items[0].Url.Should().Be(homeUrl); vm.ActivePageName.Should().Be(productName); }
/// <summary> /// Creates a <see cref="BreadcrumbViewModel"/> for a given product. /// </summary> /// <param name="parameters">Parameters to generate the ViewModel.</param> /// <returns></returns> public virtual async Task <BreadcrumbViewModel> CreateBreadcrumbAsync(GetProductBreadcrumbParam parameters) { AssertParameters(parameters); var categoriesPath = await GetCategoryViewModelsAsync(parameters.CategoryId, parameters.Scope, parameters.CultureInfo).ConfigureAwait(false); var vm = CreateBreadcrumbViewModel(parameters, categoriesPath); return(vm); }
public async Task WHEN_Parameters_Are_Valid_SHOULD_Return_ViewModel() { //Arrange var categoryServiceMock = CreateCategoryServiceMock(); var localizationProvider = _container.GetMock <ILocalizationProvider>(); var urlProviderMock = _container.GetMock <ICategoryBrowsingUrlProvider>(); localizationProvider.Setup( lp => lp.GetLocalizedString(It.Is <GetLocalizedParam>(param => param.Key == "L_Home"))) .Returns("Home") .Verifiable(); urlProviderMock.Setup(up => up.BuildCategoryBrowsingUrl(It.IsNotNull <BuildCategoryBrowsingUrlParam>())) .Returns(new Func <BuildCategoryBrowsingUrlParam, string>(p => GetRandom.Url())) .Verifiable(); _container.Use(categoryServiceMock); _container.Use(localizationProvider); _container.Use(urlProviderMock); var service = _container.CreateInstance <ProductBreadcrumbService>(); var productName = GetRandom.String(10); var homeUrl = GetRandom.Url(); var parameters = new GetProductBreadcrumbParam() { CategoryId = GetRandom.String(10), CultureInfo = CultureInfo.InvariantCulture, HomeUrl = homeUrl, ProductName = productName, Scope = GetRandom.String(7) }; //Act var vm = await service.CreateBreadcrumbAsync(parameters); //Assert vm.Should().NotBeNull(); vm.Items.Should().HaveCount(3); vm.Items[0].DisplayName.Should().Be("Home"); vm.Items[0].Url.Should().Be(homeUrl); vm.Items[1].DisplayName.Should().Be("B"); vm.Items[1].Url.Should().NotBeNullOrWhiteSpace(); vm.Items[2].DisplayName.Should().Be("A"); vm.Items[2].Url.Should().NotBeNullOrWhiteSpace(); vm.ActivePageName.Should().Be(productName); categoryServiceMock.Verify(); localizationProvider.Verify(); urlProviderMock.Verify(); }
public BreadcrumbViewModel GetViewModel(Guid currentPageId, Guid currentHomePageId) { var parameters = new GetProductBreadcrumbParam { CategoryId = ProductContext.ViewModel.CategoryId, CultureInfo = ComposerContext.CultureInfo, HomeUrl = PageService.GetRendererPageUrl(currentHomePageId, ComposerContext.CultureInfo), ProductName = ProductContext.ViewModel.DisplayName, Scope = ComposerContext.Scope, BaseUrl = RequestUtils.GetBaseUrl(Request).ToString() }; return(BreadcrumbService.CreateBreadcrumbAsync(parameters).Result); }
protected virtual BreadcrumbViewModel CreateBreadcrumbViewModel(GetProductBreadcrumbParam parameters, IEnumerable <CategoryViewModel> categoriesPath) { var breadcrumbViewModel = new BreadcrumbViewModel { ActivePageName = HttpUtility.HtmlEncode(parameters.ProductName) }; var stack = new Stack <BreadcrumbItemViewModel>(); CreateBreadcrumbItemsForCategories(stack, GetCategoriesWithoutRoot(categoriesPath), parameters.CultureInfo, parameters.BaseUrl); CreateRootBreadcrumbItem(stack, parameters.HomeUrl, parameters.CultureInfo); UnrollStackIntoViewModel(stack, breadcrumbViewModel); return(breadcrumbViewModel); }
protected virtual void AssertParameters(GetProductBreadcrumbParam parameters) { if (parameters == null) { throw new ArgumentNullException("parameters"); } if (parameters.CultureInfo == null) { throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("CultureInfo"), "parameters"); } if (!string.IsNullOrWhiteSpace(parameters.CategoryId)) { if (string.IsNullOrWhiteSpace(parameters.Scope)) { throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("scope must not be null or whitespace if the category is defined."), "parameters"); } } }
public void WHEN_String_Parameters_Are_Invalid_SHOULD_Throw_ArgumentException(string productName, string categoryId, string scope) { //Arrange var service = _container.CreateInstance <ProductBreadcrumbService>(); var parameters = new GetProductBreadcrumbParam() { CategoryId = categoryId, CultureInfo = CultureInfo.InvariantCulture, HomeUrl = GetRandom.String(25), ProductName = productName, Scope = scope }; //Act var func = new Func <Task <BreadcrumbViewModel> >(() => service.CreateBreadcrumbAsync(parameters)); //Assert func.ShouldThrow <ArgumentException>(); }
public void WHEN_CultureInfo_Is_Null_SHOULD_Throw_ArgumentNullException() { //Arrange var service = _container.CreateInstance <ProductBreadcrumbService>(); var parameters = new GetProductBreadcrumbParam() { CategoryId = GetRandom.String(10), CultureInfo = null, HomeUrl = null, ProductName = GetRandom.String(10), Scope = GetRandom.String(8) }; //Act var func = new Func <Task <BreadcrumbViewModel> >(() => service.CreateBreadcrumbAsync(parameters)); //Assert func.ShouldThrow <ArgumentException>(); }
/// <summary> /// Creates a <see cref="BreadcrumbViewModel"/> for a given product. /// </summary> /// <param name="param">Parameters to generate the ViewModel.</param> /// <returns></returns> public virtual async Task <BreadcrumbViewModel> CreateBreadcrumbAsync(GetProductBreadcrumbParam param) { if (param == null) { throw new ArgumentNullException(nameof(param)); } if (param.CultureInfo == null) { throw new ArgumentException(GetMessageOfNull(nameof(param.CultureInfo)), nameof(param)); } if (!string.IsNullOrWhiteSpace(param.CategoryId) && string.IsNullOrWhiteSpace(param.Scope)) { throw new ArgumentException($"{nameof(param.Scope)} must not be null or whitespace if {nameof(param.CategoryId)} is defined.", nameof(param)); } var categoriesPath = await GetCategoryViewModelsAsync(param.CategoryId, param.Scope, param.CultureInfo).ConfigureAwait(false); var vm = CreateBreadcrumbViewModel(param, categoriesPath); return(vm); }
public virtual ActionResult Breadcrumb() { var productViewModel = ProductContext.ViewModel; if (productViewModel == null) { return(new HttpStatusCodeResult(HttpStatusCode.NotFound)); } var parameters = new GetProductBreadcrumbParam { CategoryId = productViewModel.CategoryId, CultureInfo = ComposerContext.CultureInfo, HomeUrl = PageService.GetRendererPageUrl(SitemapNavigator.CurrentHomePageId, ComposerContext.CultureInfo), ProductName = productViewModel.DisplayName, Scope = ComposerContext.Scope, BaseUrl = RequestUtils.GetBaseUrl(Request).ToString() }; var breadcrumbViewModel = ProductBreadcrumbService.CreateBreadcrumbAsync(parameters).Result; return(View(breadcrumbViewModel)); }