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); }
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); }
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); }
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); }
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"); }
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(); }