示例#1
0
        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)));
            }
        }
示例#4
0
        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);
        }
示例#5
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);
        }
示例#6
0
        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);
        }