Exemplo n.º 1
0
        public IMongoCollection <SitePage> CreateSitePagesTestDB(string collectionName)
        {
            string connString = "mongodb://localhost:27017/?readPreference=primary&appname=kawaiitwitter&ssl=false";
            string dbName     = "unit-test-kawaii";

            var db = new Database(connString, false, dbName);

            SitePageCollection sitePageCollection = new SitePageCollection(db, collectionName, true);
            var sitePages = sitePageCollection.SitePages;

            //коллекцию очистить от данных
            var delFilter = Builders <SitePage> .Filter.Exists(x => x.URL);

            sitePages.DeleteMany(delFilter);

            //Загружаем в базу тест данные

            var loader = new Stubs.XMLSiteMapLoaderStub
            {
                Result = SamplePostsDatabase.PostURLs                 //этот результат будет имитирован
            };

            var logger = new Stubs.LoggerStub();

            DatabaseFromSitemapUpdater dbUpd = new DatabaseFromSitemapUpdater(sitePages);

            dbUpd.UpdateFromSitemap(SITEMAP_URL, loader, logger).Wait();

            return(sitePages);
        }
Exemplo n.º 2
0
        IMongoCollection <SitePage> _PrepareSitePagesCollection()
        {
            string connString = "mongodb://localhost:27017/?readPreference=primary&appname=kawaiitwitter&ssl=false";
            string dbName     = "unit-test-kawaii";
            string collName   = "page-selector-halloween-pages";

            var db = new Database(connString, false, dbName);
            var sitePagesCollection = new SitePageCollection(db, collName, true);
            var pages = sitePagesCollection.SitePages;

            //удаляем все записи, заполняем тест данными
            var delFilter = Builders <SitePage> .Filter.Exists(x => x.URL);

            pages.DeleteMany(delFilter);

            SitePage[] pagesToAdd = new SitePage[]
            {
                SamplePages.PagePrincessReDive, SamplePages.PageSpeedGrapher, SamplePages.PageGleipnir, SamplePages.PageHameFura,
                SamplePages.PageHalloween2013, SamplePages.PageHalloween2014, SamplePages.PageHalloween2015, SamplePages.PageHalloween2019
            };

            pages.InsertMany(pagesToAdd);

            return(pages);
        }
Exemplo n.º 3
0
        IMongoCollection <SitePage> _PrepareSitePagesCollection(bool doEmptyCollection, bool doAllWithTweetDate)
        {
            string connString = "mongodb://localhost:27017/?readPreference=primary&appname=kawaiitwitter&ssl=false";
            string dbName     = "unit-test-kawaii";
            string collName   = "not-twitted-pages";

            var db = new Database(connString, false, dbName);
            var sitePagesCollection = new SitePageCollection(db, collName, true);
            var pages = sitePagesCollection.SitePages;

            //удаляем все записи, заполняем тест данными
            var delFilter = Builders <SitePage> .Filter.Exists(x => x.URL);

            pages.DeleteMany(delFilter);

            if (doEmptyCollection)
            {
                return(pages);                  //на этом все - пустая коллекция
            }
            SitePage[] pagesToAdd = new SitePage[] { _PagePrincessReDive, _PageSpeedGrapher, _PageGleipnir, _PageHameFura, _PageMagiaRecord, _PageHatarakuSaibou };

            if (doAllWithTweetDate)
            {
                //здесь чуть сложнее - клонируем исходные данные, чтобы потенциально не мешать другим, и прошьем дату всем (порядок и разм.массива достаточна для тех, у кого нет своей даты твита)

                DateTime[] tweedDates = new DateTime[] { _PagePrincessReDiveTweetDate, _PageSpeedGrapherTweetDate, _PageGleipnirTweetDate, _PageHameFuraTweetDate };

                SitePage[] pagesToAddCloned = new SitePage[pagesToAdd.Length];
                for (int i = 0; i < pagesToAdd.Length; i++)
                {
                    var srcPage = pagesToAdd[i];

                    var pg = new SitePage
                    {
                        Blocked      = srcPage.Blocked,
                        LastModified = srcPage.LastModified,
                        SpecialDay   = srcPage.SpecialDay,
                        Title        = srcPage.Title,
                        TweetDate    = srcPage.TweetDate,
                        URL          = srcPage.URL
                    };

                    if (pg.TweetDate == null)
                    {
                        pg.TweetDate = tweedDates[i];
                    }

                    pagesToAddCloned[i] = pg;
                }                //for i

                pagesToAdd = pagesToAddCloned;
            }

            pages.InsertMany(pagesToAdd);

            return(pages);
        }
Exemplo n.º 4
0
        IMongoCollection <SitePage> _PrepareSitePagesEmptyCollection()
        {
            string connString = "mongodb://localhost:27017/?readPreference=primary&appname=kawaiitwitter&ssl=false";
            string dbName     = "unit-test-kawaii";
            string collName   = "page-selector-pages";

            var db = new Database(connString, false, dbName);
            var sitePagesCollection = new SitePageCollection(db, collName, true);
            var pages = sitePagesCollection.SitePages;

            //удаляем все записи, заполняем тест данными
            var delFilter = Builders <SitePage> .Filter.Exists(x => x.URL);

            pages.DeleteMany(delFilter);

            //будет пустая коллекция
            return(pages);
        }
Exemplo n.º 5
0
        public void FindPageByBlobName_Normal_Find()
        {
            string connString = "mongodb://localhost:27017/?readPreference=primary&appname=kawaiitwitter&ssl=false";
            string dbName     = "unit-test-kawaii";
            string collName   = "sitepages-find-page-by-blobname";

            var db = new Database(connString, false, dbName);

            SitePageCollection sitePageCollection = new SitePageCollection(db, collName, true);
            var sitePages = sitePageCollection.SitePages;

            //коллекцию очистить от данных
            var delFilter = Builders <SitePage> .Filter.Exists(x => x.URL);

            sitePages.DeleteMany(delFilter);

            //заполняем тест-данные
            var page2 = new SitePage()
            {
                Blocked      = false,
                SpecialDay   = null,
                Title        = "Shuumatsu no Izetta",
                LastModified = new DateTime(2020, 04, 25),
                TweetDate    = null,
                URL          = "https://kawaii-mobile.com/2017/01/shuumatsu-no-izetta/"
            };

            List <SitePage> pagesForTest = new List <SitePage>()
            {
                new SitePage()
                {
                    Blocked = false, SpecialDay = null, Title = "Princess connect! Re:Dive", LastModified = new DateTime(2020, 04, 26), TweetDate = null, URL = "https://kawaii-mobile.com/2020/08/princess-connect-redive/"
                },
                page2,
                new SitePage()
                {
                    Blocked = false, SpecialDay = null, Title = "Gleipnir", LastModified = new DateTime(2020, 04, 23), TweetDate = null, URL = "https://kawaii-mobile.com/2020/07/gleipnir/"
                },
            };

            sitePages.InsertMany(pagesForTest);

            string blobName = "shuumatsu-no-izetta:image1.gif";

            var queryAble = sitePages.AsQueryable();

            var fnd    = new FindPageByBlobName(queryAble, new BlobNameToURLPart());
            var result = fnd.Find(blobName).Result;

            //сверим что мы нашли -
            Assert.IsNotNull(result);
            Assert.IsTrue(result.URL == page2.URL, "URL");
            Assert.IsTrue(result.Blocked == page2.Blocked, "Blocked");
            Assert.IsTrue(result.Title == page2.Title, "Title");
            Assert.IsTrue(result.LastModified == page2.LastModified, "LastModified");
            Assert.IsTrue(result.TweetDate == page2.TweetDate, "TweetDate");

            //и еще тест на "не нашли"
            string blobNot   = "rezero:image1.gif";
            var    resultNot = fnd.Find(blobNot).Result;

            Assert.IsTrue(resultNot == null, "Ожидался возврат resultNot == null");
        }
Exemplo n.º 6
0
        public static async Task Run([TimerTrigger("0 0 * * * *")] TimerInfo timer, ILogger log)
        {
            //https://docs.microsoft.com/ru-ru/azure/azure-functions/functions-bindings-timer?tabs=csharp#ncrontab-expressions
            //0 */5 * * * * - каждые 5 мин
            //"0 0 * * * *"	- каждый час

            Logger logger = new Logger(log);

            logger.Log($"TweetPostFunction executed at: {DateTime.Now}");

            string animatedBlobConnectionString = kawaii.twitter.core.Env.EnvironmentSecureData.GetValueFromEnvironment("env:kawaii_twitter_azure_animatedblob");
            string azureSiteDBConnectionString  = kawaii.twitter.core.Env.EnvironmentSecureData.GetValueFromEnvironment("env:kawaii_twitter_azure_sitepages");

            if (string.IsNullOrEmpty(animatedBlobConnectionString))
            {
                logger.LogError("animatedBlobConnectionString not found!");
                return;
            }

            if (string.IsNullOrEmpty(azureSiteDBConnectionString))
            {
                logger.LogError("azureSiteDBConnectionString not found!");
                return;
            }

            IDatabase database = new Database(azureSiteDBConnectionString, true, null);

            logger.Log($"database connected: {DateTime.Now}");

            //если в переменных задано что "не обновлять индексы", то мы сэкономим время работы в прод-окружении - индексы создаются один раз,
            //и дальше и так работают, хотя MongoDB и говорит что "нет проблем".
            //Если будет нужно обновлять индексы, или будет новое окружение (новая база, коллекция и прочее) то эту переменную среды надо убрать.
            //А когда все настроено и уже работает, ее можно создать для общего ускорения
            string dontCreateIndexesStr = kawaii.twitter.core.Env.EnvironmentSecureData.GetValueFromEnvironment("env:kawaii_twitter_dont_create_indexes");
            bool   dontCreateIndexes    = false;

            if (!string.IsNullOrEmpty(dontCreateIndexesStr))
            {
                bool.TryParse(dontCreateIndexesStr, out dontCreateIndexes);
            }

            if (dontCreateIndexes)
            {
                logger.Log("Indexes will not updated (found env:kawaii_twitter_dont_create_indexes)");
            }

            AnimatedImageCollection animatedImageCollection = new AnimatedImageCollection(database, null, !dontCreateIndexes);
            var imagesCollection = animatedImageCollection.AnimatedImages;

            logger.Log($"imagesCollection init done: {DateTime.Now}");

            SitePageCollection sitePageCollection = new SitePageCollection(database, null, !dontCreateIndexes);
            var sitePagesCollection = sitePageCollection.SitePages;

            logger.Log($"sitePagesCollection init done: {DateTime.Now}");

            ITwitterTextCreator textCreator     = new kawaii.twitter.core.Text.TwitterTextCreator();
            IImageOnWeb         imageOnWeb      = new kawaii.twitter.core.HtmlParsers.ImageOnWeb(_HttpClient);
            ITwitterImageURL    twitterImageURL = new kawaii.twitter.core.HtmlParsers.TwitterImageURL(_HttpClient);

            //--- блок для lastTweetUpdater
            var dateSupply = new kawaii.twitter.core.Env.DateSupply();

            IAnimatedTweetDateUpdater animatedTweetDateUpdater = new AnimatedTweetDateUpdater(imagesCollection);
            ISitePageTweetDateUpdater sitePageTweetDateUpdater = new SitePageTweetDateUpdater(sitePagesCollection);
            ILastTweetUpdater         lastTweetUpdater         = new kawaii.twitter.core.SelectLogic.LastTweetUpdater(dateSupply, animatedTweetDateUpdater, sitePageTweetDateUpdater);
            //---

            //сервису твиттера нужно передать авториз.данные
            var service = new kawaii.twitter.core.TwitterService.Service();

            var           animatedImagesBlobContainer = new AnimatedImagesBlobContainer(animatedBlobConnectionString);
            IBlobDownload blobDownload = animatedImagesBlobContainer;

            var randomSelector = new kawaii.twitter.core.SelectLogic.Randomize.RandomSelector();

            int topQueryCount = 10;

            ISpecialDaySelector specialDaySelector = new SpecialDaySelector(dateSupply, randomSelector);
            string specialDayName = specialDaySelector.DetectSpecialDayName();

            IFolderFromURL folderFromURL = new kawaii.twitter.core.SelectLogic.URL.FolderFromURL();
            var            formatter     = new kawaii.twitter.core.SelectLogic.BlobName.Formatter();

            IPageSelector       pageSelectorForNewPages = new kawaii.twitter.core.SelectLogic.Page.NotTwittedPages(sitePagesCollection, randomSelector, specialDayName, topQueryCount);
            IFindAnimatedByPage findNewAnimatedByPage   = new kawaii.twitter.core.SelectLogic.Images.Newly.NotTwittedAnimated(imagesCollection, randomSelector, topQueryCount, folderFromURL, formatter);

            IPageSelector pageSelectorForAnyPages = new kawaii.twitter.core.SelectLogic.Page.PageSelector(sitePagesCollection, randomSelector, specialDayName, topQueryCount);

            IFindAnimatedByPage findAnimatedByPage = new kawaii.twitter.core.SelectLogic.Images.Find.FindAnimatedByPage(imagesCollection.AsQueryable(), folderFromURL, formatter);

            IPageOrExternalImageSelector pageOrExternalImageSelector = new kawaii.twitter.core.SelectLogic.PageOrExternalImage.PageOrExternalImageSelector();

            IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new kawaii.twitter.core.SelectLogic.Images.ExcludeUsed.AnimatedSelectorWithExcludeLast();

            IPageForTwittingSelector pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, findNewAnimatedByPage, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, logger);

            var tweetCreator = new kawaii.twitter.core.TweetCreator(pageForTwittingSelector, textCreator, twitterImageURL, imageOnWeb, blobDownload, service, lastTweetUpdater, logger);

            logger.Log($"tweetCreator.Execute: {DateTime.Now}");

            //выполнить твит заданной страницы и изображения
            await tweetCreator.Execute();
        }