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