diff --git a/Octokit.Tests/Clients/StatisticsClientTests.cs b/Octokit.Tests/Clients/StatisticsClientTests.cs index 8c18afaae1..a19e4c25e2 100644 --- a/Octokit.Tests/Clients/StatisticsClientTests.cs +++ b/Octokit.Tests/Clients/StatisticsClientTests.cs @@ -417,8 +417,8 @@ public async Task RequestsCorrectUrl() var expectedEndPoint = new Uri("repos/owner/name/stats/punch_card", UriKind.Relative); var client = Substitute.For(); - IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2, 8, 42 } }); - client.GetQueuedOperation(expectedEndPoint, Args.CancellationToken) + IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2L, 8, 42 } }); + client.GetQueuedOperation(expectedEndPoint, Args.CancellationToken) .Returns(Task.FromResult(data)); var statisticsClient = new StatisticsClient(client); @@ -436,8 +436,8 @@ public async Task RequestsCorrectUrlWithRepositoryId() var expectedEndPoint = new Uri("repositories/1/stats/punch_card", UriKind.Relative); var client = Substitute.For(); - IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2, 8, 42 } }); - client.GetQueuedOperation(expectedEndPoint, Args.CancellationToken) + IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2L, 8, 42 } }); + client.GetQueuedOperation(expectedEndPoint, Args.CancellationToken) .Returns(Task.FromResult(data)); var statisticsClient = new StatisticsClient(client); @@ -456,9 +456,9 @@ public async Task RequestsCorrectUrlWithCancellationToken() var cancellationToken = new CancellationToken(); var connection = Substitute.For(); - IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2, 8, 42 } }); + IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2L, 8, 42 } }); - connection.GetQueuedOperation(expectedEndPoint, cancellationToken) + connection.GetQueuedOperation(expectedEndPoint, cancellationToken) .Returns(Task.FromResult(data)); var client = new StatisticsClient(connection); @@ -477,9 +477,9 @@ public async Task RequestsCorrectUrlWithRepositoryIdWithCancellationToken() var cancellationToken = new CancellationToken(); var connection = Substitute.For(); - IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2, 8, 42 } }); + IReadOnlyList data = new ReadOnlyCollection(new[] { new[] { 2L, 8, 42 } }); - connection.GetQueuedOperation(expectedEndPoint, cancellationToken) + connection.GetQueuedOperation(expectedEndPoint, cancellationToken) .Returns(Task.FromResult(data)); var client = new StatisticsClient(connection); @@ -503,5 +503,24 @@ public async Task EnsureNonNullArguments() await Assert.ThrowsAsync(() => client.GetPunchCard("owner", "")); } } + + [Fact] + public async Task HandlesGreatBigCountsIfGetQueuedOperationTemplateParameterIsLong() + { + var expectedEndPoint = new Uri("repos/owner/name/stats/punch_card", UriKind.Relative); + + var client = Substitute.For(); + IReadOnlyList data = new ReadOnlyCollection(new [] { new [] { 2L, 8L, 42424242424242L } }); + client.GetQueuedOperation(expectedEndPoint, Args.CancellationToken) + .Returns(Task.FromResult(data)); + var statisticsClient = new StatisticsClient(client); + + var result = await statisticsClient.GetPunchCard("owner", "name"); + + Assert.Single(result.PunchPoints); + Assert.Equal(DayOfWeek.Tuesday, result.PunchPoints[0].DayOfWeek); + Assert.Equal(8, result.PunchPoints[0].HourOfTheDay); + Assert.Equal(42424242424242L, result.PunchPoints[0].CommitCount); + } } } diff --git a/Octokit.Tests/Models/PunchCardTests.cs b/Octokit.Tests/Models/PunchCardTests.cs index 781f2ea07f..76ca7bf7c6 100644 --- a/Octokit.Tests/Models/PunchCardTests.cs +++ b/Octokit.Tests/Models/PunchCardTests.cs @@ -33,10 +33,10 @@ public void DoesNotThrowExceptionWhenPunchPointsHaveCorrectFormat() [Fact] public void CanQueryCommitsForDayAndHour() { - IList point1 = new[] { 1, 0, 3 }; - IList point2 = new[] { 1, 1, 4 }; - IList point3 = new[] { 1, 2, 0 }; - IEnumerable> points = new List> { point1, point2, point3 }; + IList point1 = new long[] { 1, 0, 3 }; + IList point2 = new long[] { 1, 1, 4 }; + IList point3 = new long[] { 1, 2, 0 }; + IEnumerable> points = new List> { point1, point2, point3 }; var punchCard = new PunchCard(points); @@ -54,10 +54,10 @@ public void CanQueryCommitsForDayAndHour() [Fact] public void SetsPunchPointsAsReadOnlyDictionary() { - IList point1 = new[] { 1, 0, 3 }; - IList point2 = new[] { 1, 1, 4 }; - IList point3 = new[] { 1, 2, 0 }; - IEnumerable> points = new List> { point1, point2, point3 }; + IList point1 = new long[] { 1, 0, 3 }; + IList point2 = new long[] { 1, 1, 4 }; + IList point3 = new long[] { 1, 2, 0 }; + IEnumerable> points = new List> { point1, point2, point3 }; var punchCard = new PunchCard(points); diff --git a/Octokit/Clients/StatisticsClient.cs b/Octokit/Clients/StatisticsClient.cs index 22bf6e5f8e..3a747a368d 100644 --- a/Octokit/Clients/StatisticsClient.cs +++ b/Octokit/Clients/StatisticsClient.cs @@ -265,7 +265,7 @@ public async Task GetPunchCard(string owner, string name, Cancellatio Ensure.ArgumentNotNullOrEmptyString(owner, nameof(owner)); Ensure.ArgumentNotNullOrEmptyString(name, nameof(name)); - var punchCardData = await ApiConnection.GetQueuedOperation(ApiUrls.StatsPunchCard(owner, name), cancellationToken).ConfigureAwait(false); + var punchCardData = await ApiConnection.GetQueuedOperation(ApiUrls.StatsPunchCard(owner, name), cancellationToken).ConfigureAwait(false); return new PunchCard(punchCardData); } @@ -277,7 +277,7 @@ public async Task GetPunchCard(string owner, string name, Cancellatio [ManualRoute("GET", "/repositories/{id}/stats/punch_card")] public async Task GetPunchCard(long repositoryId, CancellationToken cancellationToken) { - var punchCardData = await ApiConnection.GetQueuedOperation(ApiUrls.StatsPunchCard(repositoryId), cancellationToken).ConfigureAwait(false); + var punchCardData = await ApiConnection.GetQueuedOperation(ApiUrls.StatsPunchCard(repositoryId), cancellationToken).ConfigureAwait(false); return new PunchCard(punchCardData); } } diff --git a/Octokit/Models/Response/PunchCard.cs b/Octokit/Models/Response/PunchCard.cs index ae84674ba5..ea20176ae2 100644 --- a/Octokit/Models/Response/PunchCard.cs +++ b/Octokit/Models/Response/PunchCard.cs @@ -19,6 +19,13 @@ public PunchCard(IEnumerable> punchCardData) punchCardData.Select(point => new PunchCardPoint(point)).ToList()); } + public PunchCard(IEnumerable> punchCardData) + { + Ensure.ArgumentNotNull(punchCardData, nameof(punchCardData)); + PunchPoints = new ReadOnlyCollection( + punchCardData.Select(point => new PunchCardPoint(point)).ToList()); + } + public PunchCard(IEnumerable punchPoints) { PunchPoints = punchPoints?.ToList(); @@ -36,7 +43,7 @@ public PunchCard(IEnumerable punchPoints) /// The day of the week to query /// The hour in 24 hour time. 0-23. /// The total number of commits made. - public int GetCommitCountFor(DayOfWeek dayOfWeek, int hourOfDay) + public long GetCommitCountFor(DayOfWeek dayOfWeek, int hourOfDay) { var punchPoint = PunchPoints.SingleOrDefault(point => point.DayOfWeek == dayOfWeek && point.HourOfTheDay == hourOfDay); return punchPoint == null ? 0 : punchPoint.CommitCount; diff --git a/Octokit/Models/Response/PunchCardPoint.cs b/Octokit/Models/Response/PunchCardPoint.cs index ff8fdc01b9..86a62f4e1c 100644 --- a/Octokit/Models/Response/PunchCardPoint.cs +++ b/Octokit/Models/Response/PunchCardPoint.cs @@ -22,6 +22,18 @@ public PunchCardPoint(IList punchPoint) CommitCount = punchPoint[2]; } + public PunchCardPoint(IList punchPoint) + { + Ensure.ArgumentNotNull(punchPoint, nameof(punchPoint)); + if (punchPoint.Count != 3) + { + throw new ArgumentException("Daily punch card must only contain three data points."); + } + DayOfWeek = (DayOfWeek)punchPoint[0]; + HourOfTheDay = (int)punchPoint[1]; + CommitCount = punchPoint[2]; + } + public PunchCardPoint(DayOfWeek dayOfWeek, int hourOfTheDay, int commitCount) { DayOfWeek = dayOfWeek; @@ -31,7 +43,7 @@ public PunchCardPoint(DayOfWeek dayOfWeek, int hourOfTheDay, int commitCount) public StringEnum DayOfWeek { get; private set; } public int HourOfTheDay { get; private set; } - public int CommitCount { get; private set; } + public long CommitCount { get; private set; } internal string DebuggerDisplay {