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); }