public void QuoteCanBeRemoved() { // Arrange var vm = new ComposeTweetViewModel(); // Act bool without = vm.RemoveQuoteCommand.CanExecute(null); vm.QuotedTweet = new StatusViewModel(DummyGenerator.CreateDummyStatus(), null, null, null); bool with = vm.RemoveQuoteCommand.CanExecute(null); // Assert Assert.IsFalse(without); Assert.IsTrue(with); }
public async Task CachedUsersCanBeRetrieved() { // Arrange using (var con = OpenConnection()) using (var cache = new SqliteCache(con)) { using (var cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Users (Id, UserName, UserData) VALUES (@id1, @name1, @data1), " + "(@id2, @name2, @data2);"; cmd.AddParameter("id1", 111); cmd.AddParameter("id2", 222); cmd.AddParameter("name1", "testi"); cmd.AddParameter("name2", "testUser"); var u = DummyGenerator.CreateDummyUser(); u.UserID = 111; u.ScreenName = "testi"; u.CreatedAt = new DateTime(1, 2, 3, 4, 5, 6); cmd.AddParameter("data1", JsonConvert.SerializeObject(u)); u = DummyGenerator.CreateDummyUser(); u.UserID = 222; u.ScreenName = "testUser"; u.CreatedAt = new DateTime(6, 5, 4, 3, 2, 1); cmd.AddParameter("data2", JsonConvert.SerializeObject(u)); cmd.ExecuteNonQuery(); } // Act var users = (await cache.GetKnownUsers()).ToArray(); // Assert Assert.AreEqual(2, users.Length); Assert.IsNotNull(users.SingleOrDefault(u => u.UserId == 111)); Assert.IsNotNull(users.SingleOrDefault(u => u.UserId == 222)); Assert.IsNotNull(users.SingleOrDefault(u => u.UserName == "testi")); Assert.IsNotNull(users.SingleOrDefault(u => u.UserName == "testUser")); var data = JsonConvert.DeserializeObject <User>(users.First(u => u.UserId == 111).Data); Assert.AreEqual(new DateTime(1, 2, 3, 4, 5, 6), data.CreatedAt); data = JsonConvert.DeserializeObject <User>(users.First(u => u.UserId == 222).Data); Assert.AreEqual(new DateTime(6, 5, 4, 3, 2, 1), data.CreatedAt); } }
public void SimpleTextStatusResultsInSingeInline() { // Arrange var conv = new StatusHighlighter(); var status = DummyGenerator.CreateDummyStatus(); status.Text = "Hello World"; // Act var inlines = (Inline[])conv.Convert(status, null, null, null); // Assert Assert.AreEqual(1, inlines.Length); Assert.IsInstanceOfType(inlines[0], typeof(Run)); Assert.AreEqual(status.Text, ((Run)inlines[0]).Text); }
public void CorrectUrlIsExctracted() { // Arrange var conv = new StatusLink(); var status = DummyGenerator.CreateDummyStatus(); status.StatusID = 123; status.User.ScreenName = "username"; // Act var url = (Uri)conv.Convert(status, null, null, null); // Assert Assert.IsNotNull(url); Assert.AreEqual("https://twitter.com/username/status/123", url.AbsoluteUri); }
public void QuotingTweetOpensDialog() { // Arrange var viewServices = new Mock <IViewServiceRepository>(); viewServices.Setup(v => v.QuoteTweet(It.IsAny <StatusViewModel>(), null)).Returns(Task.CompletedTask).Verifiable (); var vm = new StatusViewModel(DummyGenerator.CreateDummyStatus(), null, null, viewServices.Object); // Act vm.QuoteStatusCommand.Execute(null); // Assert viewServices.Verify(v => v.QuoteTweet(It.IsAny <StatusViewModel>(), null), Times.Once()); }
public void HtmlCharsAreDecodedCorrectly() { // Arrange const string content = "<test>"; var conv = new StatusHighlighter(); var status = DummyGenerator.CreateDummyStatus(); status.Text = WebUtility.HtmlEncode(content); // Act var inlines = (Inline[])conv.Convert(status, null, null, null); // Assert Assert.AreEqual(1, inlines.Length); Assert.IsInstanceOfType(inlines[0], typeof(Run)); Assert.AreEqual(content, ((Run)inlines[0]).Text); }
public void StatusIsRejected() { // Arrange var context = new Mock <IContextEntry>(); var config = new Mock <IConfig>(); config.SetupGet(c => c.General).Returns(new GeneralConfig()); var parser = new Mock <IStreamParser>(); var vm = new TestColumn(context.Object, new ColumnDefinition(ColumnType.Messages), config.Object, parser.Object); // Act bool suitable = vm.Suitable(DummyGenerator.CreateDummyStatus()); // Assert Assert.IsFalse(suitable); }
public async Task InitialLoadingAddsStatuses() { // Arrange var context = new Mock <IContextEntry>(); var definition = new ColumnDefinition(ColumnType.User); var config = new Mock <IConfig>(); config.SetupGet(c => c.General).Returns(new GeneralConfig()); var parser = new Mock <IStreamParser>(); var statuses = new List <Status> { DummyGenerator.CreateDummyStatus(), DummyGenerator.CreateDummyStatus(), DummyGenerator.CreateDummyStatus() }; for (int i = 0; i < statuses.Count; ++i) { statuses[i].StatusID = (ulong)(i + 1); } var twitterContext = new Mock <ITwitterContext>(); var statusRepo = new Mock <ITwitterStatusRepository>(); statusRepo.Setup(s => s.Filter( It.IsAny <Expression <Func <Status, bool> > >(), It.IsAny <Expression <Func <Status, bool> > >())).Returns(Task.FromResult(statuses)); twitterContext.SetupGet(c => c.Statuses).Returns(statusRepo.Object); context.Setup(c => c.Twitter).Returns(twitterContext.Object); var vm = new TestColumn(context.Object, definition, config.Object, parser.Object); var muter = new Mock <IStatusMuter>(); muter.Setup(m => m.IsMuted(It.IsAny <Status>())).Returns(false).Verifiable(); vm.Muter = muter.Object; vm.Dispatcher = new SyncDispatcher(); vm.Cache = new NullCache(); // Act await vm.Load(); // Assert Assert.AreEqual(3, vm.Items.Count); }
public void StatusWithMentionsForOtherUsersIsRejected() { // Arrange var vm = new TestColumn(); var status = DummyGenerator.CreateDummyStatus(); status.Entities.UserMentionEntities.Add(new UserMentionEntity { Id = 123 }); // Act bool suitable = vm.Suitable(status); // Assert Assert.IsFalse(suitable); }
public void NotifyPropertyChangedIsImplementedCorrectly() { // Arrange var typeResolver = new Mock <ITypeResolver>(); typeResolver.Setup(t => t.Resolve(typeof(UserViewModel))).Returns( new UserViewModel(DummyGenerator.CreateDummyUserEx())); var vm = new ProfileDialogViewModel(); var tester = new PropertyChangedTester(vm, false, typeResolver.Object); // Act tester.Test(); // Assert tester.Verify(); }
public void InlineMediasContainExtractedMedias() { var context = new Mock <IContextEntry>(); context.SetupGet(c => c.UserId).Returns(123); var status = DummyGenerator.CreateDummyStatus(); status.User.UserID = 222; status.Entities.UrlEntities.Add(new UrlEntity { ExpandedUrl = "https://example.com/1" }); status.Entities.UrlEntities.Add(new UrlEntity { ExpandedUrl = "https://example.com/2" }); status.Entities.UrlEntities.Add(new UrlEntity { ExpandedUrl = "https://example.com/3" }); var config = new Mock <IConfig>(); var visualConfig = new VisualConfig { InlineMedia = true }; config.SetupGet(c => c.Visual).Returns(visualConfig); var extractorRepo = new Mock <IMediaExtractorRepository>(); extractorRepo.Setup(r => r.ExtractMedia(It.IsAny <string>())).Returns <string>(url => new Uri(url)); var vm = new StatusViewModel(status, context.Object, config.Object, null) { MediaExtractor = extractorRepo.Object }; // Act var medias = vm.InlineMedias.ToArray(); // Assert Assert.AreEqual(3, medias.Length); Assert.IsNotNull(medias.SingleOrDefault(m => m.Url.AbsoluteUri == "https://example.com/1")); Assert.IsNotNull(medias.SingleOrDefault(m => m.Url.AbsoluteUri == "https://example.com/2")); Assert.IsNotNull(medias.SingleOrDefault(m => m.Url.AbsoluteUri == "https://example.com/3")); extractorRepo.Verify(e => e.ExtractMedia(It.IsAny <string>()), Times.Exactly(3)); }
public void NotifyPropertyChangedIsImplementedCorrectly() { // Arrange var typeResolver = new Mock <ITypeResolver>(); typeResolver.Setup(t => t.Resolve(typeof(StatusViewModel))).Returns( new StatusViewModel(DummyGenerator.CreateDummyStatus(), null, null, null)); var vm = new TweetDetailsViewModel(); var tester = new PropertyChangedTester(vm, false, typeResolver.Object); // Act tester.Test(nameof(TweetDetailsViewModel.Context)); // Assert tester.Verify(); }
public async Task PreviousTweetsInConversationAreLoaded() { // Arrange var s1 = DummyGenerator.CreateDummyStatus(); s1.StatusID = 111; var s2 = DummyGenerator.CreateDummyStatus(); s2.StatusID = 222; s2.InReplyToStatusID = s1.StatusID; var s3 = DummyGenerator.CreateDummyStatus(); s3.StatusID = 333; s3.InReplyToStatusID = s2.StatusID; var context = new Mock <IContextEntry>(); context.Setup(c => c.Twitter.Statuses.GetTweet(111, It.IsAny <bool>())).Returns(Task.FromResult(s1)); context.Setup(c => c.Twitter.Statuses.GetTweet(222, It.IsAny <bool>())).Returns(Task.FromResult(s2)); context.Setup(c => c.Twitter.Statuses.GetTweet(333, It.IsAny <bool>())).Returns(Task.FromResult(s3)); context.Setup(c => c.Twitter.Search.SearchReplies(It.IsAny <Status>())).Returns( Task.FromResult(new List <Status>())); context.Setup(c => c.Twitter.Users.LookupUsers(It.IsAny <IEnumerable <ulong> >())).Returns( Task.FromResult(new List <UserEx>())); context.Setup(c => c.Twitter.Statuses.FindRetweeters(123, It.IsAny <int>())).Returns( Task.FromResult(new List <ulong>())); var statusVm = new StatusViewModel(s3, context.Object, null, null); var vm = new TweetDetailsViewModel { Dispatcher = new SyncDispatcher(), Context = context.Object, DisplayTweet = statusVm }; // Act await vm.OnLoad(null); // Assert Assert.AreEqual(2, vm.PreviousConversationTweets.Count); Assert.AreEqual(111ul, vm.PreviousConversationTweets[0].Id); Assert.AreEqual(222ul, vm.PreviousConversationTweets[1].Id); }
public void QuotedTweetsUrlIsAppendedToUrl() { // Arrange var config = new Mock <IConfig>(); var viewServiceRepo = new Mock <IViewServiceRepository>(); var quotedTweet = DummyGenerator.CreateDummyStatus(); var url = quotedTweet.GetUrl(); var context = new Mock <IContextEntry>(); var status = DummyGenerator.CreateDummyStatus(); context.Setup(c => c.Twitter.Statuses.TweetAsync("Hello world " + url, It.IsAny <IEnumerable <ulong> >(), 0)) .Returns( Task.FromResult(status)).Verifiable(); context.SetupGet(c => c.ProfileImageUrl).Returns(new Uri("http://example.com/image.png")); var waitHandle = new ManualResetEventSlim(false); var vm = new ComposeTweetViewModel(null) { TwitterConfig = MockTwitterConfig(), Text = "Hello world", QuotedTweet = new StatusViewModel(quotedTweet, context.Object, config.Object, viewServiceRepo.Object) }; vm.Accounts.Add(new AccountEntry(context.Object, false) { Use = true }); vm.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(ComposeTweetViewModel.IsSending) && vm.IsSending == false) { waitHandle.Set(); } }; // Act vm.SendTweetCommand.Execute(null); waitHandle.Wait(1000); // Assert context.Verify(c => c.Twitter.Statuses.TweetAsync("Hello world " + url, It.IsAny <IEnumerable <ulong> >(), 0), Times.Once()); }
public void ForeignStatusCanBeRetweeted() { // Arrange var context = new Mock <IContextEntry>(); context.SetupGet(c => c.UserId).Returns(123); var status = DummyGenerator.CreateDummyStatus(); status.User.UserID = 222; var vm = new StatusViewModel(status, context.Object, null, null); // Act bool canExecute = vm.RetweetStatusCommand.CanExecute(null); // Assert Assert.IsTrue(canExecute); }
public void OwnUserCannotBeBlocked() { // Arrange var context = new Mock <IContextEntry>(); context.SetupGet(c => c.UserId).Returns(123); var status = DummyGenerator.CreateDummyStatus(); status.User.UserID = 123; var vm = new StatusViewModel(status, context.Object, null, null); // Act bool canExecute = vm.BlockUserCommand.CanExecute(null); // Assert Assert.IsFalse(canExecute); }
public void SimpleTextStatusResultsInSingeInline() { // Arrange var conv = new StatusHighlighter(); var status = DummyGenerator.CreateDummyStatus(); status.Text = "Hello World"; var vm = new StatusViewModel(status, null, null, null); // Act var inlines = (List <Inline>)conv.Convert(vm, null, null, null); // Assert Assert.IsNotNull(inlines); Assert.AreEqual(1, inlines.Count); Assert.IsInstanceOfType(inlines[0], typeof(Run)); Assert.AreEqual(status.Text, ((Run)inlines[0]).Text); }
public void NotifyPropertyChangedIsImplementedCorrectly() { // Arrange var resolver = new Mock <ITypeResolver>(); var context = new Mock <IContextEntry>(); resolver.Setup(r => r.Resolve(typeof(MessageViewModel))) .Returns(new MessageViewModel(DummyGenerator.CreateDummyMessage(), context.Object, null, null)); var vm = new ComposeMessageViewModel(); var tester = new PropertyChangedTester(vm, false, resolver.Object); // Act tester.Test(); // Assert tester.Verify(); }
public void NewStatusEventWithoutSubscribersDoesNotCrash() { // Arrange var context = new Mock <IContextEntry>(); var definition = new ColumnDefinition(ColumnType.User); var config = new Mock <IConfig>(); config.SetupGet(c => c.General).Returns(new GeneralConfig()); var parser = new Mock <IStreamParser>(); var vm = new TestColumn(context.Object, definition, config.Object, parser.Object); // Act vm.RaiseStatusWrapper(new StatusViewModel(DummyGenerator.CreateDummyStatus(), context.Object, null, null)); // Assert Assert.IsTrue(true); // HACK: This is ugly... }
public void ToastsAreRaisedWhenEnabledInConfig() { // Arrange var context = new Mock<IContextEntry>(); var config = new Mock<IConfig>(); config.SetupGet( c => c.Notifications ).Returns( new NotificationConfig { ToastsEnabled = true } ); var viewServices = new Mock<IViewServiceRepository>(); viewServices.Setup( v => v.OpenNotificationFlyout( It.IsAny<NotificationViewModel>() ) ).Verifiable(); var notifier = new Notifier( config.Object, null, new SyncDispatcher(), viewServices.Object, null); var status = new StatusViewModel( DummyGenerator.CreateDummyStatus(), context.Object, null, null ); // Act notifier.OnItem( status, new ColumnNotifications { Toast = true } ); // Assert viewServices.Verify( v => v.OpenNotificationFlyout( It.IsAny<NotificationViewModel>() ), Times.Once() ); }
public async Task OwnUserNameIsNotIncludedInReplyToAll() { // Arrange var user = DummyGenerator.CreateDummyUser(); user.ScreenName = "you"; var status = DummyGenerator.CreateDummyStatus(user); status.Entities.UserMentionEntities.Add(new UserMentionEntity { ScreenName = "me" }); status.Entities.UserMentionEntities.Add(new UserMentionEntity { ScreenName = "them" }); var context = new Mock <IContextEntry>(); context.SetupGet(c => c.AccountName).Returns("me"); context.SetupGet(c => c.ProfileImageUrl).Returns(new Uri("http://example.com/file.name")); var contextList = new Mock <ITwitterContextList>(); contextList.SetupGet(c => c.Contexts).Returns(new[] { context.Object }); var reply = new StatusViewModel(status, context.Object, null, null); var vm = new ComposeTweetViewModel(null) { ContextList = contextList.Object, Dispatcher = new SyncDispatcher(), TwitterConfig = new Mock <ITwitterConfiguration>().Object, Cache = new Mock <ICache>().Object }; vm.SetReply(reply, true); // Act await vm.OnLoad(false); // Assert Assert.IsTrue(vm.Text.Contains("@them")); Assert.IsTrue(vm.Text.Contains("@you")); Assert.IsFalse(vm.Text.Contains("@me")); }
public void QuoteIsNotExtractedForDifferentUrls() { // Arrange var status = DummyGenerator.CreateDummyStatus(); status.Entities.UrlEntities.Add(new UrlEntity { ExpandedUrl = "https://example.com/123456" }); var vm = new StatusViewModel(status, null, null, null); // Act ulong quotedId = vm.ExtractQuotedTweetUrl(); bool hasQuote = vm.HasQuotedTweet; // Assert Assert.AreEqual(0ul, quotedId); Assert.IsFalse(hasQuote); }
public async Task UserDataIsLoaded() { // Arrange var notifier = new Mock <INotifier>(); notifier.Setup(n => n.DisplayMessage(Strings.UserNotFound, NotificationType.Error)).Verifiable(); var user = DummyGenerator.CreateDummyUser(); user.UserID = 123; var contextList = new Mock <ITwitterContextList>(); var context = new Mock <IContextEntry>(); context.SetupGet(c => c.UserId).Returns(444); context.Setup(c => c.Twitter.Users.ShowUser(123ul, It.IsAny <bool>())).Returns(Task.FromResult(user)); context.Setup(c => c.Twitter.Friendships.GetFriendshipWith(444, 123)).Returns(Task.FromResult(new Friendship { TargetRelationship = new Relationship { FollowedBy = true, Following = true } })); contextList.SetupGet(c => c.Contexts).Returns(new[] { context.Object }).Verifiable(); var vm = new ProfileDialogViewModel { ContextList = contextList.Object, Notifier = notifier.Object, Dispatcher = new SyncDispatcher() }; vm.Setup(123); // Act await vm.OnLoad(null); // Assert Assert.AreEqual(user.UserID, vm.User.UserId); Assert.IsTrue(vm.Friendship.TargetRelationship.Following); Assert.IsTrue(vm.Friendship.TargetRelationship.FollowedBy); }
public void QuoteIsExtractedFromStatus() { // Arrange var status = DummyGenerator.CreateDummyStatus(); status.Entities.UrlEntities.Add(new UrlEntity { ExpandedUrl = "https://twitter.com/user/status/123456" }); var vm = new StatusViewModel(status, null, null, null); // Act ulong quotedId = vm.ExtractQuotedTweetUrl(); bool hasQuote = vm.HasQuotedTweet; // Assert Assert.AreEqual(123456ul, quotedId); Assert.IsTrue(hasQuote); }
public void UserCanBeBlocked() { // Arrange var status = DummyGenerator.CreateDummyStatus(); status.User.UserID = 111; status.UserID = 111; var viewServices = new Mock <IViewServiceRepository>(); viewServices.Setup(v => v.Confirm(It.IsAny <ConfirmServiceArgs>())).Returns(Task.FromResult(true)); var twitter = new Mock <ITwitterContext>(); twitter.Setup(t => t.CreateBlockAsync(111, It.IsAny <string>(), It.IsAny <bool>())).Returns( Task.FromResult(status.User)).Verifiable(); var context = new Mock <IContextEntry>(); context.SetupGet(c => c.Twitter).Returns(twitter.Object); context.SetupGet(c => c.UserId).Returns(123); var waitHandle = new ManualResetEventSlim(false); var vm = new StatusViewModel(status, context.Object, null, viewServices.Object) { Dispatcher = new SyncDispatcher() }; vm.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(vm.IsLoading) && vm.IsLoading == false) { waitHandle.Set(); } }; // Act vm.BlockUserCommand.Execute(null); waitHandle.Wait(1000); // Assert twitter.Verify(t => t.CreateBlockAsync(111, It.IsAny <string>(), It.IsAny <bool>()), Times.Once()); }
public void RemoveQuoteRemoves() { // Arrange var config = new Mock <ITwitterConfiguration>(); config.SetupGet(c => c.UrlLength).Returns(1); config.SetupGet(c => c.UrlLengthHttps).Returns(2); var vm = new ComposeTweetViewModel(null) { TwitterConfig = config.Object, QuotedTweet = new StatusViewModel(DummyGenerator.CreateDummyStatus(), null, null, null) }; // Act vm.RemoveQuoteCommand.Execute(null); // Assert Assert.IsNull(vm.QuotedTweet); }
public void ReplyCommandOpensDialog() { // Arrange var viewServices = new Mock <IViewServiceRepository>(); viewServices.Setup(v => v.ReplyToMessage(It.Is <MessageViewModel>(m => m.Id == 123))).Returns(Task.CompletedTask).Verifiable(); var context = new Mock <IContextEntry>(); var msg = DummyGenerator.CreateDummyMessage(); msg.ID = 123; var vm = new MessageViewModel(msg, context.Object, null, viewServices.Object); // Act vm.ReplyCommand.Execute(null); // Assert viewServices.Verify(v => v.ReplyToMessage(It.Is <MessageViewModel>(m => m.Id == 123)), Times.Once()); }
public async Task CleanupRemovesColumnMappings() { // Arrange using (var con = OpenConnection()) using (var cache = new SqliteCache(con)) { var status = DummyGenerator.CreateDummyStatus(); status.ID = 123; var colId = Guid.NewGuid(); await cache.MapStatusesToColumn(new[] { status }, colId); // Act var statuses = await cache.GetStatusesForColumn(colId, 1); // Assert Assert.AreEqual(0, statuses.Count); } }
public void StatusWithUserMentionIsAccepted() { // Arrange var context = new Mock <IContextEntry>(); context.SetupGet(c => c.UserId).Returns(123); var vm = new TestColumn(context.Object); var status = DummyGenerator.CreateDummyStatus(); status.Entities.UserMentionEntities.Add(new UserMentionEntity { Id = 123 }); // Act bool suitable = vm.Suitable(status); // Assert Assert.IsTrue(suitable); }
public async Task StatusesForColumnCanBeLoaded() { // Arrange using (var con = OpenConnection()) using (var cache = new SqliteCache(con)) { var user = DummyGenerator.CreateDummyUser(); user.UserID = 123; var s1 = DummyGenerator.CreateDummyStatus(user); s1.ID = 1; var s2 = DummyGenerator.CreateDummyStatus(user); s2.ID = 2; var s3 = DummyGenerator.CreateDummyStatus(user); s3.ID = 3; await cache.AddStatuses(new[] { s1, s2, s3 }); var c1 = Guid.NewGuid(); var c2 = Guid.NewGuid(); using (var cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO ColumnStatuses (ColumnId, StatusId) VALUES (@c1, 1), (@c1, 2), (@c2, 3);"; cmd.AddParameter("c1", c1); cmd.AddParameter("c2", c2); cmd.ExecuteNonQuery(); } // Act var statusesC1 = (await cache.GetStatusesForColumn(c1, 999)).ToArray(); var statusesC2 = (await cache.GetStatusesForColumn(c2, 999)).ToArray(); // Assert Assert.AreEqual(2, statusesC1.Length); Assert.IsNotNull(statusesC1.SingleOrDefault(s => s.ID == 1)); Assert.IsNotNull(statusesC1.SingleOrDefault(s => s.ID == 2)); Assert.AreEqual(1, statusesC2.Length); Assert.IsNotNull(statusesC2.SingleOrDefault(s => s.ID == 3)); } }