public async Task <bool> TryProcess(Input data) { var sender = new Profile(data.UserName, data.UserImageUrl); Profile item = new Profile(State.Name, State.ImageUrl); var twittData = new TwittData(item, sender); switch (State.Type) { case ImdbType.Movie: await _hub.SendMovieAsync(twittData); break; case ImdbType.Star: await _hub.SendStarAsync(twittData); break; } var counterId = new ActorId(State.Name); var counterProxy = ActorProxy.Create <IImdbCounter>(counterId); await counterProxy.IncrementAsync(State.Type, item); #region Log var logId = Constants.Singleton; var logProxy = ActorProxy.Create <IImdbFaults>(logId); await logProxy.Report($"Process: {State.Name}"); #endregion // Log return(true); }
public void NewPageFound_Returns_This_Page() { SitePage page = new SitePage { URL = "https://dummy/url" }; //pageSelectorForNewPages в данном тесте имеет осмысленную реализацию и выдает всегда одну страницу var stub = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = page }; IPageSelector pageSelectorForNewPages = stub; IFindAnimatedByPage animatedSelectorForNewImages = new Stubs.AnimatedSelectorStub(); IPageSelector pageSelectorForAnyPages = new Stubs.PageSelectorStub(); IFindAnimatedByPage findAnimatedByPage = new Stubs.FindAnimatedByPageStub(); IPageOrExternalImageSelector pageOrExternalImageSelector = new Stubs.PageOrExternalImageSelectorStub(); IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; //проверяем что он вернул Assert.IsNotNull(result); Assert.IsNotNull(result.Page); Assert.IsNull(result.Image, "Не очікувалося заповнення TwittData.Image"); Assert.AreSame(page, result.Page); }
public void LikeMovie(TwittData movie) { App.Current.Dispatcher.Invoke(() => { Events.Insert(0, movie); }); }
public void NewAnimated_Returns_PageAndImage() { var stub = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null //в этом тесте новых страниц нет, поэтому первый селектор вернет null }; IPageSelector pageSelectorForNewPages = stub; //а главную "роль" в тесте исполнит селектор новых аним.изображений - он должен вернуть AnimatedImage animatedImage = new AnimatedImage { BlobName = "code-geass:img1.gif", TweetDate = null //гифка новая даты твита не должно быть }; var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = new AnimatedImage[] { animatedImage } //стаб вернет этот результат }; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; //в этом тесте ожидается работа стаба FindPageByBlobNameStub - он должен "найти" страницу по имени блоба SitePage page = new SitePage { URL = "https://dummy/code-geass" }; var findPageByBlob = new Stubs.FindPageByBlobNameStub { DontThrowNotImpl = true, Result = page }; //имитируем найденную страницу... IFindPageByBlobName findPageByBlobName = findPageByBlob; IPageSelector pageSelectorForAnyPages = new Stubs.PageSelectorStub(); IFindAnimatedByPage findAnimatedByPage = new Stubs.FindAnimatedByPageStub(); IPageOrExternalImageSelector pageOrExternalImageSelector = new Stubs.PageOrExternalImageSelectorStub(); IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; //проверяем что он вернул Assert.IsNotNull(result); Assert.IsNotNull(result.Page); Assert.IsNotNull(result.Image); //для поиска должны передать строго то имя блоба, что мы предусмотрели тестом Assert.IsTrue(findPageByBlob.UsedBlobNameForFind == animatedImage.BlobName); Assert.AreSame(page, result.Page); Assert.AreSame(animatedImage, result.Image); }
public void LikeStar(TwittData star) { App.Current.Dispatcher.Invoke(() => { Events.Insert(0, star); }); }
public void NewAnimated_FindPageByBlobName_Returns_Null_Exception() { var stub = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null //в этом тесте новых страниц нет, поэтому первый селектор вернет null }; IPageSelector pageSelectorForNewPages = stub; //это часть урла, а блоб всегда содержит в начале такое же (до двоеточия) string codeGeassURLPart = "code-geass"; //а главную "роль" в тесте исполнит селектор новых аним.изображений - он должен вернуть AnimatedImage animatedImage = new AnimatedImage { BlobName = "code-geass:img1.gif", TweetDate = null //гифка новая даты твита не должно быть }; var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = new AnimatedImage[] { animatedImage } //стаб вернет этот результат }; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; //в этом тесте ожидается работа стаба FindPageByBlobNameStub - он должен НЕ найти страницу по имени блоба (вернуть null) //и это приведет в итоге к исключению var findPageByBlob = new Stubs.FindPageByBlobNameStub { DontThrowNotImpl = true, Result = null }; //имитируем найденную страницу... IFindPageByBlobName findPageByBlobName = findPageByBlob; IPageSelector pageSelectorForAnyPages = new Stubs.PageSelectorStub(); IFindAnimatedByPage findAnimatedByPage = new Stubs.FindAnimatedByPageStub(); IPageOrExternalImageSelector pageOrExternalImageSelector = new Stubs.PageOrExternalImageSelectorStub(); IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); try { TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; } catch (AggregateException aggrEx) { ApplicationException appEx = (ApplicationException)aggrEx.InnerExceptions[0]; //это и должно было произойти. В тексте наш спец.текст Assert.IsTrue(appEx.Message.Contains("Find page by blob name failed for")); Assert.IsTrue(appEx.Message.Contains(codeGeassURLPart)); } }
void _PageFoundBody(AnimatedImage[] resultForFindAnimated) { SitePage page = new SitePage { URL = "https://dummy/url" }; //pageSelectorForNewPages в данном тесте выдает null чтобы логика прошла дальше (нет новых страниц) var stubNewPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null }; //этот стаб вернет null (нет новых аним.изображений) var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = null }; IPageSelector pageSelectorForNewPages = stubNewPages; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; IFindPageByBlobName findPageByBlobName = new Stubs.FindPageByBlobNameStub(); var stubAnyPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = page }; //Главный "герой" этого теста - должен вернуть одну страницу (ее когда-то твитили, но уже давно) IPageSelector pageSelectorForAnyPages = stubAnyPages; //в нашем тесте этот универсальный поиск выдает null (нет аним.изображений для страницы) var stubFindAnimated = new Stubs.FindAnimatedByPageStub { DontThrowNotImpl = true, Result = resultForFindAnimated }; IFindAnimatedByPage findAnimatedByPage = stubFindAnimated; IPageOrExternalImageSelector pageOrExternalImageSelector = new Stubs.PageOrExternalImageSelectorStub(); IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; //проверяем что он вернул Assert.IsNotNull(result); Assert.IsNotNull(result.Page); Assert.IsNull(result.Image, "Не очікувалося заповнення TwittData.Image"); Assert.AreSame(page, result.Page); }
public void No_Page_For_Twitting() { //этот аналог важен для покрытия кода var stubNewPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null }; //этот стаб вернет null (нет новых аним.изображений) var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = null }; IPageSelector pageSelectorForNewPages = stubNewPages; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; IFindPageByBlobName findPageByBlobName = new Stubs.FindPageByBlobNameStub(); var stubAnyPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null //Это ситуация которую моделирует тест - такое не должно быть в реальной системе (и будет выброс исключения) }; IPageSelector pageSelectorForAnyPages = stubAnyPages; //в нашем тесте этот универсальный поиск выдает null (нет аним.изображений для страницы) var stubFindAnimated = new Stubs.FindAnimatedByPageStub { DontThrowNotImpl = true, Result = null }; IFindAnimatedByPage findAnimatedByPage = stubFindAnimated; IPageOrExternalImageSelector pageOrExternalImageSelector = new Stubs.PageOrExternalImageSelectorStub(); IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); try { TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; Assert.Fail("Ожидался выброс исключения ApplicationException так как селектор pageSelectorForAnyPages вернул null (чего быть в работе не должно никогда)"); } catch (System.AggregateException aggrEx) { ApplicationException appEx = (ApplicationException)aggrEx.InnerExceptions[0]; //это и должно было произойти. В тексте наш спец.текст Assert.IsTrue(appEx.Message.Contains("No page found for twitting")); } }
public async Task <TwittData> GetPageForTwitting() { TwittData twittData = new TwittData { Page = ResultPage }; Task <TwittData> task = new Task <TwittData>(() => { return(twittData); }); task.Start(); return(await task); }
public void LikeMovie(TwittData movie) { try { Clients.All.BroadcastLikeMovie(movie); } #region Exception Handling catch (Exception ex) { ServiceEventSource.Current.ErrorMessage(ex); } #endregion // Exception Handling }
public void LikeStar(TwittData star) { try { Clients.All.BroadcastLikeStar(star); } #region Exception Handling catch (Exception ex) { ServiceEventSource.Current.ErrorMessage(ex); } #endregion // Exception Handling }
public void LastTweetUpdater_ForPage_And_Animated_Test() { //тест дата твита var dtNow1 = new DateTime(2020, 10, 14, 0, 0, 0); var nowDate = new SelectLogic.Stubs.DateSupplyStub { Now = dtNow1 }; var animatedTweetDateUpdaterStub = new Stubs.AnimatedTweetDateUpdaterStub { DontThrowNotImpl = true }; var pageUpdStub = new Stubs.SitePageTweetDateUpdaterStub { DontThrowNotImpl = true //режим работы правильный }; var upd = new LastTweetUpdater(nowDate, animatedTweetDateUpdaterStub, pageUpdStub); var page = new db.SitePage { Title = "https://kawaii-mobile.com/2020/10/uchuu-no-stellvia/", URL = "Uchuu no Stellvia" }; var img = new db.AnimatedImage { BlobName = "uchuu-no-stellvia", }; TwittData data = new TwittData { Image = img, Page = page }; upd.UpdateLastTweetDate(data); Assert.IsTrue(pageUpdStub.CalledDate == dtNow1); Assert.AreSame(pageUpdStub.CalledPage, page); Assert.IsTrue(animatedTweetDateUpdaterStub.CalledDate == dtNow1); Assert.AreSame(animatedTweetDateUpdaterStub.CalledImage, img); }
public async Task SendMovieAsync(TwittData data) { IImdbEvents e = GetEvent <IImdbEvents>(); // Clients can listen for the event // (events shouldn't be used for Actor's internal communication) // when ready Rx 3 will be the publication mechanism e.LikeMovie(data); #region Log var logId = Constants.Singleton; var logProxy = ActorProxy.Create <IImdbFaults>(logId); await logProxy.Report($"Raise Movie Event: {data.Name}"); #endregion // Log }
public async Task SendStarAsync(TwittData data) { ActorEventSource.Current.ActorMessage(this, data.Name); // Clients can listen for the event // (events shouldn't be used for Actor's internal communication) // when ready Rx 3 will be the publication mechanism IImdbEvents e = GetEvent <IImdbEvents>(); e.LikeStar(data); #region Log var logId = Constants.Singleton; var logProxy = ActorProxy.Create <IImdbFaults>(logId); await logProxy.Report($"Raise Star Event: {data.Name}"); #endregion // Log }
public void LastTweetUpdater_UpdateLastTweetDate_PageNull_Test() { var nowDate = new SelectLogic.Stubs.DateSupplyStub(); var animatedTweetDateUpdaterStub = new Stubs.AnimatedTweetDateUpdaterStub(); var pageUpdStub = new Stubs.SitePageTweetDateUpdaterStub(); var upd = new LastTweetUpdater(nowDate, animatedTweetDateUpdaterStub, pageUpdStub); try { TwittData data = new TwittData(); upd.UpdateLastTweetDate(data); Assert.Fail("Очікувалося виключення ArgumentNullException"); } catch (ArgumentNullException ex) { Assert.IsTrue(ex.ParamName == "data"); Assert.IsTrue(ex.Message.Contains("data.Page")); } }
public void LastTweetUpdater_ForPage_Only_Test() { //тест дата твита var dtNow1 = new DateTime(2020, 10, 14, 0, 0, 0); var nowDate = new SelectLogic.Stubs.DateSupplyStub { Now = dtNow1 }; //это в данном тесте не применяется (и выбросит исключение если туда пройдет) var animatedTweetDateUpdaterStub = new Stubs.AnimatedTweetDateUpdaterStub(); var pageUpdStub = new Stubs.SitePageTweetDateUpdaterStub { DontThrowNotImpl = true //режим работы правильный }; var upd = new LastTweetUpdater(nowDate, animatedTweetDateUpdaterStub, pageUpdStub); var page = new db.SitePage { Title = "https://kawaii-mobile.com/2020/10/uchuu-no-stellvia/", URL = "Uchuu no Stellvia" }; TwittData data = new TwittData { Image = null, Page = page }; upd.UpdateLastTweetDate(data); Assert.IsTrue(pageUpdStub.CalledDate == dtNow1); Assert.AreSame(pageUpdStub.CalledPage, page); }
public void PageFound_And_AnimatedFound_Random_Select_PageOnly() { //Тест-кейс: найдена не-новая страница и у нее есть внешние изображения. Рандомизированный выбор "решил" что их не нужно использовать SitePage page = new SitePage { URL = "https://dummy/url" }; //pageSelectorForNewPages в данном тесте выдает null чтобы логика прошла дальше (нет новых страниц) var stubNewPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null }; //этот стаб вернет null (нет новых аним.изображений) var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = null }; IPageSelector pageSelectorForNewPages = stubNewPages; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; IFindPageByBlobName findPageByBlobName = new Stubs.FindPageByBlobNameStub(); var stubAnyPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = page }; //Главный "герой" этого теста - должен вернуть одну страницу (ее когда-то твитили, но уже давно) IPageSelector pageSelectorForAnyPages = stubAnyPages; //аним.изображения найдены, но их не будем использовать AnimatedImage[] animatedImgs = new AnimatedImage[] { //здесь нам не важно что - оно просто должно быть, тест "не выбирает" это new AnimatedImage() { BlobName = "dummy", TweetDate = new DateTime(2020, 04, 26, 00, 00, 00) } }; var stubFindAnimated = new Stubs.FindAnimatedByPageStub { DontThrowNotImpl = true, Result = animatedImgs }; IFindAnimatedByPage findAnimatedByPage = stubFindAnimated; //этот стаб имитирует "случайное решение" о том использовать ли изобр.со страницы , или внешнее анимированное. //В этом тесте он всегда выбирает "со страницы" var stubRandomPageOrImg = new Stubs.PageOrExternalImageSelectorStub(); stubRandomPageOrImg.DontThrowNotImpl = true; stubRandomPageOrImg.UseExternalAnimatedImage = false; //именно это важно для данного теста IPageOrExternalImageSelector pageOrExternalImageSelector = stubRandomPageOrImg; IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = new Stubs.AnimatedSelectorWithExcludeLastStub(); var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; //проверяем что он вернул Assert.IsNotNull(result); Assert.IsNotNull(result.Page); Assert.IsNull(result.Image, "Не очікувалося заповнення TwittData.Image"); Assert.AreSame(page, result.Page); }
public async void LikeMovie(TwittData movie) { await NotifyAsync(nameof(ImdbHub.LikeMovie), movie); }
public async void LikeStar(TwittData star) { await NotifyAsync(nameof(ImdbHub.LikeStar), star); }
public void PageFound_And_AnimatedFound_Random_Select_Animated() { //Тест-кейс: найдена не-новая страница и у нее есть внешние изображения. Рандомизированный выбор "решил" использовать одно из них SitePage page = new SitePage { URL = "https://kawaii-mobile.com/oregairu" }; //pageSelectorForNewPages в данном тесте выдает null чтобы логика прошла дальше (нет новых страниц) var stubNewPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = null }; //этот стаб вернет null (нет новых аним.изображений) var animNewStub = new Stubs.AnimatedSelectorStub { DontThrowNotImpl = true, Result = null }; IPageSelector pageSelectorForNewPages = stubNewPages; IFindAnimatedByPage animatedSelectorForNewImages = animNewStub; IFindPageByBlobName findPageByBlobName = new Stubs.FindPageByBlobNameStub(); var stubAnyPages = new Stubs.PageSelectorStub { DontThrowNotImpl = true, Result = page }; IPageSelector pageSelectorForAnyPages = stubAnyPages; var anim1 = new AnimatedImage { BlobName = "oregairu:img1.gif", TweetDate = new DateTime(2020, 04, 26, 00, 00, 00) }; var anim2 = new AnimatedImage { BlobName = "oregairu:yukinoshita.gif", TweetDate = new DateTime(2020, 01, 10, 22, 10, 00) }; var anim3 = new AnimatedImage { BlobName = "oregairu:hatiman.gif", TweetDate = new DateTime(2020, 02, 08, 08, 00, 00) }; //аним.изображения найдены, тест использует всегда одно из них (anim2) AnimatedImage[] animatedImgs = new AnimatedImage[] { anim1, anim2, anim3 }; var stubFindAnimated = new Stubs.FindAnimatedByPageStub { DontThrowNotImpl = true, Result = animatedImgs }; IFindAnimatedByPage findAnimatedByPage = stubFindAnimated; //этот стаб имитирует "случайное решение" о том использовать ли изобр.со страницы , или внешнее анимированное. //В этом тесте он всегда выбирает "со страницы" var stubRandomPageOrImg = new Stubs.PageOrExternalImageSelectorStub(); stubRandomPageOrImg.DontThrowNotImpl = true; stubRandomPageOrImg.UseExternalAnimatedImage = true; //именно это важно для данного теста IPageOrExternalImageSelector pageOrExternalImageSelector = stubRandomPageOrImg; var animSelectorStub = new Stubs.AnimatedSelectorWithExcludeLastStub { DontThrowNotImpl = true, Result = anim2 }; IAnimatedSelectorWithExcludeLast animatedSelectorWithExcludeLast = animSelectorStub; var pageForTwittingSelector = new kawaii.twitter.core.SelectLogic.PageForTwittingSelector(pageSelectorForNewPages, animatedSelectorForNewImages, pageSelectorForAnyPages, findAnimatedByPage, pageOrExternalImageSelector, animatedSelectorWithExcludeLast, new TweetCreator.Stubs.Logger()); TwittData result = pageForTwittingSelector.GetPageForTwitting().Result; //проверяем что он вернул Assert.IsNotNull(result); Assert.IsNotNull(result.Page); //в тесте ожидается что вернут и изображение что мы указали Assert.IsNotNull(result.Image); Assert.AreSame(result.Image, anim2); Assert.AreSame(page, result.Page); }
public async Task Execute() { //получаем вариант твита из селектора... TwittData data = await _Selector.GetPageForTwitting(); _Log.Log("_Selector.GetPageForTwitting done: {0}", DateTime.Now); string imageFileName; byte[] imageBody; string url = data.Page.URL; if (data.Image != null) { _Log.Log("External gif image will be used: {0}", DateTime.Now); //нужно сделать твит но изображение берем из указанного,тело файла - его надо получить из блоб-сервиса imageFileName = data.Image.GetFileName(); imageBody = await _BlobDownload.GetBlobBody(data.Image.BlobName); _Log.Log("External gif image downloaded: {0}", DateTime.Now); } else { _Log.Log("Post image will be used: {0}", DateTime.Now); //изображение твита будем брать случайное прямо из поста string imgURL = await _TwitterImageURL.GetTwitterImageFileURL(url); if (string.IsNullOrEmpty(imgURL)) { throw new ApplicationException("Can't found image url for post:" + url); } _Log.Log("Post image - _ImageOnWeb.Download start: {0}", DateTime.Now); //скачать из инета изображение.. нужно его имя файла и тело ImageInfo imgInfo = await _ImageOnWeb.Download(imgURL); imageFileName = imgInfo.FileName; imageBody = imgInfo.Body; _Log.Log("Post image downloaded: {0}", DateTime.Now); } string postTitle = data.Page.Title; //тайтл берем из базы, но изначально он был взят из html-тела, убираем спец.коды html string postTitleDecoded = WebUtility.HtmlDecode(postTitle); string tweetText = _TwitterTextCreator.CreateTwitterText(url, postTitleDecoded); await _TwitterService.TweetWithMedia(tweetText, imageFileName, imageBody); _Log.Log("TweetWithMedia done: {0}", DateTime.Now); //после успешного твита обновить в базе даты _LastTweetUpdater.UpdateLastTweetDate(data); _Log.Log("UpdateLastTweetDate done: {0}", DateTime.Now); }