public async Task OpenIssue_UpdatesIssue()
        {
            // Arrange
            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{ValidRepo}#{ValidIssueNumber}"
            };

            // Act
            await command.OnExecuteAsync(_console);

            // Assert
            _issuesClient.Verify(client => client.Update(ValidOwner, ValidRepo, ValidIssueNumber, It.Is <IssueUpdate>(update => update.State == ItemState.Closed)), Times.Once());
        }
        public async Task Returns_OK()
        {
            // Arrange
            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{ValidRepo}#{ValidIssueNumber}"
            };

            // Act
            var value = await command.OnExecuteAsync(_console);

            // Assert
            Assert.Equal(value, ReturnCodes.Ok);
        }
        public async Task ClosedIssue_DoesNotUpdateIssue()
        {
            // Arrange
            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{ValidRepo}#{ClosedIssueNumber}"
            };

            // Act
            await command.OnExecuteAsync(_console);

            // Assert
            _issuesClient.Verify(client => client.Update(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <IssueUpdate>()), Times.Never());
        }
        public async Task ClosedIssue_ReportsWarning()
        {
            // Arrange
            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{ValidRepo}#{ClosedIssueNumber}"
            };

            // Act
            await command.OnExecuteAsync(_console);

            // Assert
            _reporter.Verify(r => r.Warn(It.Is <string>(s => s == "Issue jerriep/github-issues-cli#101 is already closed. No action taken.")), Times.Once());
        }
        public async Task PassingComment_AddsComment()
        {
            // Arrange
            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue   = $"{ValidOwner}/{ValidRepo}#{ValidIssueNumber}",
                Comment = ValidComment
            };

            // Act
            await command.OnExecuteAsync(_console);

            // Assert
            _issueCommentsClient.Verify(client => client.Create(ValidOwner, ValidRepo, ValidIssueNumber, ValidComment), Times.Once());
        }
        public async Task ValidationException_ReturnsError()
        {
            // Arrange
            _discoveryService.Setup(service => service.DiscoverInCurrentDirectory())
            .Returns(() => null);

            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{InvalidRepo}#{ValidIssueNumber}"
            };

            // Act
            var value = await command.OnExecuteAsync(_console);

            // Assert
            Assert.Equal(value, ReturnCodes.Error);
        }
        public async Task ValidationException_ReportsError()
        {
            // Arrange
            _discoveryService.Setup(service => service.DiscoverInCurrentDirectory())
            .Returns(() => null);

            var command = new CloseIssueCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object)
            {
                Issue = $"{ValidOwner}/{InvalidRepo}#{ValidIssueNumber}"
            };

            // Act
            await command.OnExecuteAsync(_console);

            // Assert
            _reporter.Verify(r => r.Error(It.IsAny <string>()), Times.Once());
        }