Example #1
0
        public void TweetCreator_OneTweet_Test()
        {
            var testDB = new TestDB();
            var sitePagesCollection = testDB.CreateSitePagesTestDB("tweetcreator_sitepages_1");
            var animatedCollection  = testDB.CreateAnimatedTestDB("tweetcreator_animated_1");

            HttpClient httpClient = new HttpClient();

            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
            DateTime nowDate = new DateTime(2020, 04, 26, 10, 00, 00);

            var dateSupply = new SelectLogic.Stubs.DateSupplyStub
            {
                Now = nowDate
            };

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

            var           service      = new Stubs.TwitterServiceStub();  //стаб для анализа (проверим что в него попадет в итоге)
            IBlobDownload blobDownload = new Stubs.BlobDownloadStub();    //в данном тесте он не применяется (выбросит исключение)

            //селектор - главная вещь, но здесь он будет "простой"
            //Мы берем в обработку одну страницу:
            string url = "https://kawaii-mobile.com/2020/10/uchuu-no-stellvia/";

            var findResultStellvia = sitePagesCollection.FindAsync(x => x.URL == url).Result;
            var pageStellvia       = findResultStellvia.FirstOrDefault();

            var selector = new Stubs.PageForTwittingSelectorStub
            {
                ResultPage = pageStellvia
            };

            var creator = new kawaii.twitter.core.TweetCreator(selector, textCreator, twitterImageURL, imageOnWeb, blobDownload, service, lastTweetUpdater, new Stubs.Logger());

            creator.Execute().Wait();

            //проверка состояния базы после данной операции:

            var findResultStellvia2 = sitePagesCollection.FindAsync(x => x.URL == url).Result;
            var pageStellvia2       = findResultStellvia2.FirstOrDefault();

            //1) должна быть дата твита - та что мы задали
            Assert.IsTrue(pageStellvia2.TweetDate == nowDate);

            //2) проверяем, что там прислали в "твит-текст"
            Assert.IsNotNull(service.ResultText);
            Assert.IsTrue(service.ResultText.Contains(url));

            //3) TODO@: проверить остальное - текст, хештеги, тело изображения
        }
Example #2
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();
        }