Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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");
                }
            }
        }
Пример #7
0
        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>();
        }
Пример #8
0
        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>();
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        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));
        }