private static QpUrlResolver CreateMockedUrlResolver(IMetaInfoRepository metaInfoRepository)
        {
            var cacheSettings = new QpSiteStructureCacheSettings
            {
                ItemDefinitionCachePeriod = TimeSpan.FromSeconds(30),
                QpSchemeCachePeriod       = TimeSpan.FromSeconds(30),
                SiteStructureCachePeriod  = TimeSpan.FromSeconds(30)
            };
            var cache         = new MemoryCache(new MemoryCacheOptions());
            var cacheProvider = new VersionedCacheCoreProvider(cache);

            var urlResolver = new QpUrlResolver(cacheProvider, metaInfoRepository, cacheSettings);

            return(urlResolver);
        }
Beispiel #2
0
        public void LibraryUrlFieldsIsCorrect()
        {
            var extensionId = 777;

            //замокаем информацию о сайте, базовом контенте, и полях с картинками (одно в базовом контенте, одно в контенте-расширении),
            //т.к. эта информация понадобится для создания урлов, которые участвуют в тесте
            var iconField = new ContentAttributePersistentData
            {
                ContentId      = abstractItemContentId,
                ColumnName     = "Icon",
                UseSiteLibrary = true,
                SubFolder      = "subfolder",
                TypeName       = "Image"
            };
            var imageField = new ContentAttributePersistentData
            {
                ContentId      = extensionId,
                ColumnName     = "Image",
                UseSiteLibrary = false,
                SubFolder      = "subfolder",
                TypeName       = "Image"
            };

            var metaInfoMoq = new Mock <IMetaInfoRepository>();

            metaInfoMoq.Setup(x => x.GetSite(siteId, null)).Returns(siteData);
            metaInfoMoq.Setup(x => x.GetContent(abstractItemNetName, siteId, null)).Returns(new ContentPersistentData
            {
                ContentId         = abstractItemContentId,
                ContentAttributes = new List <ContentAttributePersistentData> {
                    iconField
                }
            });
            metaInfoMoq.Setup(x => x.GetContentsById(It.Is <int[]>(ids => ids.Contains(extensionId)), siteId, null)).Returns(new ContentPersistentData[1]
            {
                new ContentPersistentData
                {
                    ContentId         = extensionId,
                    ContentAttributes = new List <ContentAttributePersistentData> {
                        imageField
                    }
                }
            });
            metaInfoMoq.Setup(x => x.GetContentAttribute(abstractItemContentId, "Icon", null)).Returns(iconField);
            metaInfoMoq.Setup(x => x.GetContentAttribute(extensionId, "Image", null)).Returns(imageField);

            var aiRepositoryMoq = new Mock <IAbstractItemRepository>();

            //корневая, стартовая страница и виджет с картинкой
            var aiArray = new[] {
                new AbstractItemPersistentData {
                    Id = 1, Title = "корневая страница", Alias = "root", Discriminator = typeof(RootPage).Name, IsPage = true, ParentId = null, ExtensionId = null
                },
                new AbstractItemPersistentData {
                    Id = 2, Title = "стартовая страница", Alias = "start", Discriminator = typeof(StubStartPage).Name, IsPage = true, ParentId = 1, ExtensionId = null
                },
                new AbstractItemPersistentData {
                    Id = 3, Title = "виджет картинки", Alias = "pic", Discriminator = typeof(PictureWidget).Name, IsPage = false, ParentId = 2, ExtensionId = extensionId
                }
            };

            aiRepositoryMoq.Setup(x => x.GetPlainAllAbstractItems(siteId, isStage, null)).Returns(aiArray);

            //extension-поля, среди них:
            //поля с картинками (которые приходят к нам без базового урла)
            //поле с плейсхолдером, который должен быть подменен на некий базовый урл
            var widgetExt = new AbstractItemExtensionCollection();

            widgetExt.Add("Image", "1.img");
            widgetExt.Add("Icon", "123.png");
            widgetExt.Add("Description", $"blah blah {uploadUrlPlaceholder}/blah.");
            var widgetExtDictionary = new Dictionary <int, AbstractItemExtensionCollection>
            {
                { 3, widgetExt }
            };

            aiRepositoryMoq.Setup(x => x.GetAbstractItemExtensionData(extensionId,
                                                                      It.Is <IEnumerable <int> >(ids => ids.Count() == 1 && ids.Contains(3)),
                                                                      It.IsAny <ContentPersistentData>(),
                                                                      buildSettings.LoadAbstractItemFieldsToDetailsCollection,
                                                                      buildSettings.IsStage,
                                                                      null)).Returns(widgetExtDictionary);

            //фабрика элементов структуры сайта
            var aiFactoryMoq = new Mock <IAbstractItemFactory>();

            aiFactoryMoq.Setup(x => x.Create(It.IsAny <string>())).Returns((string d) =>
            {
                if (d == typeof(RootPage).Name)
                {
                    return(new RootPage());
                }
                if (d == typeof(StubStartPage).Name)
                {
                    return(new StubStartPage());
                }
                if (d == typeof(PictureWidget).Name)
                {
                    return(new PictureWidget());
                }
                return(null);
            });

            var cache         = new MemoryCache(new MemoryCacheOptions());
            var cacheProvider = new VersionedCacheCoreProvider(cache);
            var urlResolver   = new QpUrlResolver(cacheProvider, metaInfoMoq.Object, cacheSettings);
            var builder       = new QpAbstractItemStorageBuilder(aiFactoryMoq.Object,
                                                                 urlResolver, // реальный urlresolver
                                                                 aiRepositoryMoq.Object,
                                                                 metaInfoMoq.Object,
                                                                 buildSettings,
                                                                 Mock.Of <ILogger <QpAbstractItemStorageBuilder> >());

            var aiStorage = builder.Build();

            var widget = aiStorage.Get(3) as PictureWidget;

            Assert.NotNull(widget);

            //проверим, что поля, помеченные атрибутом LibraryUrl обогатились и стали полной ссылкой на картинку
            Assert.StartsWith(urlResolver.UrlForImage(siteId, extensionId, "Image"), widget.ImageUrl);
            Assert.EndsWith("1.img", widget.ImageUrl);
            Assert.StartsWith(urlResolver.UrlForImage(siteId, abstractItemContentId, "Icon"), widget.Icon);
            Assert.EndsWith("123.png", widget.Icon);

            //проверим, что в поле, содержащее плейсхолдер адреса библиотеки сайта подставился реальный адрес
            Assert.Contains(urlResolver.UploadUrl(siteId), widget.Description);
            Assert.DoesNotContain(uploadUrlPlaceholder, widget.Description);
        }