private IDictionary <int, AbstractItemExtensionCollection> LoadAbstractItemExtension(IDbCommand command) { var result = new Dictionary <int, AbstractItemExtensionCollection>(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { int id = 0; var extensionCollection = new AbstractItemExtensionCollection(); for (var i = 0; i < reader.FieldCount; i++) { var column = reader.GetName(i); if (string.Equals(column, "Id", StringComparison.OrdinalIgnoreCase)) { id = Decimal.ToInt32(reader.GetDecimal(i)); } else { var val = reader.GetValue(i); extensionCollection.Add(column, val is DBNull ? null : val); } } if (id > 0) { result[id] = extensionCollection; } } return(result); } }
public void TestStringValues(string key, object val) { var extCollection = new AbstractItemExtensionCollection(); extCollection.Add(key, val); Assert.Equal(val, extCollection.Get(key, typeof(string))); Assert.Equal(val, extCollection.Get(key.ToLowerInvariant(), typeof(string))); Assert.Equal(val, extCollection.Get(key.ToUpperInvariant(), typeof(string))); }
public void TestDoubleValues(string val, bool expectedSuccess) { var key = "Key"; var extCollection = new AbstractItemExtensionCollection(); extCollection.Add(key, val); var converted = Double.TryParse(val, out double dVal); Assert.Equal(converted, expectedSuccess); if (converted) { Assert.Equal(dVal, extCollection.Get(key, typeof(double))); Assert.Equal(dVal, extCollection.Get(key, typeof(double?))); } else { Assert.Throws <FormatException>(() => extCollection.Get(key, typeof(double))); } }
public void ManyToManyFieldsIsCorrect() { var extensionId = 777; var widgetRelationField = new ContentAttributePersistentData { ContentId = extensionId, ColumnName = "SomeRelations", M2mLinkId = 7645, TypeName = "Relation" }; var baseContentRelationField = new ContentAttributePersistentData { ContentId = abstractItemContentId, ColumnName = "BaseContentRelations", M2mLinkId = 435, TypeName = "Relation" }; var metaInfoMoq = new Mock <IMetaInfoRepository>(); metaInfoMoq.Setup(x => x.GetContent(abstractItemNetName, siteId, null)).Returns(new ContentPersistentData { ContentId = abstractItemContentId, ContentAttributes = new List <ContentAttributePersistentData> { baseContentRelationField } }); 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> { widgetRelationField } } }); var aiRepositoryMoq = new Mock <IAbstractItemRepository>(); var widgetExtId = 987348; var widgetId = 3; //корневая, стартовая страница и виджет с m2m (виджет просто для примера, m2m может быть и у страницы) 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 = widgetId, Title = "виджет m2m", Alias = "m2m", Discriminator = typeof(ManyToManyWidget).Name, IsPage = false, ParentId = 2, ExtensionId = extensionId } }; aiRepositoryMoq.Setup(x => x.GetPlainAllAbstractItems(siteId, isStage, null)).Returns(aiArray); //extension-поля виджета: //поле SomeRelations - это поле m2m(значением будет является некий relationid), //CONTENT_ITEM_ID - это id самого виджета //extension-поле из базового контента: поле BaseContentRelations - тоже m2m var widgetExt = new AbstractItemExtensionCollection(); widgetExt.Add("CONTENT_ITEM_ID", widgetExtId); widgetExt.Add(widgetRelationField.ColumnName, widgetRelationField.M2mLinkId); widgetExt.Add(baseContentRelationField.ColumnName, baseContentRelationField.M2mLinkId); var widgetExtDictionary = new Dictionary <int, AbstractItemExtensionCollection> { { widgetId, 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); //по relationid и id виджета в qp можно получить полный список id, участвующих в связи m2m с этим виджетом //замокаем методы получения такой информации для 2х relation: один из контента с extension, один в базовом контенте. нужно проверить оба варианта var widgetRelation = new M2mRelations(); var relationValues = new[] { 435, 46, 56 }; foreach (var relValue in relationValues) { widgetRelation.AddRelation(widgetRelationField.M2mLinkId.Value, relValue); } aiRepositoryMoq.Setup(x => x.GetManyToManyData(It.Is <IEnumerable <int> >(ids => ids.Count() == 1 && ids.Contains(widgetExtId)), isStage, null)).Returns(new Dictionary <int, M2mRelations> { { widgetExtId, widgetRelation } }); var baseContentRelation = new M2mRelations(); var baseContentRelationValues = new[] { 576, 7568 }; foreach (var relValue in baseContentRelationValues) { baseContentRelation.AddRelation(baseContentRelationField.M2mLinkId.Value, relValue); } aiRepositoryMoq.Setup(x => x.GetManyToManyData(It.Is <IEnumerable <int> >(ids => ids.Contains(widgetId)), isStage, null)).Returns(new Dictionary <int, M2mRelations> { { widgetId, baseContentRelation } }); //фабрика элементов структуры сайта 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(ManyToManyWidget).Name) { return(new ManyToManyWidget()); } return(null); }); var builder = new QpAbstractItemStorageBuilder(aiFactoryMoq.Object, Mock.Of <IQpUrlResolver>(), aiRepositoryMoq.Object, metaInfoMoq.Object, buildSettings, Mock.Of <ILogger <QpAbstractItemStorageBuilder> >()); var aiStorage = builder.Build(); var widget = aiStorage.Get(widgetId) as ManyToManyWidget; Assert.NotNull(widget); //проверим, что в поле m2m подставились все id из relation, который был в контенте-расширения Assert.Equal(relationValues, widget.RelationIds); //проверим, что в поле m2m подставились все id из relation, который был в базовом контенте Assert.Equal(baseContentRelationValues, widget.BaseContentRelationIds); }
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); }
public void ExtensionsIsCorrect() { var extensionId = 777; var aiRepositoryMoq = new Mock <IAbstractItemRepository>(); var metaInfoMoq = new Mock <IMetaInfoRepository>(); metaInfoMoq.Setup(x => x.GetContent(abstractItemNetName, siteId, null)).Returns(new ContentPersistentData { ContentId = abstractItemContentId, ContentAttributes = new List <ContentAttributePersistentData>() }); //корневая и 2 стартовых страницы, тип стартовой страницы подразумевает extension поля 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 = "стартовая страница 1", Alias = "start1", Discriminator = typeof(StartPage).Name, IsPage = true, ParentId = 1, ExtensionId = extensionId }, new AbstractItemPersistentData { Id = 3, Title = "стартовая страница 2", Alias = "start2", Discriminator = typeof(StartPage).Name, IsPage = true, ParentId = 1, ExtensionId = extensionId } }; aiRepositoryMoq.Setup(x => x.GetPlainAllAbstractItems(siteId, isStage, null)).Returns(aiArray); //extension-поля стартовых страниц var startPageBaseExt = new AbstractItemExtensionCollection(); startPageBaseExt.Add("DnsBinding", "quantumart.ru"); var startPageJobExt = new AbstractItemExtensionCollection(); startPageJobExt.Add("DnsBinding", "job.quantumart.ru"); var startPageExtDictionary = new Dictionary <int, AbstractItemExtensionCollection> { { 2, startPageBaseExt }, { 3, startPageJobExt } }; aiRepositoryMoq.Setup(x => x.GetAbstractItemExtensionData(extensionId, It.Is <IEnumerable <int> >(ids => ids.Count() == 2 && ids.Contains(2) && ids.Contains(3)), It.IsAny <ContentPersistentData>(), buildSettings.LoadAbstractItemFieldsToDetailsCollection, buildSettings.IsStage, null)).Returns(startPageExtDictionary); //фабрика элементов структуры сайта 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(StartPage).Name) { return(new StartPage()); } return(null); }); var builder = new QpAbstractItemStorageBuilder(aiFactoryMoq.Object, Mock.Of <IQpUrlResolver>(), aiRepositoryMoq.Object, metaInfoMoq.Object, buildSettings, Mock.Of <ILogger <QpAbstractItemStorageBuilder> >()); var aiStorage = builder.Build(); //проверим, что стартовые страницы создались и в extension-полях у них то, что ожидается Assert.IsType <StartPage>(aiStorage.Get(2)); Assert.IsType <StartPage>(aiStorage.Get(3)); Assert.Equal("quantumart.ru", (aiStorage.Get(2) as StartPage).DnsBinding); Assert.Equal("job.quantumart.ru", (aiStorage.Get(3) as StartPage).DnsBinding); }