public async Task ShouldNotShowUnfilledItemsOnTap() { var navigation = Navigation; navigation.Setup(n => n.Navigate <StoryViewModel, IStory>(It.IsAny <IStory>(), It.IsAny <MvxBundle>(), It.IsAny <CancellationToken>())) .ReturnsAsync(true) .Verifiable(); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(new List <int> { 99 }); var sut = new MockNewsViewModel(navigation.Object, Messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); sut.ShowStoryCommand.TryExecute(sut.Stories[0]); Assert.False(sut.ShowStoryCommand.CanExecute(sut.Stories[0])); navigation.Verify(n => n.Navigate <StoryViewModel, IStory>(It.IsAny <IStory>(), It.IsAny <MvxBundle>(), It.IsAny <CancellationToken>()), Times.Never); }
public async Task ShouldPurgeAndReloadItemsOnRefresh() { var items = Enumerable.Range(0, 20).ToList(); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) // ReSharper disable once AccessToModifiedClosure .ReturnsAsync(() => items) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); items = Enumerable.Range(0, 19).ToList(); sut.RefreshCommand.TryExecute(); var ids = sut.Stories.Select(x => x.Id).ToList(); Assert.All(sut.Stories, vm => Assert.Contains(vm.Id, items)); Assert.All(items, item => Assert.Contains(item, ids)); Assert.DoesNotContain(sut.Stories, vm => vm.Id == 19); news.Verify(n => n.GetStoryListAsync(It.IsAny <StoryKind>()), Times.Exactly(2)); }
public async Task TappingAnItemShowsItInExternalBrowser() { var item = new Item { Id = 99, Type = ItemType.Story, Url = "https://kipters.net" }; var navigation = Navigation; navigation.Setup(n => n.Navigate <StoryViewModel, IStory>(item, It.IsAny <IMvxBundle>(), It.IsAny <CancellationToken>())) .ReturnsAsync(true); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(new List <int> { item.Id }); Action <NewsItemMessage> callback = null; var messenger = new Mock <IMvxMessenger>(); messenger.Setup(m => m.Subscribe(It.IsAny <Action <NewsItemMessage> >(), It.IsAny <MvxReference>(), It.IsAny <string>())) .Callback((Action <NewsItemMessage> action, MvxReference mvxref, string tag) => callback = action) .Returns(new MvxSubscriptionToken(Guid.NewGuid(), () => { })); var features = Features; features.Setup(f => f.IsEnabled(F.OpenStoryInCustomBrowser)) .Returns(false); var browser = Browser; string actualUrl = null; browser.Setup(b => b.ShowInBrowserAsync(It.IsAny <Uri>(), true)) .Callback((Uri u, bool _) => actualUrl = u.OriginalString) .ReturnsAsync(true) .Verifiable(); var sut = new MockNewsViewModel(navigation.Object, messenger.Object, news.Object, Reachability.Object, features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); callback(new NewsItemMessage(news.Object, item)); sut.ShowStoryCommand.TryExecute(sut.Stories[0]); browser.Verify(); Assert.Same(item.Url, actualUrl); }
public async Task TappingAnItemShowsItInCustomBrowser() { var item = new Item { Id = 99, Type = ItemType.Story }; IStory paramItem = null; var navigation = Navigation; navigation.Setup(n => n.Navigate <StoryViewModel, IStory>(item, It.IsAny <IMvxBundle>(), It.IsAny <CancellationToken>())) .Callback((IStory param, IMvxBundle bundle, CancellationToken token) => paramItem = param) .ReturnsAsync(true) .Verifiable(); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(new List <int> { item.Id }); Action <NewsItemMessage> callback = null; var messenger = new Mock <IMvxMessenger>(); messenger.Setup(m => m.Subscribe(It.IsAny <Action <NewsItemMessage> >(), It.IsAny <MvxReference>(), It.IsAny <string>())) .Callback((Action <NewsItemMessage> action, MvxReference mvxref, string tag) => callback = action) .Returns(new MvxSubscriptionToken(Guid.NewGuid(), () => { })); var features = Features; features.Setup(f => f.IsEnabled(F.OpenStoryInCustomBrowser)) .Returns(true); var sut = new MockNewsViewModel(navigation.Object, messenger.Object, news.Object, Reachability.Object, features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); callback(new NewsItemMessage(news.Object, item)); sut.ShowStoryCommand.TryExecute(sut.Stories[0]); navigation.Verify(); Assert.Same(item, paramItem); }
public async Task ShowErrorMessageIfFetchFails() { var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .Throws <Exception>() .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); news.Verify(n => n.GetStoryListAsync(It.IsAny <StoryKind>()), Times.Once); Assert.True(sut.LoadingTask.IsFaulted); Assert.False(string.IsNullOrWhiteSpace(sut.LoadingTask.ErrorMessage)); }
public async Task ShowErrorMessageIfNetworkIsDown() { var reachability = new Mock <IReachabilityService>(); reachability.Setup(r => r.IsConnectionAvailable) .Returns(false) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, News.Object, reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); reachability.VerifyGet(r => r.IsConnectionAvailable, Times.Once); Assert.True(sut.LoadingTask.IsCompleted); Assert.False(sut.LoadingTask.IsNotCompleted); }
public async Task DontRequestNewsIfNetworkIsDown() { var reachability = new Mock <IReachabilityService>(); reachability.Setup(r => r.IsConnectionAvailable) .Returns(false); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(Enumerable.Range(0, 20).ToList()) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, news.Object, reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); news.Verify(n => n.GetStoryListAsync(It.IsAny <StoryKind>()), Times.Never); }
public async Task FetchTheRightKindOfStories(StoryKind storyKind) { var items = Enumerable.Range(0, 20).ToList(); var news = News; var actualStoryKind = StoryKind.Best; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .Callback((StoryKind sk) => actualStoryKind = sk) .ReturnsAsync(items) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); sut.SetStoryKind(storyKind); await sut.Initialize(); sut.ViewCreated(); Assert.Equal(storyKind, actualStoryKind); news.Verify(n => n.GetStoryListAsync(storyKind), Times.Once); }
public async Task PrepareStoriesWithUnfilledItems() { var items = Enumerable.Range(0, 20).ToList(); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(items) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, Messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); var ids = sut.Stories.Select(x => x.Id).ToList(); Assert.All(sut.Stories, vm => Assert.Contains(vm.Id, items)); Assert.All(items, item => Assert.Contains(item, ids)); Assert.True(sut.LoadingTask.IsCompleted); news.Verify(n => n.GetStoryListAsync(It.IsAny <StoryKind>()), Times.Once); }
public async Task FillItemsAsTheyCome() { Action <NewsItemMessage> callback = null; var messenger = new Mock <IMvxMessenger>(); messenger.Setup(m => m.Subscribe(It.IsAny <Action <NewsItemMessage> >(), It.IsAny <MvxReference>(), It.IsAny <string>())) .Callback((Action <NewsItemMessage> action, MvxReference mvxref, string tag) => callback = action) .Returns(new MvxSubscriptionToken(Guid.NewGuid(), () => { })) .Verifiable(); var items = Enumerable.Range(0, 20).ToList(); var news = News; news.Setup(n => n.GetStoryListAsync(It.IsAny <StoryKind>())) .ReturnsAsync(items) .Verifiable(); var sut = new MockNewsViewModel(Navigation.Object, messenger.Object, news.Object, Reachability.Object, Features.Object, Browser.Object, Dialog.Object); await sut.Initialize(); sut.ViewCreated(); messenger.Verify(m => m.Subscribe(It.IsAny <Action <NewsItemMessage> >(), It.IsAny <MvxReference>(), It.IsAny <string>()), Times.Once); news.Verify(n => n.GetStoryListAsync(It.IsAny <StoryKind>()), Times.Once); Assert.True(sut.LoadingTask.IsCompleted); Assert.NotNull(callback); foreach (var item in items) { var story = new Item { Id = item, Title = $"Item {item}" }; callback(new NewsItemMessage(news.Object, story)); } Assert.All(sut.Stories, vm => Assert.Equal($"Item {vm.Id}", vm.Title)); }