public void Constructor_SutIsCmdlet()
        {
            // When
            var sut = new NewPostCommand();

            // Then
            Assert.IsAssignableFrom<Cmdlet>(sut);
        }
        public void Invoke_DoesNotReturnNull()
        {
            // Given
            var sut = new NewPostCommand();

            // When
            var result = sut.Invoke();

            // Then
            Assert.NotNull(result);
        }
        public void Invoke_WithContent_DelegatesToRepository(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository,
            string title,
            string content)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);

            // When
            sut.Title = title;
            sut.Content = content;
            sut.Invoke<Post>().Any();

            // Then
            repository.Verify(m => m.Save(It.Is<Post>(p => p.MarkdownContent == content)));
        }
        public void Invoke_WithContent_ReturnsSinglePostWithSameContent(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository,
            string title,
            string content)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);

            // When
            sut.Title = title;
            sut.Content = content;
            var result = sut.Invoke<Post>().SingleOrDefault();

            // Then
            Assert.Equal(content, result.MarkdownContent);
        }
        public void Invoke_WithTitle_ReturnsSinglePost(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository,
            string title)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);

            // When
            sut.Title = title;
            var result = sut.Invoke<Post>().SingleOrDefault();

            // Then
            Assert.NotNull(result);
        }
        public void Invoke_WithTags_ReturnsSinglePostWithSameTags(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository,
            string title,
            string[] tags)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);

            // When
            sut.Title = title;
            sut.Tags = tags;
            var result = sut.Invoke<Post>().SingleOrDefault();

            // Then
            Assert.True(tags.SequenceEqual(result.Tags.Select(t => t.Name)));
        }
        public void Invoke_WithNullTitle_ThrowsArgumentException(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);

            // When
            sut.Title = null;

            // Then
            Assert.Throws<ArgumentException>(() => sut.Invoke<Post>().Any());
        }
        public void Invoke_WithException_ThrowsSameException(
            Mock<Common.IServiceLocator> serviceLocator,
            Mock<IRepository<Post>> repository,
            InvalidOperationException exception,
            string title)
        {
            // Given
            serviceLocator.Setup(s => s.GetInstance<IRepository<Post>>()).Returns(repository.Object);
            repository.Setup(s => s.Save(It.IsAny<Post>())).Throws(exception);
            var sut = new NewPostCommand();
            ServiceLocator.SetCurrentInstance(serviceLocator.Object);
            sut.Title = title;

            // Then
            Assert.Throws(exception.GetType(), () => sut.Invoke<Post>().Any());
        }