diff --git a/Octokit.Tests/Clients/SearchClientTests.cs b/Octokit.Tests/Clients/SearchClientTests.cs index e33115a9..cfc25ac4 100644 --- a/Octokit.Tests/Clients/SearchClientTests.cs +++ b/Octokit.Tests/Clients/SearchClientTests.cs @@ -336,7 +336,8 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new SearchClient(connection); client.SearchRepo(new SearchRepositoriesRequest("something")); - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Any>()); } [Fact] @@ -351,13 +352,12 @@ namespace Octokit.Tests.Clients { var connection = Substitute.For(); var client = new SearchClient(connection); - //check sizes for repos that are greater than 50 MB var request = new SearchRepositoriesRequest("github"); - request.Size = Range.GreaterThan(50); - + request.Size = Range.GreaterThan(1); client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+size:>1")); } [Fact] @@ -368,10 +368,38 @@ namespace Octokit.Tests.Clients //get repos whos stargazers are greater than 500 var request = new SearchRepositoriesRequest("github"); request.Stars = Range.GreaterThan(500); - client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+stars:>500")); + } - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + [Fact] + public void TestingTheStarsQualifier_LessThan() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos whos stargazers are less than 500 + var request = new SearchRepositoriesRequest("github"); + request.Stars = Range.LessThan(500); + client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+stars:<500")); + } + + [Fact] + public void TestingTheStarsQualifier_LessThanOrEquals() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos whos stargazers are less than 500 or equal to + var request = new SearchRepositoriesRequest("github"); + request.Stars = Range.LessThanOrEquals(500); + client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+stars:<=500")); } [Fact] @@ -382,10 +410,9 @@ namespace Octokit.Tests.Clients //get repos which has forks that are greater than 50 var request = new SearchRepositoriesRequest("github"); request.Forks = Range.GreaterThan(50); - client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+forks:>50")); } [Fact] @@ -394,12 +421,11 @@ namespace Octokit.Tests.Clients var connection = Substitute.For(); var client = new SearchClient(connection); //search repos that contains rails and forks are included in the search - var request = new SearchRepositoriesRequest("rails"); + var request = new SearchRepositoriesRequest("github"); request.Fork = ForkQualifier.IncludeForks; - client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+fork:IncludeForks")); } [Fact] @@ -410,10 +436,9 @@ namespace Octokit.Tests.Clients //get repos whos language is Ruby var request = new SearchRepositoriesRequest("github"); request.Language = Language.Ruby; - client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+language:Ruby")); } [Fact] @@ -425,8 +450,47 @@ namespace Octokit.Tests.Clients var request = new SearchRepositoriesRequest("github"); request.In = new[] { InQualifier.Description }; client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+in:Description")); + } - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + [Fact] + public void TestingTheInQualifier_Name() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + var request = new SearchRepositoriesRequest("github"); + request.In = new[] { InQualifier.Name }; + client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+in:Name")); + } + + [Fact] + public void TestingTheInQualifier_Readme() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + var request = new SearchRepositoriesRequest("github"); + request.In = new[] { InQualifier.Readme }; + client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+in:Readme")); + } + + [Fact] + public void TestingTheInQualifier_Multiple() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + var request = new SearchRepositoriesRequest("github"); + request.In = new[] { InQualifier.Readme, InQualifier.Description, InQualifier.Name }; + client.SearchRepo(request); + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+in:Readme,Description,Name")); } [Fact] @@ -437,12 +501,52 @@ namespace Octokit.Tests.Clients //get repos where the search contains 'github' and has been created after year jan 1 2011 var request = new SearchRepositoriesRequest("github"); request.Created = DateRange.GreaterThan(new DateTime(2011, 1, 1)); - client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+created:>2011-01-01")); } + [Fact] + public void TestingTheCreatedQualifier_GreaterThanOrEquals() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been created after year jan 1 2011 + var request = new SearchRepositoriesRequest("github"); + request.Created = DateRange.GreaterThanOrEquals(new DateTime(2011, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+created:>=2011-01-01")); + } + + [Fact] + public void TestingTheCreatedQualifier_LessThan() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been created after year jan 1 2011 + var request = new SearchRepositoriesRequest("github"); + request.Created = DateRange.LessThan(new DateTime(2011, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+created:<2011-01-01")); + } + + + [Fact] + public void TestingTheCreatedQualifier_LessThanOrEquals() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been created after year jan 1 2011 + var request = new SearchRepositoriesRequest("github"); + request.Created = DateRange.LessThanOrEquals(new DateTime(2011, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+created:<=2011-01-01")); + } + + [Fact] public void TestingTheUpdatedQualifier() { @@ -450,11 +554,49 @@ namespace Octokit.Tests.Clients var client = new SearchClient(connection); //get repos where the search contains 'github' and has been pushed before year jan 1 2013 var request = new SearchRepositoriesRequest("github"); - request.Updated = DateRange.LessThan(new DateTime(2013, 1, 1)); - + request.Updated = DateRange.GreaterThan(new DateTime(2013, 1, 1)); client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+pushed:>2013-01-01")); + } - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + [Fact] + public void TestingTheUpdatedQualifier_GreaterThanOrEquals() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been pushed before year jan 1 2013 + var request = new SearchRepositoriesRequest("github"); + request.Updated = DateRange.GreaterThanOrEquals(new DateTime(2013, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+pushed:>=2013-01-01")); + } + + [Fact] + public void TestingTheUpdatedQualifier_LessThan() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been pushed before year jan 1 2013 + var request = new SearchRepositoriesRequest("github"); + request.Updated = DateRange.LessThan(new DateTime(2013, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+pushed:<2013-01-01")); + } + + [Fact] + public void TestingTheUpdatedQualifier_LessThanOrEquals() + { + var connection = Substitute.For(); + var client = new SearchClient(connection); + //get repos where the search contains 'github' and has been pushed before year jan 1 2013 + var request = new SearchRepositoriesRequest("github"); + request.Updated = DateRange.LessThanOrEquals(new DateTime(2013, 1, 1)); + client.SearchRepo(request); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+pushed:<=2013-01-01")); } [Fact] @@ -462,13 +604,12 @@ namespace Octokit.Tests.Clients { var connection = Substitute.For(); var client = new SearchClient(connection); - //get repos where the Description contains rails and user/org is 'github' - var request = new SearchRepositoriesRequest("rails"); - request.User = "github"; - + //get repos where search contains 'github' and user/org is 'github' + var request = new SearchRepositoriesRequest("github"); + request.User = "rails"; client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => d["q"] == "github+user:rails")); } [Fact] @@ -476,13 +617,16 @@ namespace Octokit.Tests.Clients { var connection = Substitute.For(); var client = new SearchClient(connection); - //get repos where the Description contains rails and user/org is 'github' - var request = new SearchRepositoriesRequest("rails"); - request.Sort = RepoSearchSort.Forks; - + var request = new SearchRepositoriesRequest("github"); + request.SortField = RepoSearchSort.Stars; + client.SearchRepo(request); - - connection.Received().Get(Arg.Is(u => u.ToString() == "search/repositories"), Arg.Any>()); + + connection.Received().Get( + Arg.Is(u => u.ToString() == "search/repositories"), + Arg.Is>(d => + d["q"] == "github" && + d["sort"] == "stars")); } } diff --git a/Octokit/Models/Request/SearchRepositoriesRequest.cs b/Octokit/Models/Request/SearchRepositoriesRequest.cs index e78644bf..dd7537ab 100644 --- a/Octokit/Models/Request/SearchRepositoriesRequest.cs +++ b/Octokit/Models/Request/SearchRepositoriesRequest.cs @@ -13,43 +13,24 @@ namespace Octokit /// http://developer.github.com/v3/search/#search-repositories /// [DebuggerDisplay("{DebuggerDisplay,nq}")] - public class SearchRepositoriesRequest + public class SearchRepositoriesRequest : BaseSearchRequest { public SearchRepositoriesRequest(string term) + : base(term) { - Term = term; - Page = 1; - PerPage = 100; - Fork = ForkQualifier.ExcludeForks; Order = SortDirection.Descending; } - /// - /// The search terms. This can be any combination of the supported repository search parameters: - /// http://developer.github.com/v3/search/#search-repositories - /// - public string Term { get; set; } - /// /// For https://help.github.com/articles/searching-repositories#sorting /// Optional Sort field. One of stars, forks, or updated. If not provided, results are sorted by best match. /// - public RepoSearchSort? Sort { get; set; } + public RepoSearchSort? SortField { get; set; } - /// - /// Sort order one of asc or desc - the default is desc. - /// - public SortDirection Order { get; set; } - - /// - /// Page of paginated results - /// - public int Page { get; set; } - - /// - /// Number of items per page - /// - public int PerPage { get; set; } + public override string Sort + { + get { return SortField.ToParameter(); } + } private IEnumerable _inQualifier; @@ -82,7 +63,7 @@ namespace Octokit /// Defaults to ExcludeForks /// https://help.github.com/articles/searching-repositories#forks /// - public ForkQualifier Fork { get; set; } + public ForkQualifier? Fork { get; set; } /// /// The size qualifier finds repository's that match a certain size (in kilobytes). @@ -120,7 +101,7 @@ namespace Octokit /// public DateRange Updated { get; set; } - public string MergeParameters() + public override IReadOnlyCollection MergedQualifiers() { var parameters = new List(); @@ -139,7 +120,10 @@ namespace Octokit parameters.Add(String.Format(CultureInfo.InvariantCulture, "forks:{0}", Forks)); } - parameters.Add(String.Format(CultureInfo.InvariantCulture, "fork:{0}", Fork)); + if (Fork != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "fork:{0}", Fork)); + } if (Stars != null) { @@ -165,26 +149,7 @@ namespace Octokit { parameters.Add(String.Format(CultureInfo.InvariantCulture, "pushed:{0}", Updated)); } - - return String.Join("+", parameters); - } - - /// - /// get the params in the correct format... - /// - /// - [SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] - public IDictionary Parameters - { - get - { - var d = new System.Collections.Generic.Dictionary(); - d.Add("page", Page.ToString()); - d.Add("per_page", PerPage.ToString()); - d.Add("sort", Sort.ToString()); - d.Add("q", Term + " " + MergeParameters()); //add qualifiers onto the search term - return d; - } + return parameters; } internal string DebuggerDisplay @@ -754,14 +719,17 @@ namespace Octokit /// /// search by number of stars /// + [Parameter(Value = "stars")] Stars, /// /// search by number of forks /// + [Parameter(Value = "forks")] Forks, /// /// search by last updated /// + [Parameter(Value = "updated")] Updated } @@ -774,14 +742,12 @@ namespace Octokit /// /// only search for forked repos /// + [Parameter(Value = "Only")] OnlyForks, /// /// include forked repos into the search /// - IncludeForks, - /// - /// forks are not included in the search (default behaviour) - /// - ExcludeForks + [Parameter(Value = "True")] + IncludeForks } } \ No newline at end of file