예제 #1
0
            public async Task AddCreationModelWhenNoMatchingSuggestion()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var tagSuggestions = getTagSuggestions(10, workspace);

                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tagSuggestions));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));
                var tagIds = tagSuggestions.Select(tag => tag.TagId).ToArray();

                var nonExistingTag = "Non existing tag";

                ViewModel.Prepare((tagIds, workspace.Id));
                await ViewModel.Initialize();

                var observer = TestScheduler.CreateObserver <IEnumerable <SelectableTagBaseViewModel> >();

                ViewModel.Tags.Subscribe(observer);
                ViewModel.FilterText.OnNext(nonExistingTag);
                TestScheduler.Start();

                observer.LastEmittedValue().First().Name.Should().Be(nonExistingTag);
                observer.LastEmittedValue().First().WorkspaceId.Should().Be(workspace.Id);
                observer.LastEmittedValue().First().Selected.Should().BeFalse();
                observer.LastEmittedValue().First().Should().BeOfType <SelectableTagCreationViewModel>();
            }
예제 #2
0
            public async Task OnlyContainsTagsFromTheSameWorkspaceAsTimeEntry()
            {
                var tags       = new List <TagSuggestion>();
                var workspaces = Enumerable.Range(0, 5)
                                 .Select(i => createWorkspace(i, $"Workspace{i}")).ToArray();

                workspaces.ForEach(workspace
                                   => tags.AddRange(getTagSuggestions(5, workspace)));
                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tags));
                var targetWorkspace = workspaces[1];

                InteractorFactory.GetWorkspaceById(targetWorkspace.Id).Execute()
                .Returns(Observable.Return(targetWorkspace));
                var tagIds = tags.Select(tag => tag.TagId).ToArray();

                ViewModel.Prepare((tagIds, targetWorkspace.Id));
                await ViewModel.Initialize();

                var observer = TestScheduler.CreateObserver <IEnumerable <SelectableTagBaseViewModel> >();

                ViewModel.Tags.Subscribe(observer);
                TestScheduler.Start();

                observer.LastEmittedValue().Should().HaveCount(5);
                observer.LastEmittedValue().Should()
                .OnlyContain(tag => tag.WorkspaceId == targetWorkspace.Id);
            }
예제 #3
0
            public async Task IsUpdatedWhenTextIsChanged()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var oldSuggestions = getTagSuggestions(3, workspace);
                var newSuggestions = getTagSuggestions(1, workspace);
                var oldTagIds      = oldSuggestions.Select(tag => tag.TagId).ToArray();
                var queryText      = "Query text";

                InteractorFactory.GetTagsAutocompleteSuggestions(
                    Arg.Is <IList <string> >(words => words.SequenceEqual(queryText.SplitToQueryWords())))
                .Execute()
                .Returns(Observable.Return(newSuggestions));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));
                ViewModel.Prepare((oldTagIds, workspace.Id));
                await ViewModel.Initialize();

                var observer = TestScheduler.CreateObserver <IEnumerable <SelectableTagBaseViewModel> >();

                ViewModel.Tags.Subscribe(observer);
                ViewModel.FilterText.OnNext(queryText);
                TestScheduler.Start();

                var received = observer.LastEmittedValue();

                received.Should().HaveCount(2);
            }
            public void PrependsTheNewTagToTheTagList()
            {
                var  tagName     = "Some Tag";
                long workspaceId = 123;
                var  initialTags = CreateTags(count: 10);

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(initialTags));
                var createdTag = CreateTagSubstitute(0, tagName);

                createdTag.WorkspaceId.Returns(workspaceId);
                DataSource.Tags.Create(Arg.Is(tagName), Arg.Any <long>())
                .Returns(Observable.Return(createdTag));
                ViewModel.Prepare((new long[0], workspaceId));
                ViewModel.Initialize().Wait();
                //Reconfigure AutocopleteProvider, so it returns the created tag as well
                var createdTagSuggestion = new TagSuggestion(createdTag);
                var newTagSuggestions    = initialTags
                                           .Concat(new AutocompleteSuggestion[] { createdTagSuggestion });
                var observable = Observable
                                 .Return(newTagSuggestions);

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(observable);
                ViewModel.Text = tagName;

                ViewModel.CreateTagCommand.ExecuteAsync(tagName).Wait();

                ViewModel.Tags.First().Name.Should().Be(tagName);
            }
예제 #5
0
            public async Task ReturnsFalseIfTagIsCreated()
            {
                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(new List <AutocompleteSuggestion>()));

                var newTag = Substitute.For <IThreadSafeTag>();

                newTag.Id.Returns(12345);
                newTag.WorkspaceId.Returns(workspaceId);
                newTag.Name.Returns("new tag");

                ViewModel.Prepare((new long[] { }, workspaceId));

                var observer = TestScheduler.CreateObserver <bool>();
                await ViewModel.Initialize();

                ViewModel.IsEmpty.Subscribe(observer);
                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(TagSuggestion.FromTags(new List <IThreadSafeTag> {
                    newTag
                })));
                ViewModel.FilterText.OnNext(string.Empty);
                TestScheduler.Start();

                observer.LastEmittedValue().Should().BeFalse();
            }
            public async Task IsSortedBySelectedStatusThenByName()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var tagSuggestions = getTagSuggestions(4, workspace).ToArray();

                var shuffledTags   = new[] { tagSuggestions[3], tagSuggestions[1], tagSuggestions[2], tagSuggestions[0] };
                var selectedTagIds = new[] { tagSuggestions[0].TagId, tagSuggestions[2].TagId };

                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(shuffledTags));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));

                ViewModel.Prepare((selectedTagIds, workspace.Id));
                await ViewModel.Initialize();

                ViewModel.Tags.Should().HaveCount(4);

                ViewModel.Tags[0].Name.Should().Be("Tag0");
                ViewModel.Tags[1].Name.Should().Be("Tag2");
                ViewModel.Tags[2].Name.Should().Be("Tag1");
                ViewModel.Tags[3].Name.Should().Be("Tag3");

                ViewModel.Tags[0].Selected.Should().BeTrue();
                ViewModel.Tags[1].Selected.Should().BeTrue();
                ViewModel.Tags[2].Selected.Should().BeFalse();
                ViewModel.Tags[3].Selected.Should().BeFalse();
            }
            public async Task IsFalseWhenSuchTagAlreadyExists(string text)
            {
                var tags = CreateTags(10);

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tags));
                ViewModel.Prepare((new long[0], 0));
                await ViewModel.Initialize();

                ViewModel.Text = text;

                ViewModel.SuggestCreation.Should().BeFalse();
            }
            public async Task IsPopulatedAfterInitialization()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var tagSuggestions = getTagSuggestions(10, workspace);
                var tagIds         = tagSuggestions.Select(tag => tag.TagId).ToArray();

                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tagSuggestions));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));

                ViewModel.Prepare((tagIds, workspace.Id));
                await ViewModel.Initialize();

                ViewModel.Tags.Should().HaveCount(tagSuggestions.Count());
            }
예제 #9
0
            private void setup(Func <long, long> workspaceIdSelector)
            {
                var tags = Enumerable.Range(0, 10)
                           .Select(i =>
                {
                    var tag = Substitute.For <IThreadSafeTag>();
                    tag.Name.Returns(Guid.NewGuid().ToString());
                    tag.Id.Returns(i);
                    tag.WorkspaceId.Returns(workspaceIdSelector(i));
                    return(tag);
                })
                           .ToList();

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(TagSuggestion.FromTags(tags)));
            }
            public async Task IsClearedWhenTextIsChanged()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var oldSuggestions = getTagSuggestions(3, workspace);
                var newSuggestions = getTagSuggestions(1, workspace);
                var oldTagIds      = oldSuggestions.Select(tag => tag.TagId).ToArray();
                var queryText      = "Query text";

                InteractorFactory.GetTagsAutocompleteSuggestions(
                    Arg.Is <IList <string> >(words => words.SequenceEqual(queryText.SplitToQueryWords())))
                .Execute()
                .Returns(Observable.Return(newSuggestions));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));
                ViewModel.Prepare((oldTagIds, workspace.Id));
                await ViewModel.Initialize();

                ViewModel.Text = queryText;

                ViewModel.Tags.Should().HaveCount(1);
            }
예제 #11
0
            public async Task IsPopulatedAfterInitialization()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var tagSuggestions = getTagSuggestions(10, workspace);
                var tagIds         = tagSuggestions.Select(tag => tag.TagId).ToArray();

                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tagSuggestions));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));

                await ViewModel.Initialize(new SelectTagsParameter(tagIds, workspace.Id));

                var observer = TestScheduler.CreateObserver <IEnumerable <SelectableTagBaseViewModel> >();

                ViewModel.Tags.Subscribe(observer);
                TestScheduler.Start();

                observer.LastEmittedValue().Should().HaveCount(tagSuggestions.Count());
            }
            private async Task prepare(long tagId, long workspaceId)
            {
                ViewModel.Prepare((new long[0], workspaceId));
                await ViewModel.Initialize();

                var createdTag = Substitute.For <IThreadSafeTag>();

                createdTag.Id.Returns(tagId);
                createdTag.WorkspaceId.Returns(workspaceId);
                DataSource
                .Tags
                .Create(Arg.Any <string>(), Arg.Any <long>())
                .Returns(Observable.Return(createdTag));

                var observable = Observable
                                 .Return(new AutocompleteSuggestion[] { new TagSuggestion(createdTag) });

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(observable);
            }
예제 #13
0
            public async Task IsFalseWhenSuchTagAlreadyExists(string text)
            {
                var textTags = new List <(long, string)> {
                    (1, "t"), (2, "p"), (3, "Text"), (4, "te")
                };

                var tags = textTags
                           .AsEnumerable()
                           .Select(tuple => CreateTagSubstitute(tuple.Item1, tuple.Item2))
                           .Select(tag => new TagSuggestion(tag));

                InteractorFactory
                .GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(tags));
                ViewModel.Prepare((new long[0], 0));
                await ViewModel.Initialize();

                ViewModel.Text = text;

                ViewModel.SuggestCreation.Should().BeFalse();
            }
예제 #14
0
            public async Task IsSortedBySelectedStatusThenByName()
            {
                var workspace      = createWorkspace(13, "Some workspace");
                var tagSuggestions = getTagSuggestions(4, workspace).ToArray();

                var shuffledTags   = new[] { tagSuggestions[3], tagSuggestions[1], tagSuggestions[2], tagSuggestions[0] };
                var selectedTagIds = new[] { tagSuggestions[0].TagId, tagSuggestions[2].TagId };

                InteractorFactory.GetTagsAutocompleteSuggestions(Arg.Any <IList <string> >())
                .Execute()
                .Returns(Observable.Return(shuffledTags));
                InteractorFactory.GetWorkspaceById(workspace.Id).Execute()
                .Returns(Observable.Return(workspace));

                await ViewModel.Initialize(new SelectTagsParameter(selectedTagIds, workspace.Id));

                var observer = TestScheduler.CreateObserver <IEnumerable <SelectableTagBaseViewModel> >();

                ViewModel.Tags.Subscribe(observer);
                TestScheduler.Start();

                var tags = observer.LastEmittedValue().ToArray();

                tags.Should().HaveCount(4);


                tags[0].Name.Should().Be("Tag0");
                tags[1].Name.Should().Be("Tag2");
                tags[2].Name.Should().Be("Tag1");
                tags[3].Name.Should().Be("Tag3");

                tags[0].Selected.Should().BeTrue();
                tags[1].Selected.Should().BeTrue();
                tags[2].Selected.Should().BeFalse();
                tags[3].Selected.Should().BeFalse();
            }