public void OnClickSetIrrelevant_Sets_next_story_as_irrelevant()
        {
            //Arrange
            var nextStory = new Story
            {
                Id           = 123,
                Title        = "This is a test",
                IsIrrelevant = false
            };
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.NextUnbucketedStory)
            .Returns(nextStory);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            vm.OnClickSetIrrelevant();

            //Assert
            Assert.IsTrue(nextStory.IsIrrelevant);
        }
        public void TextForNextStoryToSort_is_the_string_representation_of_NextUnbucketedStory()
        {
            //Arrange
            var text = "#1337 Foobar";

            var nextUnbucketedStory = new Mock <Story>();

            nextUnbucketedStory
            .Setup(fake => fake.ToString())
            .Returns(text);

            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(mock => mock.NextUnbucketedStory)
            .Returns(nextUnbucketedStory.Object);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.AreEqual(text, vm.TextForNextStoryToSort);
        }
        public async Task OnClickCreateSmallestBucket_creates_a_new_bucket_that_is_not_bigger_than_any_bucket()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(true);

            var bucketReader  = new Mock <IBucketReader>();
            var linkedBuckets = new Mock <ILinkedSyncableBuckets>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .ReturnsAsync(linkedBuckets.Object);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);
            await vm.OnInitializedAsync();

            //Act
            await vm.OnClickCreateSmallestBucket();

            //Assert
            linkedBuckets.Verify(mock => mock.CreateEmptyBiggerThan(null), Times.Once);
        }
        public async Task Create_bigger_bucket_creates_a_new_Bucket_bigger_than_supplied_bucketAsync()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(true);

            var bucketReader  = new Mock <IBucketReader>();
            var linkedBuckets = new Mock <ILinkedSyncableBuckets>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .ReturnsAsync(linkedBuckets.Object);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            await vm.OnInitializedAsync();

            var bucket = new SyncableBucket {
                Id = 278
            };

            //Act
            await vm.OnCreateBiggerBucket(bucket);

            //Assert
            linkedBuckets.Verify(mock => mock.CreateEmptyBiggerThan(bucket), Times.Once);
        }
        public void Choosing_a_bucket_adds_next_unbucketed_story_to_that_bucket()
        {
            //Arrange
            var nextStory = new Story
            {
                Id    = 123,
                Title = "This is a test"
            };
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.NextUnbucketedStory)
            .Returns(nextStory);

            Assert.IsFalse(nextStory.IsInBucket, "Test preconditions failed!");
            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            Story addedStory = null;

            var bucket = new Mock <ISyncableBucket>();

            bucket
            .Setup(mock => mock.Add(It.IsAny <Story>()))
            .Callback((Story story) => addedStory = story);

            //Act
            vm.OnBucketChosen(bucket.Object);

            //Assert
            Assert.AreEqual(nextStory, addedStory);
        }
        public void Read_buckets_populates_Buckets_property()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            var bucket1 = new Mock <SyncableBucket>().Object;
            var buckets = new List <SyncableBucket>
            {
                bucket1,
                new Mock <SyncableBucket>().Object,
                new Mock <SyncableBucket>().Object
            };
            var linkedBuckets = new Mock <ILinkedSyncableBuckets>();

            linkedBuckets
            .Setup(fake => fake.GetEnumerator())
            .Returns(() => buckets.GetEnumerator());

            var bucketReader = new Mock <IBucketReader>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .ReturnsAsync(linkedBuckets.Object);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            vm.OnInitializedAsync().Wait();

            //Assert
            Assert.AreEqual(buckets.Count(), vm.Buckets.Count());
            Assert.AreEqual(bucket1, vm.Buckets.First());
        }
        public void BucketsHidden_until_Buckets_data_has_been_loaded()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(true);

            var bucketTcs    = new TaskCompletionSource <ILinkedSyncableBuckets>();
            var bucketReader = new Mock <IBucketReader>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .Returns(bucketTcs.Task);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            var initialized = vm.OnInitializedAsync();

            Thread.Sleep(0); //make sure the code gets a chance to run

            //Assert
            Assert.IsTrue(vm.BucketsHidden);
            bucketTcs.SetResult(new Mock <ILinkedSyncableBuckets>().Object);
            Thread.Sleep(0); //make sure the code gets a chance to run
            Assert.IsFalse(vm.BucketsHidden);
            initialized.Wait();
        }
        public void TextForNextStoryToSort_handles_NextUnbucketedStory_being_null()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.NextUnbucketedStory)
            .Returns((Story)null);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.IsNotNull(vm.TextForNextStoryToSort);
        }
        public void When_not_DataIsReady_hide_AllDone_message()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(false);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.IsTrue(vm.AllDoneHidden);
        }
        public void When_not_DataIsReady_show_loader()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(false);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.IsFalse(vm.LoaderHidden);
        }
        public void OnClickSetIrrelevant_does_nothing_if_next_story_is_null()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.NextUnbucketedStory)
            .Returns((Story)null);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            vm.OnClickSetIrrelevant();

            //Assert
            //success if no exception
        }
        public void Read_buckets_OnInitializedAsync()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            var bucketReader = new Mock <IBucketReader>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .ReturnsAsync(new Mock <ILinkedSyncableBuckets>().Object);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            vm.OnInitializedAsync().Wait();

            //Assert
            bucketReader.Verify(mock => mock.ReadLinkedBucketsAsync(), Times.Once);
        }
        public void When_Not_DataIsReady_Disable_bucket_choosing()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(false);
            storylist
            .SetupGet(fake => fake.NumberOfUnbucketedStories)
            .Returns(3);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.IsTrue(vm.DisableBucketChoosing);
        }
        public void When_DataIsReady_and_NumberOfUnbucketedStories_is_more_than_0_hide_alldone_message()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(true);
            storylist
            .SetupGet(fake => fake.NumberOfUnbucketedStories)
            .Returns(3);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            //Assert
            Assert.IsTrue(vm.AllDoneHidden);
        }
        public void Choosing_a_bucket_dont_add_anything_if_next_story_is_null()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.NextUnbucketedStory)
            .Returns((Story)null);

            var bucketReader = new Mock <IBucketReader>();

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            var bucket = new Mock <ISyncableBucket>();

            //Act
            vm.OnBucketChosen(bucket.Object);

            //Assert
            bucket.Verify(mock => mock.Add(It.IsAny <Story>()), Times.Never);
        }
        public async Task When_DataIsReady_hide_loader()
        {
            //Arrange
            var storylist = new Mock <IStorylist>();

            storylist
            .SetupGet(fake => fake.DataIsready)
            .Returns(true);

            var bucketReader = new Mock <IBucketReader>();

            bucketReader
            .Setup(fake => fake.ReadLinkedBucketsAsync())
            .ReturnsAsync(new Mock <ILinkedSyncableBuckets>().Object);

            var vm = new SortingBucketsViewModel(storylist.Object, bucketReader.Object);

            //Act
            await vm.OnInitializedAsync();

            //Assert
            Assert.IsTrue(vm.LoaderHidden);
        }