public void GithubQuery_RepositoriesSearch_ReturnsRepositoriesList()
        {
            // Arrange
            const string expectedQuery = "q=tetris in:name+language:assembly&sort=stars&order=asc";
            var          mockGithub    = new Mock <IGithubClient>();

            mockGithub.Setup(g => g.SearchRepositories(expectedQuery)).Returns(new List <GithubRepository>()
            {
                new GithubRepository()
                {
                    Name     = "Tetris #1",
                    Url      = "Tetris #1",
                    Stars    = 0,
                    FullName = "Tetris #1",
                    Id       = 1,
                    Language = "Assembly"
                },
                new GithubRepository()
                {
                    Name     = "Tetris #2",
                    Url      = "Tetris #2",
                    Stars    = 1,
                    FullName = "Tetris #2",
                    Id       = 2,
                    Language = "Assembly"
                },
                new GithubRepository()
                {
                    Name     = "Tetris #3",
                    Url      = "Tetris #3",
                    Stars    = 2,
                    FullName = "Tetris #3",
                    Id       = 3,
                    Language = "Assembly"
                }
            });

            var provider     = new GithubQueryProvider(mockGithub.Object);
            var repositories = new GithubQuery <GithubRepository>(provider);

            // Act
            var filteredRepositories =
                repositories.Where(e => e.Name == "tetris" && e.Language == "assembly").OrderBy(e => e.Stars).ToList();

            // Assert
            Assert.IsNotNull(filteredRepositories, "Filtered list should not be null!");
            Assert.Greater(filteredRepositories.Count, 0, "Filtered list should not be empty!");
            for (var i = 0; i < filteredRepositories.Count - 1; i++)
            {
                Assert.GreaterOrEqual(filteredRepositories[i + 1].Stars, filteredRepositories[i].Stars,
                                      "Items should be ordered by stars!");
            }
        }
        private static readonly PullRequestRecordRepository repository = new PullRequestRecordRepository(null, null);   //[TODO] разобраться с репозиторием

        public async Task <List <PullRequestRecordData> > HandleAsync(GithubQuery query)
        {
            if (query.queryData != null)
            {
                if (query.queryData.Id.HasValue)
                {
                    if (await repository.ExistsAsync(e => e.Id == query.queryData.Id))
                    {
                        return(new List <PullRequestRecordData>()
                        {
                            await repository.GetAsync(query.queryData.Id.Value)
                        });
                    }
                    return(null);
                }

                Func <PullRequestRecordData, bool> t = e =>
                {
                    if (query.queryData.DelayHistory?.SequenceEqual(e.DelayHistory) ?? false)
                    {
                        return(false);
                    }
                    if (query.queryData.GapHistory?.SequenceEqual(e.GapHistory) ?? false)
                    {
                        return(false);
                    }
                    if (query.queryData.StateHistory?.SequenceEqual(e.StateHistory) ?? false)
                    {
                        return(false);
                    }
                    if (query.queryData.LastCommitDate != e.LastCommitDate)
                    {
                        return(false);
                    }
                    return(query.queryData.LastReviewCommentDate == e.LastReviewCommentDate);
                };
                if (query.elementsPerPageNumber.HasValue)
                {
                    query.pageNumber ??= 50;
                    return(((List <PullRequestRecordData>) await repository.FindAsync(e => t(e))).GetRange(
                               (query.pageNumber.Value - 1) * query.elementsPerPageNumber.Value,
                               query.elementsPerPageNumber.Value));
                }
                return((List <PullRequestRecordData>) await repository.FindAsync(e => t(e)));
            }
            return(null);
        }