From b6a215d4569dc5d9bc9d698c9606916a4f4e121d Mon Sep 17 00:00:00 2001 From: Haacked Date: Fri, 2 Jan 2015 17:09:11 -0800 Subject: [PATCH] Refactor search result classes They are now readonly and implement a generic base class. --- Octokit.Tests/Models/DeploymentTests.cs | 3 +- .../Models/SearchRepositoryRequestTests.cs | 29 ++++++++++ .../Models/SearchRepositoryResultTests.cs | 55 +++++++++++++++++++ Octokit.Tests/OctoKit.Tests-NetCore45.csproj | 2 + Octokit.Tests/Octokit.Tests-Portable.csproj | 2 + Octokit.Tests/Octokit.Tests.csproj | 2 + Octokit/Models/Response/SearchCodeResult.cs | 19 +------ Octokit/Models/Response/SearchIssuesResult.cs | 16 +----- .../Models/Response/SearchRepositoryResult.cs | 19 +------ Octokit/Models/Response/SearchResult.cs | 33 +++++++++++ Octokit/Models/Response/SearchUsersResult.cs | 19 +------ Octokit/Octokit-Mono.csproj | 1 + Octokit/Octokit-MonoAndroid.csproj | 1 + Octokit/Octokit-Monotouch.csproj | 3 +- Octokit/Octokit-Portable.csproj | 1 + Octokit/Octokit-netcore45.csproj | 1 + Octokit/Octokit.csproj | 1 + 17 files changed, 143 insertions(+), 64 deletions(-) create mode 100644 Octokit.Tests/Models/SearchRepositoryRequestTests.cs create mode 100644 Octokit.Tests/Models/SearchRepositoryResultTests.cs create mode 100644 Octokit/Models/Response/SearchResult.cs diff --git a/Octokit.Tests/Models/DeploymentTests.cs b/Octokit.Tests/Models/DeploymentTests.cs index 615cd121..6e25d678 100644 --- a/Octokit.Tests/Models/DeploymentTests.cs +++ b/Octokit.Tests/Models/DeploymentTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using Octokit.Internal; using Xunit; @@ -45,7 +46,7 @@ namespace Octokit.Tests.Models Assert.Equal(1, actual.Id); Assert.Equal("topic-branch", actual.Sha); Assert.Equal("https://api.github.com/repos/octocat/example/deployments/1", actual.Url); - Assert.Equal(new Dictionary { { "environment", "production" } }, actual.Payload); + Assert.Equal(new ReadOnlyDictionary(new Dictionary { { "environment", "production" } }), actual.Payload); Assert.Equal(DateTimeOffset.Parse("2012-07-20T01:19:13Z"), actual.CreatedAt); Assert.Equal(DateTimeOffset.Parse("2012-07-20T01:19:13Z"), actual.UpdatedAt); Assert.Equal("Deploy request from hubot", actual.Description); diff --git a/Octokit.Tests/Models/SearchRepositoryRequestTests.cs b/Octokit.Tests/Models/SearchRepositoryRequestTests.cs new file mode 100644 index 00000000..86557d86 --- /dev/null +++ b/Octokit.Tests/Models/SearchRepositoryRequestTests.cs @@ -0,0 +1,29 @@ +using System; +using Octokit; +using Octokit.Tests.Helpers; +using Xunit; + +public class SearchRepositoryRequestTests +{ + public class TheMergedQualifiersMethod + { + [Fact] + public void ReturnsAReadOnlyDictionary() + { + var request = new SearchCodeRequest("test"); + + var result = request.MergedQualifiers(); + + // If I can cast this to a writeable collection, then that defeats the purpose of a read only. + AssertEx.IsReadOnlyCollection(result); + } + + [Fact] + public void SortNotSpecifiedByDefault() + { + var request = new SearchCodeRequest("test"); + Assert.True(String.IsNullOrWhiteSpace(request.Sort)); + Assert.False(request.Parameters.ContainsKey("sort")); + } + } +} diff --git a/Octokit.Tests/Models/SearchRepositoryResultTests.cs b/Octokit.Tests/Models/SearchRepositoryResultTests.cs new file mode 100644 index 00000000..d7b1a259 --- /dev/null +++ b/Octokit.Tests/Models/SearchRepositoryResultTests.cs @@ -0,0 +1,55 @@ +using Octokit; +using Octokit.Internal; +using Xunit; + +public class SearchRepositoryResultTests +{ + [Fact] + public void CanBeDeserialized() + { + const string json = @"{ + ""total_count"": 40, + ""incomplete_results"": false, + ""items"": [ + { + ""id"": 3081286, + ""name"": ""Tetris"", + ""full_name"": ""dtrupenn/Tetris"", + ""owner"": { + ""login"": ""dtrupenn"", + ""id"": 872147, + ""avatar_url"": ""https://secure.gravatar.com/avatar/e7956084e75f239de85d3a31bc172ace?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"", + ""gravatar_id"": """", + ""url"": ""https://api.github.com/users/dtrupenn"", + ""received_events_url"": ""https://api.github.com/users/dtrupenn/received_events"", + ""type"": ""User"" + }, + ""private"": false, + ""html_url"": ""https://github.com/dtrupenn/Tetris"", + ""description"": ""A C implementation of Tetris using Pennsim through LC4"", + ""fork"": false, + ""url"": ""https://api.github.com/repos/dtrupenn/Tetris"", + ""created_at"": ""2012-01-01T00:31:50Z"", + ""updated_at"": ""2013-01-05T17:58:47Z"", + ""pushed_at"": ""2012-01-01T00:37:02Z"", + ""homepage"": """", + ""size"": 524, + ""stargazers_count"": 1, + ""watchers_count"": 1, + ""language"": ""Assembly"", + ""forks_count"": 0, + ""open_issues_count"": 0, + ""master_branch"": ""master"", + ""default_branch"": ""master"", + ""score"": 10.309712 + } + ] +}"; + var serializer = new SimpleJsonSerializer(); + + var results = serializer.Deserialize(json); + + Assert.Equal(40, results.TotalCount); + Assert.False(results.IncompleteResults); + } +} diff --git a/Octokit.Tests/OctoKit.Tests-NetCore45.csproj b/Octokit.Tests/OctoKit.Tests-NetCore45.csproj index ba5bd9e9..304e2083 100644 --- a/Octokit.Tests/OctoKit.Tests-NetCore45.csproj +++ b/Octokit.Tests/OctoKit.Tests-NetCore45.csproj @@ -138,6 +138,8 @@ + + diff --git a/Octokit.Tests/Octokit.Tests-Portable.csproj b/Octokit.Tests/Octokit.Tests-Portable.csproj index d5368e45..9042716f 100644 --- a/Octokit.Tests/Octokit.Tests-Portable.csproj +++ b/Octokit.Tests/Octokit.Tests-Portable.csproj @@ -138,6 +138,8 @@ + + diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index ac31ffa9..a9da1891 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -152,6 +152,8 @@ + + diff --git a/Octokit/Models/Response/SearchCodeResult.cs b/Octokit/Models/Response/SearchCodeResult.cs index 3ca65183..5e5df717 100644 --- a/Octokit/Models/Response/SearchCodeResult.cs +++ b/Octokit/Models/Response/SearchCodeResult.cs @@ -1,23 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; +using System.Diagnostics; +using Octokit.Internal; namespace Octokit { [DebuggerDisplay("{DebuggerDisplay,nq}")] - public class SearchCodeResult + public class SearchCodeResult : SearchResult { - public int TotalCount { get; set; } - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public IReadOnlyList Items { get; set; } - - internal string DebuggerDisplay - { - get - { - return String.Format(CultureInfo.InvariantCulture, "TotalCount: {0}", TotalCount); - } - } } } \ No newline at end of file diff --git a/Octokit/Models/Response/SearchIssuesResult.cs b/Octokit/Models/Response/SearchIssuesResult.cs index 651f5404..df298f5b 100644 --- a/Octokit/Models/Response/SearchIssuesResult.cs +++ b/Octokit/Models/Response/SearchIssuesResult.cs @@ -1,23 +1,11 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; +using Octokit.Internal; namespace Octokit { [DebuggerDisplay("{DebuggerDisplay,nq}")] - public class SearchIssuesResult + public class SearchIssuesResult : SearchResult { - public int TotalCount { get; set; } - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public IReadOnlyList Items { get; set; } - - internal string DebuggerDisplay - { - get - { - return String.Format(CultureInfo.InvariantCulture, "TotalCount: {0}", TotalCount); - } - } } } \ No newline at end of file diff --git a/Octokit/Models/Response/SearchRepositoryResult.cs b/Octokit/Models/Response/SearchRepositoryResult.cs index 6ee9bc07..2a60d5b8 100644 --- a/Octokit/Models/Response/SearchRepositoryResult.cs +++ b/Octokit/Models/Response/SearchRepositoryResult.cs @@ -1,23 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; +using System.Diagnostics; +using Octokit.Internal; namespace Octokit { [DebuggerDisplay("{DebuggerDisplay,nq}")] - public class SearchRepositoryResult + public class SearchRepositoryResult : SearchResult { - public int TotalCount { get; set; } - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public IReadOnlyList Items { get; set; } - - internal string DebuggerDisplay - { - get - { - return String.Format(CultureInfo.InvariantCulture, "TotalCount: {0}", TotalCount); - } - } } } diff --git a/Octokit/Models/Response/SearchResult.cs b/Octokit/Models/Response/SearchResult.cs new file mode 100644 index 00000000..6ae366cf --- /dev/null +++ b/Octokit/Models/Response/SearchResult.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Globalization; + + +namespace Octokit.Internal +{ + public abstract class SearchResult + { + /// + /// Total number of matching items. + /// + public int TotalCount { get; protected set; } + + /// + /// True if the query timed out and it's possible that the results are incomplete. + /// + public bool IncompleteResults { get; protected set; } + + /// + /// The found items. Up to 100 per page. + /// + public IReadOnlyList Items { get; protected set; } + + internal string DebuggerDisplay + { + get + { + return String.Format(CultureInfo.InvariantCulture, "TotalCount: {0}", TotalCount); + } + } + } +} diff --git a/Octokit/Models/Response/SearchUsersResult.cs b/Octokit/Models/Response/SearchUsersResult.cs index 4e5a4f9c..fef66530 100644 --- a/Octokit/Models/Response/SearchUsersResult.cs +++ b/Octokit/Models/Response/SearchUsersResult.cs @@ -1,23 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; +using System.Diagnostics; +using Octokit.Internal; namespace Octokit { [DebuggerDisplay("{DebuggerDisplay,nq}")] - public class SearchUsersResult + public class SearchUsersResult : SearchResult { - public int TotalCount { get; set; } - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public IReadOnlyList Items { get; set; } - - internal string DebuggerDisplay - { - get - { - return String.Format(CultureInfo.InvariantCulture, "TotalCount: {0}", TotalCount); - } - } } } \ No newline at end of file diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 47a8a758..b167a315 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -357,6 +357,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index 359f7619..15740d1c 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -369,6 +369,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index e114b1c8..5b7eed16 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -364,7 +364,8 @@ + - + \ No newline at end of file diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index 3c6615ed..0470d1fe 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -355,6 +355,7 @@ + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index d9350893..9f17257f 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -359,6 +359,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index dc88d6e7..5e5e7d58 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -192,6 +192,7 @@ +