public async Task ForRepo_PassesState(ItemStateFilter state)
        {
            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.State = state;

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForRepository(ValidOwner, ValidRepo, It.Is <RepositoryIssueRequest>(request => request.State == state)), Times.Once());
        }
        public async Task InsideRepoDirectory_QueriesIssuesForRepo()
        {
            // Arrange
            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.Repository = $"{ValidOwner}/{ValidRepo}";

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForRepository(ValidOwner, ValidRepo, It.IsAny <RepositoryIssueRequest>()), Times.Once());
        }
        public async Task InvalidUser_ReportsError()
        {
            // Arrange
            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.User = InvalidUser;

            // Act
            await command.OnExecuteAsync(_console.Object);

            // Assert
            _reporter.Verify(r => r.Error(It.IsAny <string>()), Times.Once());
        }
        public async Task NoRepo_QueriesIssuesForCurrentUser()
        {
            // Arrange
            _discoveryService.Setup(service => service.DiscoverInCurrentDirectory())
            .Returns(() => null);

            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForCurrent(It.IsAny <IssueRequest>()), Times.Once());
        }
        public async Task ForRepo_WhenSpecifyingAll_ListForAllUsers()
        {
            // Arrange
            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.All = true;

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForRepository(ValidOwner, ValidRepo,
                                                                      It.Is <RepositoryIssueRequest>(request => request.Assignee == null && request.Creator == null && request.Mentioned == null)), Times.Once());
        }
        public async Task ForRepo_SetsRelation(IssueRelation relation)
        {
            // Arrange
            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.Relation = relation;

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForRepository(ValidOwner, ValidRepo,
                                                                      It.Is <RepositoryIssueRequest>(request => SetsCorrectRelation(request, relation, ValidCurrentUser))), Times.Once());
        }
        public async Task NoRepo_PassesRelation(IssueRelation relation, IssueFilter filter)
        {
            // Arrange
            _discoveryService.Setup(service => service.DiscoverInCurrentDirectory())
            .Returns(() => null);

            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.Relation = relation;

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            _issuesClient.Verify(client => client.GetAllForCurrent(It.Is <IssueRequest>(request => request.Filter == filter)), Times.Once());
        }
        public async Task NoRepo_WhenSpecifyingAll_ReportsWarning()
        {
            // Arrange
            _discoveryService.Setup(service => service.DiscoverInCurrentDirectory())
            .Returns(() => null);

            ListIssuesCommand command = new ListIssuesCommand(_gitHubClient.Object, _discoveryService.Object, _reporter.Object);

            command.All = true;

            // Act
            await command.OnExecuteAsync(NullConsole.Singleton);

            // Assert
            Assert.False(command.All); // -all flag should be reset to false
            _reporter.Verify(reporter => reporter.Warn(It.IsAny <string>()), Times.Once());
        }