From bcbcba00495874a962f4672019ab4b94510d2803 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 22:28:12 -0700 Subject: [PATCH 1/4] Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer (#231) --- samples/GitStatus.Web/GitStatus.Web.csproj | 46 +++++++++++----------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/samples/GitStatus.Web/GitStatus.Web.csproj b/samples/GitStatus.Web/GitStatus.Web.csproj index 2fc4ddd..a2e9d14 100644 --- a/samples/GitStatus.Web/GitStatus.Web.csproj +++ b/samples/GitStatus.Web/GitStatus.Web.csproj @@ -1,23 +1,23 @@ - - - - $(LatestSupportedNetVersion) - service-worker-assets.js - - - - - - - - - - - - - - - - - - + + + + $(LatestSupportedNetVersion) + service-worker-assets.js + + + + + + + + + + + + + + + + + + From 38259e6d23ccd0c69a2469ad34f2d91c2ba197d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 22:30:50 -0700 Subject: [PATCH 2/4] Bump Microsoft.AspNetCore.Components.WebAssembly and System.Text.Json (#232) --- samples/GitStatus.Web/GitStatus.Web.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/GitStatus.Web/GitStatus.Web.csproj b/samples/GitStatus.Web/GitStatus.Web.csproj index a2e9d14..5734d6b 100644 --- a/samples/GitStatus.Web/GitStatus.Web.csproj +++ b/samples/GitStatus.Web/GitStatus.Web.csproj @@ -6,7 +6,7 @@ - + From 9d85050f467dc6b2df2e1009785bb882379db524 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Mon, 23 Sep 2024 05:42:09 -0700 Subject: [PATCH 3/4] Migrate to shields.io --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e67457..374ca06 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ | GitHubApiStatus | GitHubApiStatus.Extensions | | --------------- | -------------------------- | -| [![NuGet](https://buildstats.info/nuget/GitHubApiStatus?includePreReleases=true)](https://www.nuget.org/packages/GitHubApiStatus/) | [![NuGet](https://buildstats.info/nuget/GitHubApiStatus.Extensions?includePreReleases=true)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/) | +| [![NuGet Version](https://img.shields.io/nuget/vpre/GitHubApiStatus)](https://www.nuget.org/packages/GitHubApiStatus/) [![NuGet Downloads](https://img.shields.io/nuget/dt/GitHubApiStatus)](https://www.nuget.org/packages/GitHubApiStatus/) | [![NuGet](https://img.shields.io/nuget/vpre/GitHubApiStatus.Extensions)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/) [![NuGet](https://img.shields.io/nuget/dt/GitHubApiStatus.Extensions)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/) | GitHubApiStatus makes it easy to understand GitHub's API Rate Limit! From 26c5ae40ca86fabc02000ad9d569d059b66cedc2 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:22:45 -0800 Subject: [PATCH 4/4] Support .NET 9 (#233) * Update for .NET 9 * Fix Errors * Update Unit Test forNUnit FluentAssertions * Fix Failing Unit Tests * Update build.yml * Add `AfterAllTests()` * Ensure IGitHubApiStatusService inherits from IDisposable * Update tests for `IDisposable` * Update for .NET 9 GA * Update GitStatus.Mobile.csproj * Update GitHubApiStatusServiceExtensionsTests.cs * Update build.yml * Add `partial` * Update GitStatus.Mobile.csproj --- .github/workflows/build.yml | 81 ++++---- .github/workflows/unittests.yml | 3 +- Directory.Build.props | 95 ++++++--- GitHubApiStatus.sln | 18 +- GitStatus.Common/Constants/GitHubConstants.cs | 9 + GitStatus.Common/GitStatus.Common.csproj | 7 + global.json | 7 +- samples/GitStatus.API/GitStatus.API.csproj | 12 +- samples/GitStatus.API/Program.cs | 14 +- .../GitStatus.ConsoleApp.csproj | 4 +- samples/GitStatus.ConsoleApp/Program.cs | 2 +- samples/GitStatus.Mobile/App.cs | 10 +- samples/GitStatus.Mobile/AppShell.cs | 2 +- .../GitStatus.Mobile/GitStatus.Mobile.csproj | 31 +-- samples/GitStatus.Mobile/MauiProgram.cs | 4 +- .../Pages/Base/BaseContentPage.cs | 2 +- .../Pages/Base/BaseStatusPage.cs | 4 +- .../Pages/GraphQLApiStatusPage.cs | 2 +- .../Pages/RestApiStatusPage.cs | 2 +- .../ViewModels/Base/BaseStatusViewModel.cs | 11 +- .../ViewModels/Base/BaseViewModel.cs | 2 +- .../ViewModels/GraphQLApiStatusViewModel.cs | 16 +- .../ViewModels/RestApiStatusViewModel.cs | 16 +- .../Constants/GitHubConstants.cs | 9 - .../GitStatus.Shared.projitems | 17 -- .../GitStatus.Shared/GitStatus.Shared.shproj | 11 - samples/GitStatus.Web/GitStatus.Web.csproj | 12 +- samples/GitStatus.Web/Program.cs | 8 +- ...itHubApiStatus.Extensions.UnitTests.csproj | 15 +- .../GitHubApiStatusServiceExtensionsTests.cs | 193 +++++++++--------- .../MockGitHubApiStatusService.cs | 7 +- .../GitHubApiStatus.Extensions.csproj | 118 +++++------ .../GitHubApiStatus.UnitTests.csproj | 12 +- .../Tests/Base/BaseTest.cs | 31 ++- ...tApiRateLimitsTests_NoCancellationToken.cs | 146 ++++++------- ...piRateLimitsTests_WithCancellationToken.cs | 148 +++++++------- .../Tests/GetRateLimitRestDateTimeTests.cs | 22 +- .../Tests/GetRateLimitTests.cs | 9 +- .../Tests/GetRateLimitTimeRemainingTests.cs | 16 +- .../Tests/GetRemainingRequestCountTests.cs | 10 +- .../GitHubApiStatusServiceConstructorTests.cs | 74 ++++--- .../HasReachedMaximumApiCallLimitTests.cs | 13 +- .../HttpResponseHeadersExtensionsTests.cs | 26 ++- .../Tests/IsAbuseRateLimitTest.cs | 88 ++++---- ...IsResponseFromAuthenticatedRequestTests.cs | 16 +- .../Tests/ProductHeaderValueTests.cs | 52 +++-- .../SetAuthenticationHeaderValueTests.cs | 41 ++-- src/GitHubApiStatus/GitHubApiStatus.csproj | 181 ++++++++-------- .../Interfaces/IGitHubApiRateLimitResponse.cs | 2 +- .../Interfaces/IGitHubApiRateLimits.cs | 12 +- .../Interfaces/IGitHubApiStatusService.cs | 2 +- .../Interfaces/IRateLimitStatus.cs | 10 +- .../Services/GitHubApiStatusService.cs | 2 +- 53 files changed, 912 insertions(+), 745 deletions(-) create mode 100644 GitStatus.Common/Constants/GitHubConstants.cs create mode 100644 GitStatus.Common/GitStatus.Common.csproj delete mode 100644 samples/GitStatus.Shared/Constants/GitHubConstants.cs delete mode 100644 samples/GitStatus.Shared/GitStatus.Shared.projitems delete mode 100644 samples/GitStatus.Shared/GitStatus.Shared.shproj diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6a79cc4..51d5d90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,12 +13,12 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: "8.0.x" + dotnet-version: '9.0.x' - name: Install .NET MAUI Workload run: | @@ -32,18 +32,18 @@ jobs: MobileProjectDirectory=`dirname $MobileProject` echo $MobileProjectDirectory - dotnet build $MobileProjectDirectory -f:net8.0-android -c Release + dotnet build $MobileProjectDirectory -f:net9.0-android -c Release iOS: - runs-on: macos-13 + runs-on: macos-15 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: "8.0.x" + dotnet-version: '9.0.x' - name: Install .NET MAUI Workload run: | @@ -62,18 +62,18 @@ jobs: MobileProjectDirectory=`dirname $MobileProject` echo $MobileProjectDirectory - dotnet build $MobileProjectDirectory -f:net8.0-ios -c Release + dotnet build $MobileProjectDirectory -f:net9.0-ios -c Release MacCatalyst: - runs-on: macos-13 + runs-on: macos-15 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: "8.0.x" + dotnet-version: '9.0.x' - name: Install .NET MAUI Workload run: | @@ -92,23 +92,23 @@ jobs: MobileProjectDirectory=`dirname $MobileProject` echo $MobileProjectDirectory - dotnet build $MobileProjectDirectory -f:net8.0-maccatalyst -c Release + dotnet build $MobileProjectDirectory -f:net9.0-maccatalyst -c Release Windows: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: distribution: 'microsoft' - java-version: '11' + java-version: '17' - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: "8.0.x" + dotnet-version: '9.0.x' - name: Install .NET MAUI Workload run: | @@ -116,18 +116,18 @@ jobs: - name: Build Windows App run: | - dotnet build ./samples/GitStatus.Mobile/ -c Release -f net8.0-windows10.0.19041.0 + dotnet build ./samples/GitStatus.Mobile/ -c Release -f net9.0-windows10.0.19041.0 API: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Build API App run: | @@ -143,12 +143,12 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Build Console App run: | @@ -164,12 +164,12 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Build Web App run: | @@ -185,12 +185,13 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup .NET v8.0 - uses: actions/setup-dotnet@v3 + - name: Setup .NET v9.0 + uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' + - name: Build Web App run: | diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index ecdd347..dbd99a9 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -10,7 +10,7 @@ on: jobs: UnitTests: - runs-on: macos-latest + runs-on: macos-15 env: GitHubPersonalAccessToken: ${{ secrets.GitHubPersonalAccessToken }} @@ -22,6 +22,7 @@ jobs: uses: actions/setup-dotnet@v4 with: dotnet-version: | + 9.0.x 8.0.x 7.0.x 6.0.x diff --git a/Directory.Build.props b/Directory.Build.props index bd4676f..cd17588 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,41 +2,90 @@ enable - NETSDK1023 - false - latest + 4.0.0 + preview + true enable + net9.0 true true - net8.0 true false + + + 9.0.10 + true true + true + + + enable + all + + + false + false - nullable,CS0419,CS1570,CS1571,CS1572,CS1573,CS1574,CS1580,CS1581,CS1584,CS1587,CS1589,CS1590,CS1591,CS1592,CS1598,CS1658,CS1710,CS1711,CS1712,CS1723,CS1734,xUnit1012,xUnit2021 + CS1734: XML comment has a paramref tag, but there is no parameter by that name + CsWinRT1028: Class implements WinRT interfaces but isn't marked partial + CsWinRT1030: Class implements WinRT interfaces that require unsafe code + XC0045: Binding: Property not found + XC0103: Consider attributing the markup extension with [RequireService] or [AcceptEmptyServiceProvider] if it doesn't require any + NU1900 Error communicating with package source, while getting vulnerability information. + NU1901 Package with low severity detected + NU1902 Package with moderate severity detected + NU1903 Package with high severity detected + NU1904 Package with critical severity detected + NU1905 An audit source does not provide a vulnerability database + NUnit*: NUnit Analyzers + IL2***: Trim Warnings + IL3***: AOT Warnings--> + + nullable, + CS0419,CS0618,CS1570,CS1571,CS1572,CS1573,CS1574,CS1580,CS1581,CS1584,CS1587,CS1589,CS1590,CS1591,CS1592,CS1598,CS1658,CS1710,CS1711,CS1712,CS1723,CS1734, + CsWinRT1028,CsWinRT1030, + XC0045,XC0103, + NU1900,NU1901,NU1902,NU1903,NU1904,NU1905, + NUnit1001,NUnit1002,NUnit1003,NUnit1004,NUnit1005,NUnit1006,NUnit1007,NUnit1008,NUnit1009,NUnit1010,NUnit1011,NUnit1012,NUnit1013,NUnit1014,NUnit1015,NUnit1016,NUnit1017,NUnit1018,NUnit1019,NUnit1020,NUnit1021,NUnit1022,NUnit1023,NUnit1024,NUnit1025,NUnit1026,NUnit1027,NUnit1028,NUnit1029,NUnit1030,NUnit1031,NUnit1032,NUnit1033, + NUnit2001,NUnit2002,NUnit2003,NUnit2004,NUnit2005,NUnit2006,NUnit2007,NUnit2008,NUnit2009,NUnit2010,NUnit2011,NUnit2012,NUnit2013,NUnit2014,NUnit2015,NUnit2016,NUnit2017,NUnit2018,NUnit2019,NUnit2020,NUnit2021,NUnit2022,NUnit2023,NUnit2024,NUnit2025,NUnit2026,NUnit2027,NUnit2028,NUnit2029,NUnit2030,NUnit2031,NUnit2032,NUnit2033,NUnit2034,NUnit2035,NUnit2036,NUnit2037,NUnit2038,NUnit2039,NUnit2040,NUnit2041,NUnit2042,NUnit2043,NUnit2044,NUnit2045,NUnit2046,NUnit2047,NUnit2048,NUnit2049,NUnit2050, + NUnit3001,NUnit3002,NUnit3003,NUnit3004, + NUnit4001, + IL2001,IL2002,IL2003,IL2004,IL2005,IL2006,IL2007,IL2008,IL2009, + IL2010,IL2011,IL2012,IL2013,IL2014,IL2015,IL2016,IL2017,IL2018,IL2019, + IL2020,IL2021,IL2022,IL2023,IL2024,IL2025,IL2026,IL2027,IL2028,IL2029, + IL2030,IL2031,IL2032,IL2033,IL2034,IL2035,IL2036,IL2037,IL2038,IL2039, + IL2040,IL2041,IL2042,IL2043,IL2044,IL2045,IL2046,IL2047,IL2048,IL2049, + IL2050,IL2051,IL2052,IL2053,IL2054,IL2055,IL2056,IL2057,IL2058,IL2059, + IL2060,IL2061,IL2062,IL2063,IL2064,IL2065,IL2066,IL2067,IL2068,IL2069, + IL2070,IL2071,IL2072,IL2073,IL2074,IL2075,IL2076,IL2077,IL2078,IL2079, + IL2080,IL2081,IL2082,IL2083,IL2084,IL2085,IL2086,IL2087,IL2088,IL2089, + IL2090,IL2091,IL2092,IL2093,IL2094,IL2095,IL2096,IL2097,IL2098,IL2099, + IL2100,IL2101,IL2102,IL2103,IL2104,IL2105,IL2106,IL2107,IL2108,IL2109, + IL2110,IL2111,IL2112,IL2113,IL2114,IL2115,IL2116,IL2117,IL2118,IL2119, + IL2120,IL2121,IL2122, + IL3050,IL3051,IL3052,IL3053,IL3054,IL3055,IL3056 + - + \ No newline at end of file diff --git a/GitHubApiStatus.sln b/GitHubApiStatus.sln index 454d4a0..6a5c236 100644 --- a/GitHubApiStatus.sln +++ b/GitHubApiStatus.sln @@ -14,8 +14,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{1D17 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitStatus.ConsoleApp", "samples\GitStatus.ConsoleApp\GitStatus.ConsoleApp.csproj", "{BE045971-4CE8-4C59-BAEB-0BF3A42A9C0A}" EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "GitStatus.Shared", "samples\GitStatus.Shared\GitStatus.Shared.shproj", "{EE691483-A8A2-4071-9C75-E70F0250E5D2}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{6DE141A9-EDFE-464D-BB27-2CFB182118AD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubApiStatus.Extensions", "src\GitHubApiStatus.Extensions\GitHubApiStatus.Extensions.csproj", "{AE935942-772A-4A9D-A1E1-2BC99D41F4C9}" @@ -38,6 +36,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitStatus.Mobile", "samples\GitStatus.Mobile\GitStatus.Mobile.csproj", "{F6B5ED4D-EEF5-46AC-94CA-064D292B0E00}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitStatus.Common", "GitStatus.Common\GitStatus.Common.csproj", "{927E2323-6227-4CE2-AF69-9A4290635040}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -144,6 +144,18 @@ Global {F6B5ED4D-EEF5-46AC-94CA-064D292B0E00}.Release|iPhone.Build.0 = Release|Any CPU {F6B5ED4D-EEF5-46AC-94CA-064D292B0E00}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU {F6B5ED4D-EEF5-46AC-94CA-064D292B0E00}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|Any CPU.Build.0 = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|iPhone.Build.0 = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|Any CPU.ActiveCfg = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|Any CPU.Build.0 = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|iPhone.ActiveCfg = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|iPhone.Build.0 = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {927E2323-6227-4CE2-AF69-9A4290635040}.Release|iPhoneSimulator.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -153,7 +165,6 @@ Global {A52818B8-0C2C-49C5-9389-D8790237ADCE} = {E2BF43DD-5550-414E-9F01-7F7E5492CCB1} {1D178B33-C69B-47E7-AF90-B460B34BCC37} = {E2BF43DD-5550-414E-9F01-7F7E5492CCB1} {BE045971-4CE8-4C59-BAEB-0BF3A42A9C0A} = {1D178B33-C69B-47E7-AF90-B460B34BCC37} - {EE691483-A8A2-4071-9C75-E70F0250E5D2} = {E2BF43DD-5550-414E-9F01-7F7E5492CCB1} {6DE141A9-EDFE-464D-BB27-2CFB182118AD} = {E2BF43DD-5550-414E-9F01-7F7E5492CCB1} {A5FF2946-AE9A-4FE4-8650-75719BA23D5B} = {6DE141A9-EDFE-464D-BB27-2CFB182118AD} {70DBA7CC-2319-4B3F-8F83-97B3368AC890} = {AF841AED-C887-4B39-868A-02242D30780B} @@ -169,7 +180,6 @@ Global samples\GitStatus.Shared\GitStatus.Shared.projitems*{9a30833a-01c9-44ed-b8e2-032a4846574f}*SharedItemsImports = 5 samples\GitStatus.Shared\GitStatus.Shared.projitems*{a5ff2946-ae9a-4fe4-8650-75719ba23d5b}*SharedItemsImports = 5 samples\GitStatus.Shared\GitStatus.Shared.projitems*{be045971-4ce8-4c59-baeb-0bf3a42a9c0a}*SharedItemsImports = 5 - samples\GitStatus.Shared\GitStatus.Shared.projitems*{ee691483-a8a2-4071-9c75-e70f0250e5d2}*SharedItemsImports = 13 samples\GitStatus.Shared\GitStatus.Shared.projitems*{f6b5ed4d-eef5-46ac-94ca-064d292b0e00}*SharedItemsImports = 5 EndGlobalSection EndGlobal diff --git a/GitStatus.Common/Constants/GitHubConstants.cs b/GitStatus.Common/Constants/GitHubConstants.cs new file mode 100644 index 0000000..aeb835b --- /dev/null +++ b/GitStatus.Common/Constants/GitHubConstants.cs @@ -0,0 +1,9 @@ +namespace GitStatus.Common; + +public static class GitHubConstants +{ + public const string AuthScheme = "bearer"; + public const string PersonalAccessToken = ""; + public const string GitHubRestApiUrl = "https://api.github.com"; + public const string GitHubGraphQLApiUrl = "https://api.github.com/graphql"; +} \ No newline at end of file diff --git a/GitStatus.Common/GitStatus.Common.csproj b/GitStatus.Common/GitStatus.Common.csproj new file mode 100644 index 0000000..ac40717 --- /dev/null +++ b/GitStatus.Common/GitStatus.Common.csproj @@ -0,0 +1,7 @@ + + + + net8.0;$(LatestSupportedTFM) + + + diff --git a/global.json b/global.json index e972eb1..3cd0899 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,7 @@ { "sdk": { - "version": "8.0.300", - "rollForward": "latestFeature" + "version": "9.0.100-rc.2.24474.11", + "rollForward": "latestFeature", + "allowPrerelease": true } -} +} \ No newline at end of file diff --git a/samples/GitStatus.API/GitStatus.API.csproj b/samples/GitStatus.API/GitStatus.API.csproj index 9ed3672..c9b4557 100644 --- a/samples/GitStatus.API/GitStatus.API.csproj +++ b/samples/GitStatus.API/GitStatus.API.csproj @@ -1,14 +1,14 @@ - $(LatestSupportedNetVersion) + $(LatestSupportedTFM) v4 Exe <_FunctionsSkipCleanOutput>true - - + + @@ -21,9 +21,7 @@ - - - + + - diff --git a/samples/GitStatus.API/Program.cs b/samples/GitStatus.API/Program.cs index def431a..f82f979 100644 --- a/samples/GitStatus.API/Program.cs +++ b/samples/GitStatus.API/Program.cs @@ -1,11 +1,11 @@ using System.Net.Http.Headers; -using GitHubApiStatus.Extensions; -using GitStatus.Shared; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace GitStatus.API; +using GitHubApiStatus.Extensions; +using GitStatus.Common; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace GitStatus.API; class Program { diff --git a/samples/GitStatus.ConsoleApp/GitStatus.ConsoleApp.csproj b/samples/GitStatus.ConsoleApp/GitStatus.ConsoleApp.csproj index 9a4a43a..51346d7 100644 --- a/samples/GitStatus.ConsoleApp/GitStatus.ConsoleApp.csproj +++ b/samples/GitStatus.ConsoleApp/GitStatus.ConsoleApp.csproj @@ -2,11 +2,11 @@ Exe - $(LatestSupportedNetVersion) + $(LatestSupportedTFM) GitStatus.ConsoleApp + - \ No newline at end of file diff --git a/samples/GitStatus.ConsoleApp/Program.cs b/samples/GitStatus.ConsoleApp/Program.cs index 82f4925..050b0aa 100644 --- a/samples/GitStatus.ConsoleApp/Program.cs +++ b/samples/GitStatus.ConsoleApp/Program.cs @@ -1,6 +1,6 @@ using System.Net.Http.Headers; using GitHubApiStatus; -using GitStatus.Shared; +using GitStatus.Common; namespace GitStatus.ConsoleApp; diff --git a/samples/GitStatus.Mobile/App.cs b/samples/GitStatus.Mobile/App.cs index ab574e8..06dca60 100644 --- a/samples/GitStatus.Mobile/App.cs +++ b/samples/GitStatus.Mobile/App.cs @@ -1,6 +1,12 @@ namespace GitStatus; -class App : Application +partial class App(AppShell appShell) : Application { - public App(AppShell appShell) => MainPage = appShell; + readonly AppShell _appShell = appShell; + + protected override Window CreateWindow(IActivationState? activationState) + { + base.CreateWindow(activationState); + return new(_appShell); + } } \ No newline at end of file diff --git a/samples/GitStatus.Mobile/AppShell.cs b/samples/GitStatus.Mobile/AppShell.cs index 01615f2..b20087e 100644 --- a/samples/GitStatus.Mobile/AppShell.cs +++ b/samples/GitStatus.Mobile/AppShell.cs @@ -1,6 +1,6 @@ namespace GitStatus; -class AppShell : Shell +partial class AppShell : Shell { public AppShell(GraphQLApiStatusPage graphQLApiStatusPage, RestApiStatusPage restApiStatusPage) { diff --git a/samples/GitStatus.Mobile/GitStatus.Mobile.csproj b/samples/GitStatus.Mobile/GitStatus.Mobile.csproj index c636636..65177ff 100644 --- a/samples/GitStatus.Mobile/GitStatus.Mobile.csproj +++ b/samples/GitStatus.Mobile/GitStatus.Mobile.csproj @@ -1,9 +1,9 @@ - + - $(LatestSupportedNetVersion)-android;$(LatestSupportedNetVersion)-ios;$(LatestSupportedNetVersion)-maccatalyst - $(TargetFrameworks);$(LatestSupportedNetVersion)-windows10.0.19041.0 + $(LatestSupportedTFM)-android;$(LatestSupportedTFM)-ios;$(LatestSupportedTFM)-maccatalyst + $(TargetFrameworks);$(LatestSupportedTFM)-windows10.0.19041.0 - + Exe GitStatus true @@ -21,15 +21,20 @@ 1.0 1 - 14.2 - 14.0 + 15.0 + 15.0 21.0 10.0.17763.0 10.0.17763.0 6.5 + + true + + + CsWinRT1028 - + false @@ -48,16 +53,14 @@ - - - - - + + + + + - - diff --git a/samples/GitStatus.Mobile/MauiProgram.cs b/samples/GitStatus.Mobile/MauiProgram.cs index 8f552e6..7b2e724 100644 --- a/samples/GitStatus.Mobile/MauiProgram.cs +++ b/samples/GitStatus.Mobile/MauiProgram.cs @@ -1,8 +1,8 @@ -using System.Net.Http.Headers; +using System.Net.Http.Headers; using CommunityToolkit.Maui; using CommunityToolkit.Maui.Markup; using GitHubApiStatus.Extensions; -using GitStatus.Shared; +using GitStatus.Common; namespace GitStatus; diff --git a/samples/GitStatus.Mobile/Pages/Base/BaseContentPage.cs b/samples/GitStatus.Mobile/Pages/Base/BaseContentPage.cs index 4d0f499..b15d9a9 100644 --- a/samples/GitStatus.Mobile/Pages/Base/BaseContentPage.cs +++ b/samples/GitStatus.Mobile/Pages/Base/BaseContentPage.cs @@ -3,7 +3,7 @@ namespace GitStatus; -abstract class BaseContentPage : ContentPage +abstract partial class BaseContentPage : ContentPage { protected BaseContentPage(in string title = "", bool shouldUseSafeArea = true) { diff --git a/samples/GitStatus.Mobile/Pages/Base/BaseStatusPage.cs b/samples/GitStatus.Mobile/Pages/Base/BaseStatusPage.cs index 5969ba9..413c359 100644 --- a/samples/GitStatus.Mobile/Pages/Base/BaseStatusPage.cs +++ b/samples/GitStatus.Mobile/Pages/Base/BaseStatusPage.cs @@ -2,7 +2,7 @@ namespace GitStatus; -abstract class BaseStatusPage : BaseContentPage where T : BaseStatusViewModel +abstract partial class BaseStatusPage : BaseContentPage where T : BaseStatusViewModel { protected BaseStatusPage(T statusViewModel, string title) : base(statusViewModel, title) { @@ -21,7 +21,7 @@ protected BaseStatusPage(T statusViewModel, string title) : base(statusViewModel .Bind(Button.CommandProperty, static (BaseStatusViewModel vm) => vm.GetStatusCommand, mode: BindingMode.OneTime), new ActivityIndicator { Color = Colors.Black }.Center() - .Bind(IsVisibleProperty, nameof(BaseStatusViewModel.IsBusy)) + .Bind(IsVisibleProperty, static (BaseStatusViewModel vm) => vm.IsBusy) .Bind(ActivityIndicator.IsRunningProperty, static (BaseStatusViewModel vm) => vm.IsBusy) } }.Center(); diff --git a/samples/GitStatus.Mobile/Pages/GraphQLApiStatusPage.cs b/samples/GitStatus.Mobile/Pages/GraphQLApiStatusPage.cs index 621c3a0..5bc1707 100644 --- a/samples/GitStatus.Mobile/Pages/GraphQLApiStatusPage.cs +++ b/samples/GitStatus.Mobile/Pages/GraphQLApiStatusPage.cs @@ -1,6 +1,6 @@ namespace GitStatus; -class GraphQLApiStatusPage : BaseStatusPage +partial class GraphQLApiStatusPage : BaseStatusPage { public GraphQLApiStatusPage(GraphQLApiStatusViewModel graphQLApiStatusViewModel) : base(graphQLApiStatusViewModel, "GraphQL API Status") { diff --git a/samples/GitStatus.Mobile/Pages/RestApiStatusPage.cs b/samples/GitStatus.Mobile/Pages/RestApiStatusPage.cs index 152a433..3387ab9 100644 --- a/samples/GitStatus.Mobile/Pages/RestApiStatusPage.cs +++ b/samples/GitStatus.Mobile/Pages/RestApiStatusPage.cs @@ -1,6 +1,6 @@ namespace GitStatus; -class RestApiStatusPage : BaseStatusPage +partial class RestApiStatusPage : BaseStatusPage { public RestApiStatusPage(RestApiStatusViewModel restApiStatusViewModel) : base(restApiStatusViewModel, "REST API Status") { diff --git a/samples/GitStatus.Mobile/ViewModels/Base/BaseStatusViewModel.cs b/samples/GitStatus.Mobile/ViewModels/Base/BaseStatusViewModel.cs index 81fa312..8ec8d6b 100644 --- a/samples/GitStatus.Mobile/ViewModels/Base/BaseStatusViewModel.cs +++ b/samples/GitStatus.Mobile/ViewModels/Base/BaseStatusViewModel.cs @@ -5,11 +5,16 @@ namespace GitStatus; abstract partial class BaseStatusViewModel : BaseViewModel { + protected BaseStatusViewModel() + { + StatusLabelText = string.Empty; + } + [ObservableProperty] - string _statusLabelText = string.Empty; + public partial string StatusLabelText { get; protected set; } - [ObservableProperty, NotifyCanExecuteChangedFor(nameof(GetStatusCommand))] - bool _isBusy; + [ObservableProperty, NotifyPropertyChangedFor(nameof(IsNotBusy)), NotifyCanExecuteChangedFor(nameof(GetStatusCommand))] + public partial bool IsBusy { get; protected set; } public bool IsNotBusy => !IsBusy; diff --git a/samples/GitStatus.Mobile/ViewModels/Base/BaseViewModel.cs b/samples/GitStatus.Mobile/ViewModels/Base/BaseViewModel.cs index 9137840..d79492a 100644 --- a/samples/GitStatus.Mobile/ViewModels/Base/BaseViewModel.cs +++ b/samples/GitStatus.Mobile/ViewModels/Base/BaseViewModel.cs @@ -2,6 +2,6 @@ namespace GitStatus; -abstract class BaseViewModel : ObservableObject +abstract partial class BaseViewModel : ObservableObject { } \ No newline at end of file diff --git a/samples/GitStatus.Mobile/ViewModels/GraphQLApiStatusViewModel.cs b/samples/GitStatus.Mobile/ViewModels/GraphQLApiStatusViewModel.cs index d4e50b3..dd0cdc0 100644 --- a/samples/GitStatus.Mobile/ViewModels/GraphQLApiStatusViewModel.cs +++ b/samples/GitStatus.Mobile/ViewModels/GraphQLApiStatusViewModel.cs @@ -1,12 +1,10 @@ -using GitHubApiStatus; - -namespace GitStatus; - -class GraphQLApiStatusViewModel : BaseStatusViewModel -{ - readonly IGitHubApiStatusService _gitHubApiStatusService; +using GitHubApiStatus; + +namespace GitStatus; - public GraphQLApiStatusViewModel(IGitHubApiStatusService gitHubApiStatusService) => _gitHubApiStatusService = gitHubApiStatusService; +partial class GraphQLApiStatusViewModel(IGitHubApiStatusService gitHubApiStatusService) : BaseStatusViewModel +{ + readonly IGitHubApiStatusService _gitHubApiStatusService = gitHubApiStatusService; protected override async Task GetStatus() { @@ -14,5 +12,5 @@ protected override async Task GetStatus() var apiRateLimitStatuses = await _gitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token).ConfigureAwait(false); StatusLabelText = apiRateLimitStatuses.GraphQLApi.ToString(); - } + } } \ No newline at end of file diff --git a/samples/GitStatus.Mobile/ViewModels/RestApiStatusViewModel.cs b/samples/GitStatus.Mobile/ViewModels/RestApiStatusViewModel.cs index 7f36717..f66f425 100644 --- a/samples/GitStatus.Mobile/ViewModels/RestApiStatusViewModel.cs +++ b/samples/GitStatus.Mobile/ViewModels/RestApiStatusViewModel.cs @@ -1,12 +1,10 @@ -using GitHubApiStatus; - -namespace GitStatus; - -class RestApiStatusViewModel : BaseStatusViewModel -{ - readonly IGitHubApiStatusService _gitHubApiStatusService; +using GitHubApiStatus; + +namespace GitStatus; - public RestApiStatusViewModel(IGitHubApiStatusService gitHubApiStatusService) => _gitHubApiStatusService = gitHubApiStatusService; +partial class RestApiStatusViewModel(IGitHubApiStatusService gitHubApiStatusService) : BaseStatusViewModel +{ + readonly IGitHubApiStatusService _gitHubApiStatusService = gitHubApiStatusService; protected override async Task GetStatus() { @@ -14,5 +12,5 @@ protected override async Task GetStatus() var apiRateLimitStatuses = await _gitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token).ConfigureAwait(false); StatusLabelText = apiRateLimitStatuses.RestApi.ToString(); - } + } } \ No newline at end of file diff --git a/samples/GitStatus.Shared/Constants/GitHubConstants.cs b/samples/GitStatus.Shared/Constants/GitHubConstants.cs deleted file mode 100644 index f02bbe0..0000000 --- a/samples/GitStatus.Shared/Constants/GitHubConstants.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace GitStatus.Shared; - -static class GitHubConstants -{ - public const string AuthScheme = "bearer"; - public const string PersonalAccessToken = ""; - public const string GitHubRestApiUrl = "https://api.github.com"; - public const string GitHubGraphQLApiUrl = "https://api.github.com/graphql"; -} \ No newline at end of file diff --git a/samples/GitStatus.Shared/GitStatus.Shared.projitems b/samples/GitStatus.Shared/GitStatus.Shared.projitems deleted file mode 100644 index 6488d25..0000000 --- a/samples/GitStatus.Shared/GitStatus.Shared.projitems +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {EE691483-A8A2-4071-9C75-E70F0250E5D2} - - - GitStatus.Shared - - - - - - - - \ No newline at end of file diff --git a/samples/GitStatus.Shared/GitStatus.Shared.shproj b/samples/GitStatus.Shared/GitStatus.Shared.shproj deleted file mode 100644 index fe9e2e3..0000000 --- a/samples/GitStatus.Shared/GitStatus.Shared.shproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - {EE691483-A8A2-4071-9C75-E70F0250E5D2} - - - - - - - \ No newline at end of file diff --git a/samples/GitStatus.Web/GitStatus.Web.csproj b/samples/GitStatus.Web/GitStatus.Web.csproj index 5734d6b..a4b20e3 100644 --- a/samples/GitStatus.Web/GitStatus.Web.csproj +++ b/samples/GitStatus.Web/GitStatus.Web.csproj @@ -1,13 +1,13 @@ - $(LatestSupportedNetVersion) + $(LatestSupportedTFM) service-worker-assets.js - - + + @@ -15,9 +15,7 @@ - - - + + - diff --git a/samples/GitStatus.Web/Program.cs b/samples/GitStatus.Web/Program.cs index 0cf9da4..3c1c483 100644 --- a/samples/GitStatus.Web/Program.cs +++ b/samples/GitStatus.Web/Program.cs @@ -1,8 +1,8 @@ -using System.Net.Http.Headers; -using GitHubApiStatus.Extensions; -using GitStatus.Shared; +using System.Net.Http.Headers; +using GitHubApiStatus.Extensions; +using GitStatus.Common; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - + namespace GitStatus.Web; public class Program diff --git a/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatus.Extensions.UnitTests.csproj b/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatus.Extensions.UnitTests.csproj index 292851c..9b3d447 100644 --- a/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatus.Extensions.UnitTests.csproj +++ b/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatus.Extensions.UnitTests.csproj @@ -1,21 +1,20 @@ - net6.0;net7.0;net8.0 + net8.0;net9.0 false - - - - - - + + + + + + - diff --git a/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatusServiceExtensionsTests.cs b/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatusServiceExtensionsTests.cs index 5c4d66d..7a02ca7 100644 --- a/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatusServiceExtensionsTests.cs +++ b/src/GitHubApiStatus.Extensions.UnitTests/GitHubApiStatusServiceExtensionsTests.cs @@ -1,153 +1,164 @@ -using System.Net.Http.Headers; -using GitStatus.Shared; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; +using System.Net.Http.Headers; +using GitStatus.Common; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; -namespace GitHubApiStatus.Extensions.UnitTests; +namespace GitHubApiStatus.Extensions.UnitTests; class GitHubApiStatusServiceExtensionsTests { [Test] public void NullProductHeaderValue() - { - //Arrange + { + //Arrange var services = new ServiceCollection(); ProductHeaderValue? productHeaderValue = null; - var authenticationHeaderValue = GetAuthenticationHeaderValue(); - - //Act - - //Assett -#pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue)); -#pragma warning restore CS8604 // Possible null reference argument. + var authenticationHeaderValue = GetAuthenticationHeaderValue(); + + //Act + + //Assert +#pragma warning disable CS8604 // Possible null reference argument. + Assert.That(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue), Throws.TypeOf()); +#pragma warning restore CS8604 // Possible null reference argument. } [Test] public void EmptyProductHeaderValue() - { - //Arrange - - //Act - - //Assett - Assert.Throws(() => new ProductHeaderValue("")); + { + //Arrange + + //Act + + //Assert + Assert.That(() => new ProductHeaderValue(""), Throws.TypeOf()); } + [Test] public void WhiteSpaceProductHeaderValue() - { - //Arrange - - //Act - - //Assett - Assert.Throws(() => new ProductHeaderValue(" ")); + { + //Arrange + + //Act + + //Assert + #if NET9_0_OR_GREATER + Assert.That(() => new ProductHeaderValue(" "), Throws.TypeOf()); + #else + Assert.That(() => new ProductHeaderValue(" "), Throws.TypeOf()); + #endif } [Test] public void NullAuthenticationHeaderValue() - { - //Arrange + { + //Arrange var services = new ServiceCollection(); var productHeaderValue = GetProductHeaderValue(); - AuthenticationHeaderValue? authenticationHeaderValue = null; - - //Act - - //Assett -#pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue)); -#pragma warning restore CS8604 // Possible null reference argument. + AuthenticationHeaderValue? authenticationHeaderValue = null; + + //Act + + //Assert +#pragma warning disable CS8604 // Possible null reference argument. + Assert.That(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue), Throws.TypeOf()); +#pragma warning restore CS8604 // Possible null reference argument. } [TestCase("Basic")] [TestCase("Oauth")] [TestCase("Digest")] public void InvalidSchemeAuthenticationHeaderValue(string scheme) - { - //Arrange + { + //Arrange var services = new ServiceCollection(); var productHeaderValue = GetProductHeaderValue(); - var authenticationHeaderValue = new AuthenticationHeaderValue(scheme, GitHubConstants.PersonalAccessToken); - - //Act - - //Assett - Assert.Throws(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue)); + var authenticationHeaderValue = new AuthenticationHeaderValue(scheme, GitHubConstants.PersonalAccessToken); + + //Act + + //Assert + Assert.That(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue), Throws.TypeOf()); } [TestCase(null)] [TestCase("")] [TestCase(" ")] - public void InvalidParameterAuthenticationHeaderValue(string parameter) - { - //Arrange + public void InvalidParameterAuthenticationHeaderValue(string? parameter) + { + //Arrange var services = new ServiceCollection(); var productHeaderValue = GetProductHeaderValue(); - var authenticationHeaderValue = new AuthenticationHeaderValue(GitHubConstants.AuthScheme, parameter); - - //Act - - //Assett - Assert.Throws(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue)); + var authenticationHeaderValue = new AuthenticationHeaderValue(GitHubConstants.AuthScheme, parameter); + + //Act + + //Assert + Assert.That(() => services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue), Throws.TypeOf()); } [Test] public async Task AddGitHubApiStatusService() - { - //Arrange + { + //Arrange var services = new ServiceCollection(); var productHeaderValue = GetProductHeaderValue(); var authenticationHeaderValue = GetAuthenticationHeaderValue(); services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue); - var container = services.BuildServiceProvider(); - - //Act - var gitHubApiStatusServce = container.GetRequiredService(); - - var apiRateLimits = await gitHubApiStatusServce.GetApiRateLimits(CancellationToken.None).ConfigureAwait(false); - - //Assert - Assert.IsNotNull(gitHubApiStatusServce); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + var container = services.BuildServiceProvider(); + + //Act + var gitHubApiStatusService = container.GetRequiredService(); + + var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits(CancellationToken.None).ConfigureAwait(false); + + //Assert + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } [Test] public async Task AddMockGitHubApiStatusService() - { - //Arrange + { + //Arrange var services = new ServiceCollection(); var productHeaderValue = GetProductHeaderValue(); var authenticationHeaderValue = GetAuthenticationHeaderValue(); services.AddGitHubApiStatusService(authenticationHeaderValue, productHeaderValue); - var container = services.BuildServiceProvider(); - - //Act + var container = services.BuildServiceProvider(); + + //Act var gitHubApiStatusServce = container.GetRequiredService(); - var apiRateLimits = await gitHubApiStatusServce.GetApiRateLimits(CancellationToken.None).ConfigureAwait(false); - - //Assert - Assert.IsNotNull(gitHubApiStatusServce); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + var apiRateLimits = await gitHubApiStatusServce.GetApiRateLimits(CancellationToken.None).ConfigureAwait(false); + + //Assert + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusServce, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } static AuthenticationHeaderValue GetAuthenticationHeaderValue() => new(GitHubConstants.AuthScheme, GitHubConstants.PersonalAccessToken); static ProductHeaderValue GetProductHeaderValue() => new(nameof(GitHubApiStatus)); -} \ No newline at end of file +} diff --git a/src/GitHubApiStatus.Extensions.UnitTests/MockGitHubApiStatusService.cs b/src/GitHubApiStatus.Extensions.UnitTests/MockGitHubApiStatusService.cs index 2356de5..6d76fd1 100644 --- a/src/GitHubApiStatus.Extensions.UnitTests/MockGitHubApiStatusService.cs +++ b/src/GitHubApiStatus.Extensions.UnitTests/MockGitHubApiStatusService.cs @@ -3,7 +3,7 @@ namespace GitHubApiStatus.Extensions; -public class MockGitHubApiStatusService(HttpClient httpClient) : IGitHubApiStatusService +public sealed class MockGitHubApiStatusService(HttpClient httpClient) : IGitHubApiStatusService { public bool IsProductHeaderValueValid => true; public bool IsAuthenticationHeaderValueSet => true; @@ -37,4 +37,9 @@ public bool IsAbuseRateLimit(in HttpResponseHeaders httpResponseHeaders, [NotNul delta = null; return false; } + + public void Dispose() + { + httpClient.Dispose(); + } } \ No newline at end of file diff --git a/src/GitHubApiStatus.Extensions/GitHubApiStatus.Extensions.csproj b/src/GitHubApiStatus.Extensions/GitHubApiStatus.Extensions.csproj index afdd360..ab9fcb1 100644 --- a/src/GitHubApiStatus.Extensions/GitHubApiStatus.Extensions.csproj +++ b/src/GitHubApiStatus.Extensions/GitHubApiStatus.Extensions.csproj @@ -1,60 +1,62 @@ - - - netstandard2.0;netstandard2.1;net6.0;net8.0 - true - GitHubApiStatus.Extensions.snk - GitHubApiStatus.Extensions - GitHubApiStatus.Extensions - GitHubApiStatus.Extensions - true - true - true - snupkg - -Extentions for GitHub API Rate Limit Status -- Implements Microsoft.Extensions.DependencyInjection -- Implements Microsoft.Extensions.Http - - github, git, api, rate, rate limit - Extensions for GitHub API Rate Limit Status - -Extentions for GitHub API Rate Limit Status -- Implements Microsoft.Extensions.DependencyInjection -- Implements Microsoft.Extensions.Http - - -New In This Release: -- Add .NET 8.0 -- (Breaking) Add System.Diagnostics.CodeAnalysis to IGitHubApiStatusService - - 3.0.0 - https://github.com/brminnick/GitHubApiStatus - $(AssemblyName) ($(TargetFramework)) - 1.0.0.0 - 1.0.0.0 - $(Version)$(VersionSuffix) - Brandon Minnick - Brandon Minnick - en - ©Copyright 2020 Brandon Minnick. All rights reserved. - false - $(DefineConstants); - false - false - MIT - https://github.com/brminnick/GitHubApiStatus - portable - Release;Debug - false - - - - - - - - - - + + netstandard2.0;netstandard2.1;net8.0;net9.0 + true + GitHubApiStatus.Extensions.snk + GitHubApiStatus.Extensions + GitHubApiStatus.Extensions + GitHubApiStatus.Extensions + true + true + true + snupkg + + Extentions for GitHub API Rate Limit Status + - Implements Microsoft.Extensions.DependencyInjection + - Implements Microsoft.Extensions.Http + + github, git, api, rate, rate limit + Extensions for GitHub API Rate Limit Status + + Extentions for GitHub API Rate Limit Status + - Implements Microsoft.Extensions.DependencyInjection + - Implements Microsoft.Extensions.Http + + + New In This Release: + - Add .NET 9.0 + + $(NuGetVersion) + https://github.com/brminnick/GitHubApiStatus + $(AssemblyName) ($(TargetFramework)) + 1.0.0.0 + 1.0.0.0 + $(Version)$(VersionSuffix) + Brandon Minnick + Brandon Minnick + en + ©Copyright 2020 Brandon Minnick. All rights reserved. + false + $(DefineConstants); + false + false + MIT + https://github.com/brminnick/GitHubApiStatus + portable + Release;Debug + false + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/GitHubApiStatus.UnitTests/GitHubApiStatus.UnitTests.csproj b/src/GitHubApiStatus.UnitTests/GitHubApiStatus.UnitTests.csproj index 7026b59..4a98ec6 100644 --- a/src/GitHubApiStatus.UnitTests/GitHubApiStatus.UnitTests.csproj +++ b/src/GitHubApiStatus.UnitTests/GitHubApiStatus.UnitTests.csproj @@ -1,20 +1,20 @@ - net6.0;net7.0;net8.0 + net8.0;net9.0 false - - + + + + - + - - diff --git a/src/GitHubApiStatus.UnitTests/Tests/Base/BaseTest.cs b/src/GitHubApiStatus.UnitTests/Tests/Base/BaseTest.cs index 8ded9f3..71ca84f 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/Base/BaseTest.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/Base/BaseTest.cs @@ -1,7 +1,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using Newtonsoft.Json; using NUnit.Framework; @@ -11,17 +11,32 @@ abstract class BaseTest { const string _authorizationHeaderKey = "Authorization"; - static readonly HttpClient _client = CreateGitHubHttpClient(new AuthenticationHeaderValue(GitHubConstants.AuthScheme, GitHubConstants.PersonalAccessToken), new ProductHeaderValue(nameof(GitHubApiStatus))); + HttpClient _client = CreateGitHubHttpClient(new AuthenticationHeaderValue(GitHubConstants.AuthScheme, GitHubConstants.PersonalAccessToken), new ProductHeaderValue(nameof(GitHubApiStatus))); - protected IGitHubApiStatusService GitHubApiStatusService { get; } = new GitHubApiStatusService(_client); + protected IGitHubApiStatusService GitHubApiStatusService { get; private set; } = new GitHubApiStatusService(); [SetUp] - protected virtual Task BeforeEachTest() => Task.CompletedTask; + protected virtual Task BeforeEachTest() + { + _client = CreateGitHubHttpClient(new AuthenticationHeaderValue(GitHubConstants.AuthScheme, GitHubConstants.PersonalAccessToken), new ProductHeaderValue(nameof(GitHubApiStatus))); + GitHubApiStatusService = new GitHubApiStatusService(_client); + return Task.CompletedTask; + } [TearDown] protected virtual Task AfterEachTest() { GitHubApiStatusService.SetAuthenticationHeaderValue(new AuthenticationHeaderValue(GitHubConstants.AuthScheme, GitHubConstants.PersonalAccessToken)); + _client.Dispose(); + GitHubApiStatusService.Dispose(); + return Task.CompletedTask; + } + + [OneTimeTearDown] + protected virtual Task AfterAllTests() + { + _client.Dispose(); + GitHubApiStatusService.Dispose(); return Task.CompletedTask; } @@ -58,13 +73,13 @@ protected static HttpClient CreateGitHubHttpClient(in AuthenticationHeaderValue return client; } - protected static Task SendValidRestApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/repos/brminnick/GitHubApiStatus"); + protected Task SendValidRestApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/repos/brminnick/GitHubApiStatus"); - protected static Task SendValidSearchApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/search/code"); + protected Task SendValidSearchApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/search/code"); - protected static Task SendValidCodeScanningApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/repos/brminnick/GitHubApiStatus/code-scanning/alerts"); + protected Task SendValidCodeScanningApiRequest() => _client.GetAsync($"{GitHubConstants.GitHubRestApiUrl}/repos/brminnick/GitHubApiStatus/code-scanning/alerts"); - protected static Task SendValidGraphQLApiRequest() + protected Task SendValidGraphQLApiRequest() { var graphQLRequest = new GraphQLRequest("query { user(login: \"brminnick\"){ name, company, createdAt}}"); var serializedGraphQLRequest = JsonConvert.SerializeObject(graphQLRequest); diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_NoCancellationToken.cs b/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_NoCancellationToken.cs index 6f5686e..1f6c570 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_NoCancellationToken.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_NoCancellationToken.cs @@ -1,5 +1,5 @@ using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using NUnit.Framework; namespace GitHubApiStatus.UnitTests; @@ -26,28 +26,30 @@ public async Task GetApiRateLimits_ValidRestApiRequest() restApiStatus_Final = gitHubApiRateLimits_Final.RestApi; //Assert - Assert.IsNotNull(restApiStatus_Initial); - Assert.AreEqual(5000, restApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(restApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(restApiStatus_Initial.RemainingRequestCount, restApiStatus_Initial.RateLimit); - Assert.AreEqual(restApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), restApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(restApiStatus_Final); - Assert.AreEqual(5000, restApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(restApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(restApiStatus_Final.RemainingRequestCount, restApiStatus_Final.RateLimit); - Assert.AreEqual(restApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), restApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(restApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(restApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.AreEqual(restApiStatus_Initial.RateLimit, restApiStatus_Final.RateLimit); - Assert.IsTrue(restApiStatus_Initial.RateLimitReset_DateTime == restApiStatus_Final.RateLimitReset_DateTime || restApiStatus_Initial.RateLimitReset_DateTime == restApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1))); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, restApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds); - Assert.AreEqual(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, restApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.Greater(restApiStatus_Initial.RemainingRequestCount, restApiStatus_Final.RemainingRequestCount); - + Assert.Multiple(() => + { + Assert.That(restApiStatus_Initial, Is.Not.Null); + Assert.That(restApiStatus_Initial.RateLimit, Is.EqualTo(5000)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(restApiStatus_Initial.RateLimit)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(restApiStatus_Final, Is.Not.Null); + Assert.That(restApiStatus_Final.RateLimit, Is.EqualTo(5000)); + Assert.That(restApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(restApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(restApiStatus_Final.RateLimit)); + Assert.That(restApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(restApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(restApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(restApiStatus_Initial.RateLimit, Is.EqualTo(restApiStatus_Final.RateLimit)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(restApiStatus_Final.RateLimitReset_DateTime).Or.EqualTo(restApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1)))); + Assert.That(restApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, Is.GreaterThanOrEqualTo(restApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds)); + Assert.That(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(restApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.GreaterThan(restApiStatus_Final.RemainingRequestCount)); + }); } [Test] @@ -70,27 +72,30 @@ public async Task GetApiRateLimits_ValidGraphQLApiRequest() graphQLApiStatus_Final = gitHubApiRateLimits_Final.GraphQLApi; //Assert - Assert.IsNotNull(graphQLApiStatus_Initial); - Assert.AreEqual(5000, graphQLApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(graphQLApiStatus_Initial.RemainingRequestCount, graphQLApiStatus_Initial.RateLimit); - Assert.AreEqual(graphQLApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(graphQLApiStatus_Final); - Assert.AreEqual(5000, graphQLApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(graphQLApiStatus_Final.RemainingRequestCount, graphQLApiStatus_Final.RateLimit); - Assert.AreEqual(graphQLApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.AreEqual(graphQLApiStatus_Initial.RateLimit, graphQLApiStatus_Final.RateLimit); - Assert.IsTrue(graphQLApiStatus_Initial.RateLimitReset_DateTime == graphQLApiStatus_Final.RateLimitReset_DateTime || graphQLApiStatus_Initial.RateLimitReset_DateTime == graphQLApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1))); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, graphQLApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds); - Assert.AreEqual(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.Greater(graphQLApiStatus_Initial.RemainingRequestCount, graphQLApiStatus_Final.RemainingRequestCount); + Assert.Multiple(() => + { + Assert.That(graphQLApiStatus_Initial, Is.Not.Null); + Assert.That(graphQLApiStatus_Initial.RateLimit, Is.EqualTo(5000)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(graphQLApiStatus_Initial.RateLimit)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(graphQLApiStatus_Final, Is.Not.Null); + Assert.That(graphQLApiStatus_Final.RateLimit, Is.EqualTo(5000)); + Assert.That(graphQLApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(graphQLApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(graphQLApiStatus_Final.RateLimit)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(graphQLApiStatus_Initial.RateLimit, Is.EqualTo(graphQLApiStatus_Final.RateLimit)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_DateTime).Or.EqualTo(graphQLApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1)))); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, Is.GreaterThanOrEqualTo(graphQLApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.GreaterThan(graphQLApiStatus_Final.RemainingRequestCount)); + }); } [Test] @@ -113,30 +118,33 @@ public async Task GetApiRateLimits_ValidSearchApiRequest() searchApiStatus_Final = gitHubApiRateLimits_Final.SearchApi; //Assert - Assert.IsNotNull(searchApiStatus_Initial); - Assert.AreEqual(30, searchApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(searchApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(searchApiStatus_Initial.RemainingRequestCount, searchApiStatus_Initial.RateLimit); - Assert.AreEqual(searchApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(searchApiStatus_Final); - Assert.AreEqual(30, searchApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(searchApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(searchApiStatus_Final.RemainingRequestCount, searchApiStatus_Final.RateLimit); - Assert.AreEqual(searchApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), searchApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - if (searchApiStatus_Final.RateLimitReset_DateTime == searchApiStatus_Initial.RateLimitReset_DateTime) + Assert.Multiple(() => { - Assert.AreEqual(searchApiStatus_Initial.RateLimit, searchApiStatus_Final.RateLimit); - Assert.IsTrue(searchApiStatus_Initial.RateLimitReset_DateTime == searchApiStatus_Final.RateLimitReset_DateTime || searchApiStatus_Initial.RateLimitReset_DateTime == searchApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1))); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, searchApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds); - Assert.AreEqual(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, searchApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Initial.RemainingRequestCount, searchApiStatus_Final.RemainingRequestCount); - } + Assert.That(searchApiStatus_Initial, Is.Not.Null); + Assert.That(searchApiStatus_Initial.RateLimit, Is.EqualTo(30)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(searchApiStatus_Initial.RateLimit)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(searchApiStatus_Final, Is.Not.Null); + Assert.That(searchApiStatus_Final.RateLimit, Is.EqualTo(30)); + Assert.That(searchApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(searchApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(searchApiStatus_Final.RateLimit)); + Assert.That(searchApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + if (searchApiStatus_Final.RateLimitReset_DateTime == searchApiStatus_Initial.RateLimitReset_DateTime) + { + Assert.That(searchApiStatus_Initial.RateLimit, Is.EqualTo(searchApiStatus_Final.RateLimit)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(searchApiStatus_Final.RateLimitReset_DateTime).Or.EqualTo(searchApiStatus_Final.RateLimitReset_DateTime.Subtract(TimeSpan.FromSeconds(1)))); + Assert.That(searchApiStatus_Initial.RateLimitReset_TimeRemaining.TotalMilliseconds, Is.GreaterThanOrEqualTo(searchApiStatus_Final.RateLimitReset_TimeRemaining.TotalMilliseconds)); + Assert.That(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(searchApiStatus_Final.RemainingRequestCount)); + } + }); } [Test] @@ -150,6 +158,6 @@ public void GetApiRateLimits_InvalidBearerToken() //Assert var httpRequestException = Assert.ThrowsAsync(() => gitHubApiStatusService.GetApiRateLimits()); - Assert.IsTrue(httpRequestException?.Message.Contains("Unauthorized")); + Assert.That(httpRequestException?.Message, Does.Contain("Unauthorized")); } -} \ No newline at end of file +} diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_WithCancellationToken.cs b/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_WithCancellationToken.cs index 505c01f..781b22c 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_WithCancellationToken.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetApiRateLimitsTests_WithCancellationToken.cs @@ -1,6 +1,6 @@ using System.Net.Http; using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using NUnit.Framework; namespace GitHubApiStatus.UnitTests; @@ -27,28 +27,30 @@ public async Task GetApiRateLimits_ValidRestApiRequest() restApiStatus_Final = gitHubApiRateLimits_Final.RestApi; //Assert - Assert.IsNotNull(restApiStatus_Initial); - Assert.AreEqual(5000, restApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(restApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(restApiStatus_Initial.RemainingRequestCount, restApiStatus_Initial.RateLimit); - Assert.AreEqual(restApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), restApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(restApiStatus_Final); - Assert.AreEqual(5000, restApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(restApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(restApiStatus_Final.RemainingRequestCount, restApiStatus_Final.RateLimit); - Assert.AreEqual(restApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), restApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(restApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(restApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.AreEqual(restApiStatus_Initial.RateLimit, restApiStatus_Final.RateLimit); - Assert.AreEqual(restApiStatus_Initial.RateLimitReset_DateTime, restApiStatus_Final.RateLimitReset_DateTime); - Assert.GreaterOrEqual(restApiStatus_Initial.RateLimitReset_TimeRemaining, restApiStatus_Final.RateLimitReset_TimeRemaining); - Assert.AreEqual(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, restApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.Greater(restApiStatus_Initial.RemainingRequestCount, restApiStatus_Final.RemainingRequestCount); - + Assert.Multiple(() => + { + Assert.That(restApiStatus_Initial, Is.Not.Null); + Assert.That(restApiStatus_Initial.RateLimit, Is.EqualTo(5000)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(restApiStatus_Initial.RateLimit)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(restApiStatus_Final, Is.Not.Null); + Assert.That(restApiStatus_Final.RateLimit, Is.EqualTo(5000)); + Assert.That(restApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(restApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(restApiStatus_Final.RateLimit)); + Assert.That(restApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(restApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(restApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(restApiStatus_Initial.RateLimit, Is.EqualTo(restApiStatus_Final.RateLimit)); + Assert.That(restApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(restApiStatus_Final.RateLimitReset_DateTime)); + Assert.That(restApiStatus_Initial.RateLimitReset_TimeRemaining, Is.GreaterThanOrEqualTo(restApiStatus_Final.RateLimitReset_TimeRemaining)); + Assert.That(restApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(restApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(restApiStatus_Initial.RemainingRequestCount, Is.GreaterThan(restApiStatus_Final.RemainingRequestCount)); + }); } [Test] @@ -71,27 +73,30 @@ public async Task GetApiRateLimits_ValidGraphQLApiRequest() graphQLApiStatus_Final = gitHubApiRateLimits_Final.GraphQLApi; //Assert - Assert.IsNotNull(graphQLApiStatus_Initial); - Assert.AreEqual(5000, graphQLApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(graphQLApiStatus_Initial.RemainingRequestCount, graphQLApiStatus_Initial.RateLimit); - Assert.AreEqual(graphQLApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(graphQLApiStatus_Final); - Assert.AreEqual(5000, graphQLApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(graphQLApiStatus_Final.RemainingRequestCount, graphQLApiStatus_Final.RateLimit); - Assert.AreEqual(graphQLApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.AreEqual(graphQLApiStatus_Initial.RateLimit, graphQLApiStatus_Final.RateLimit); - Assert.AreEqual(graphQLApiStatus_Initial.RateLimitReset_DateTime, graphQLApiStatus_Final.RateLimitReset_DateTime); - Assert.GreaterOrEqual(graphQLApiStatus_Initial.RateLimitReset_TimeRemaining, graphQLApiStatus_Final.RateLimitReset_TimeRemaining); - Assert.AreEqual(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.Greater(graphQLApiStatus_Initial.RemainingRequestCount, graphQLApiStatus_Final.RemainingRequestCount); + Assert.Multiple(() => + { + Assert.That(graphQLApiStatus_Initial, Is.Not.Null); + Assert.That(graphQLApiStatus_Initial.RateLimit, Is.EqualTo(5000)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(graphQLApiStatus_Initial.RateLimit)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(graphQLApiStatus_Final, Is.Not.Null); + Assert.That(graphQLApiStatus_Final.RateLimit, Is.EqualTo(5000)); + Assert.That(graphQLApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(graphQLApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(graphQLApiStatus_Final.RateLimit)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(graphQLApiStatus_Initial.RateLimit, Is.EqualTo(graphQLApiStatus_Final.RateLimit)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_DateTime)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_TimeRemaining, Is.GreaterThanOrEqualTo(graphQLApiStatus_Final.RateLimitReset_TimeRemaining)); + Assert.That(graphQLApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(graphQLApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(graphQLApiStatus_Initial.RemainingRequestCount, Is.GreaterThan(graphQLApiStatus_Final.RemainingRequestCount)); + }); } [Test] @@ -114,30 +119,33 @@ public async Task GetApiRateLimits_ValidSearchApiRequest() searchApiStatus_Final = gitHubApiRateLimits_Final.SearchApi; //Assert - Assert.IsNotNull(searchApiStatus_Initial); - Assert.AreEqual(30, searchApiStatus_Initial.RateLimit); - Assert.GreaterOrEqual(searchApiStatus_Initial.RemainingRequestCount, 0); - Assert.LessOrEqual(searchApiStatus_Initial.RemainingRequestCount, searchApiStatus_Initial.RateLimit); - Assert.AreEqual(searchApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - Assert.IsNotNull(searchApiStatus_Final); - Assert.AreEqual(30, searchApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(searchApiStatus_Final.RemainingRequestCount, 0); - Assert.LessOrEqual(searchApiStatus_Final.RemainingRequestCount, searchApiStatus_Final.RateLimit); - Assert.AreEqual(searchApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), searchApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Final.RateLimitReset_DateTime, startTime); - Assert.GreaterOrEqual(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds, startTime.ToUnixTimeSeconds()); - - if (searchApiStatus_Final.RateLimitReset_DateTime == searchApiStatus_Initial.RateLimitReset_DateTime) + Assert.Multiple(() => { - Assert.AreEqual(searchApiStatus_Initial.RateLimit, searchApiStatus_Final.RateLimit); - Assert.GreaterOrEqual(searchApiStatus_Final.RateLimitReset_DateTime, searchApiStatus_Initial.RateLimitReset_DateTime); - Assert.GreaterOrEqual(searchApiStatus_Initial.RateLimitReset_TimeRemaining, searchApiStatus_Final.RateLimitReset_TimeRemaining); - Assert.AreEqual(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, searchApiStatus_Final.RateLimitReset_UnixEpochSeconds); - Assert.GreaterOrEqual(searchApiStatus_Initial.RemainingRequestCount, searchApiStatus_Final.RemainingRequestCount); - } + Assert.That(searchApiStatus_Initial, Is.Not.Null); + Assert.That(searchApiStatus_Initial.RateLimit, Is.EqualTo(30)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.LessThanOrEqualTo(searchApiStatus_Initial.RateLimit)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + Assert.That(searchApiStatus_Final, Is.Not.Null); + Assert.That(searchApiStatus_Final.RateLimit, Is.EqualTo(30)); + Assert.That(searchApiStatus_Final.RemainingRequestCount, Is.GreaterThanOrEqualTo(0)); + Assert.That(searchApiStatus_Final.RemainingRequestCount, Is.LessThanOrEqualTo(searchApiStatus_Final.RateLimit)); + Assert.That(searchApiStatus_Final.RateLimitReset_DateTime.ToUnixTimeSeconds(), Is.EqualTo(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Final.RateLimitReset_DateTime, Is.GreaterThanOrEqualTo(startTime)); + Assert.That(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds, Is.GreaterThanOrEqualTo(startTime.ToUnixTimeSeconds())); + + if (searchApiStatus_Final.RateLimitReset_DateTime == searchApiStatus_Initial.RateLimitReset_DateTime) + { + Assert.That(searchApiStatus_Initial.RateLimit, Is.EqualTo(searchApiStatus_Final.RateLimit)); + Assert.That(searchApiStatus_Initial.RateLimitReset_DateTime, Is.EqualTo(searchApiStatus_Final.RateLimitReset_DateTime)); + Assert.That(searchApiStatus_Initial.RateLimitReset_TimeRemaining, Is.GreaterThanOrEqualTo(searchApiStatus_Final.RateLimitReset_TimeRemaining)); + Assert.That(searchApiStatus_Initial.RateLimitReset_UnixEpochSeconds, Is.EqualTo(searchApiStatus_Final.RateLimitReset_UnixEpochSeconds)); + Assert.That(searchApiStatus_Initial.RemainingRequestCount, Is.GreaterThanOrEqualTo(searchApiStatus_Final.RemainingRequestCount)); + } + }); } [Test] @@ -150,7 +158,7 @@ public void GetApiRateLimits_CancelledRequest() //Act //Assert - Assert.ThrowsAsync(() => GitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token)); + Assert.That(() => GitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token), Throws.TypeOf()); } [Test] @@ -164,6 +172,6 @@ public void GetApiRateLimits_InvalidBearerToken() //Assert var httpRequestException = Assert.ThrowsAsync(() => GitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token)); - Assert.IsTrue(httpRequestException?.Message.Contains("Unauthorized")); + Assert.That(httpRequestException?.Message, Does.Contain("Unauthorized")); } -} \ No newline at end of file +} diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitRestDateTimeTests.cs b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitRestDateTimeTests.cs index a7ab37d..4d6a3a8 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitRestDateTimeTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitRestDateTimeTests.cs @@ -20,12 +20,15 @@ public void GetRateLimitResetDateTime_ValidHttpResponseHeaders() //Act rateLimitResetDateTime_Actual = GitHubApiStatusService.GetRateLimitResetDateTime(validHttpResponseHeaders); - //Assert Test all values except Milliseconds, because GitHub API - Assert.AreEqual(rateLimitResetDateTime_Expected.Second, rateLimitResetDateTime_Actual.Second); - Assert.AreEqual(rateLimitResetDateTime_Expected.Minute, rateLimitResetDateTime_Actual.Minute); - Assert.AreEqual(rateLimitResetDateTime_Expected.Hour, rateLimitResetDateTime_Actual.Hour); - Assert.AreEqual(rateLimitResetDateTime_Expected.DayOfYear, rateLimitResetDateTime_Actual.DayOfYear); - Assert.AreEqual(rateLimitResetDateTime_Expected.Year, rateLimitResetDateTime_Actual.Year); + //Assert + Assert.Multiple(() => + { + Assert.That(rateLimitResetDateTime_Expected.Second, Is.EqualTo(rateLimitResetDateTime_Actual.Second)); + Assert.That(rateLimitResetDateTime_Expected.Minute, Is.EqualTo(rateLimitResetDateTime_Actual.Minute)); + Assert.That(rateLimitResetDateTime_Expected.Hour, Is.EqualTo(rateLimitResetDateTime_Actual.Hour)); + Assert.That(rateLimitResetDateTime_Expected.DayOfYear, Is.EqualTo(rateLimitResetDateTime_Actual.DayOfYear)); + Assert.That(rateLimitResetDateTime_Expected.Year, Is.EqualTo(rateLimitResetDateTime_Actual.Year)); + }); } [Test] @@ -37,7 +40,7 @@ public void GetRateLimitResetDateTime_InvalidHttpResponseHeaders() //Act //Assert - Assert.Throws(() => GitHubApiStatusService.GetRateLimitResetDateTime(invalidHttpResponseMessage.Headers)); + Assert.That(() => GitHubApiStatusService.GetRateLimitResetDateTime(invalidHttpResponseMessage.Headers), Throws.TypeOf()); } [Test] @@ -50,7 +53,8 @@ public void GetRateLimitResetDateTime_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.GetRateLimitResetDateTime(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.GetRateLimitResetDateTime(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTests.cs b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTests.cs index ad249f2..6cb3fc6 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTests.cs @@ -19,7 +19,7 @@ public void GetRateLimit_ValidHttpResponseHeaders() rateLimit_Actual = GitHubApiStatusService.GetRateLimit(validHttpResponseHeaders); //Assert - Assert.AreEqual(rateLimit_Expected, rateLimit_Actual); + Assert.That(rateLimit_Actual, Is.EqualTo(rateLimit_Expected)); } [Test] @@ -31,7 +31,7 @@ public void GetRateLimit_InvalidHttpResponseHeaders() //Act //Assert - Assert.Throws(() => GitHubApiStatusService.GetRateLimit(invalidHttpResponseMessage.Headers)); + Assert.That(() => GitHubApiStatusService.GetRateLimit(invalidHttpResponseMessage.Headers), Throws.TypeOf()); } [Test] @@ -44,7 +44,8 @@ public void GetRateLimit_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.GetRateLimit(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.GetRateLimit(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTimeRemainingTests.cs b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTimeRemainingTests.cs index 4fee797..cb18c28 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTimeRemainingTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetRateLimitTimeRemainingTests.cs @@ -16,15 +16,17 @@ public void GetRemainingRequestCount_ValidHttpResponseHeaders() var rateLimitTimeRemaining_Expected = TimeSpan.FromMinutes(45); var rateLimitResetDateTime = DateTimeOffset.UtcNow.Add(rateLimitTimeRemaining_Expected); - var validHttpResponseHeaders = CreateHttpResponseHeaders(rateLimit, rateLimitResetDateTime, rateLimit - 5); //Act rateLimitTimeRemaining_Actual = GitHubApiStatusService.GetRateLimitTimeRemaining(validHttpResponseHeaders); //Assert - Assert.Greater(rateLimitTimeRemaining_Expected, rateLimitTimeRemaining_Actual); - Assert.Less(rateLimitTimeRemaining_Expected.Subtract(TimeSpan.FromSeconds(2)), rateLimitTimeRemaining_Actual); + Assert.Multiple(() => + { + Assert.That(rateLimitTimeRemaining_Expected, Is.GreaterThan(rateLimitTimeRemaining_Actual)); + Assert.That(rateLimitTimeRemaining_Expected.Subtract(TimeSpan.FromSeconds(2)), Is.LessThan(rateLimitTimeRemaining_Actual)); + }); } [Test] @@ -36,7 +38,7 @@ public void GetRemainingRequestCount_InvalidHttpResponseHeaders() //Act //Assert - Assert.Throws(() => GitHubApiStatusService.GetRateLimitTimeRemaining(invalidHttpResponseMessage.Headers)); + Assert.That(() => GitHubApiStatusService.GetRateLimitTimeRemaining(invalidHttpResponseMessage.Headers), Throws.TypeOf()); } [Test] @@ -49,7 +51,9 @@ public void GetRemainingRequestCount_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.GetRateLimitTimeRemaining(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.GetRateLimitTimeRemaining(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/GetRemainingRequestCountTests.cs b/src/GitHubApiStatus.UnitTests/Tests/GetRemainingRequestCountTests.cs index baf7ba1..99d6628 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GetRemainingRequestCountTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GetRemainingRequestCountTests.cs @@ -21,7 +21,7 @@ public void GetRemainingRequestCount_ValidHttpResponseHeaders() remainingRequestCount_Actual = GitHubApiStatusService.GetRemainingRequestCount(validHttpResponseHeaders); //Assert - Assert.AreEqual(remainingRequestCount_Expected, remainingRequestCount_Actual); + Assert.That(remainingRequestCount_Actual, Is.EqualTo(remainingRequestCount_Expected)); } [Test] @@ -33,7 +33,7 @@ public void GetRemainingRequestCount_InvalidHttpResponseHeaders() //Act //Assert - Assert.Throws(() => GitHubApiStatusService.GetRemainingRequestCount(invalidHttpResponseMessage.Headers)); + Assert.That(() => GitHubApiStatusService.GetRemainingRequestCount(invalidHttpResponseMessage.Headers), Throws.TypeOf()); } [Test] @@ -46,7 +46,9 @@ public void GetRemainingRequestCount_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.GetRemainingRequestCount(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.GetRemainingRequestCount(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/GitHubApiStatusServiceConstructorTests.cs b/src/GitHubApiStatus.UnitTests/Tests/GitHubApiStatusServiceConstructorTests.cs index 44c65b8..b2a7af2 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/GitHubApiStatusServiceConstructorTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/GitHubApiStatusServiceConstructorTests.cs @@ -1,5 +1,5 @@ using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using NUnit.Framework; namespace GitHubApiStatus.UnitTests; @@ -15,7 +15,7 @@ public void DefaultConstructorTest() //Act //Assert - Assert.ThrowsAsync(() => githubApiStatusService.GetApiRateLimits()); + Assert.That(() => githubApiStatusService.GetApiRateLimits(), Throws.TypeOf()); } [Test] @@ -28,7 +28,7 @@ public void NullAuthenticationHeaderValue() //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => new GitHubApiStatusService(null, productHeaderValue)); + Assert.That(() => new GitHubApiStatusService(null, productHeaderValue), Throws.TypeOf()); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. } @@ -42,7 +42,7 @@ public void NullProductHeaderValue() //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => new GitHubApiStatusService(authenticationHeaderValue, null)); + Assert.That(() => new GitHubApiStatusService(authenticationHeaderValue, null), Throws.TypeOf()); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. } @@ -55,7 +55,7 @@ public void NullHttpClient() //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => new GitHubApiStatusService(null)); + Assert.That(() => new GitHubApiStatusService(null), Throws.TypeOf()); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. } @@ -71,7 +71,7 @@ public void InvalidSchemeAuthenticationHeaderValue(string scheme) //Act //Assert - Assert.Throws(() => new GitHubApiStatusService(authenticationHeaderValue, productHeaderValue)); + Assert.That(() => new GitHubApiStatusService(authenticationHeaderValue, productHeaderValue), Throws.TypeOf()); } [Test] @@ -86,14 +86,17 @@ public async Task BEARERSchemeAuthenticationHeaderValue() var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits().ConfigureAwait(false); //Assert - Assert.IsNotNull(gitHubApiStatusService); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } [Test] @@ -107,14 +110,17 @@ public async Task BEARERSchemeHttpClient() var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits().ConfigureAwait(false); //Assert - Assert.IsNotNull(gitHubApiStatusService); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } [Test] @@ -130,13 +136,19 @@ public async Task ValidProductHeaderValue() var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits().ConfigureAwait(false); //Assert - Assert.IsNotNull(gitHubApiStatusService); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } -} \ No newline at end of file +} + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/HasReachedMaximumApiCallLimitTests.cs b/src/GitHubApiStatus.UnitTests/Tests/HasReachedMaximumApiCallLimitTests.cs index cadb5c5..74cdf90 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/HasReachedMaximumApiCallLimitTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/HasReachedMaximumApiCallLimitTests.cs @@ -22,7 +22,7 @@ public void HasReachedMaximumApiCallLimitTests_ValidHttpResponseHeaders_True() hasReachedMaximumApiCallLimit_Actual = GitHubApiStatusService.HasReachedMaximumApiCallLimit(validHttpResponseHeaders); //Assert - Assert.AreEqual(hasReachedMaximumApiCallLimit_Expected, hasReachedMaximumApiCallLimit_Actual); + Assert.That(hasReachedMaximumApiCallLimit_Actual, Is.EqualTo(hasReachedMaximumApiCallLimit_Expected)); } [Test] @@ -41,7 +41,7 @@ public void HasReachedMaximumApiCallLimitTests_ValidHttpResponseHeaders_False() hasReachedMaximumApiCallLimit_Actual = GitHubApiStatusService.HasReachedMaximumApiCallLimit(validHttpResponseHeaders); //Assert - Assert.AreEqual(hasReachedMaximumApiCallLimit_Expected, hasReachedMaximumApiCallLimit_Actual); + Assert.That(hasReachedMaximumApiCallLimit_Actual, Is.EqualTo(hasReachedMaximumApiCallLimit_Expected)); } [Test] @@ -53,7 +53,7 @@ public void HasReachedMaximumApiCallLimitTests_InvalidHttpResponseHeaders() //Act //Assert - Assert.Throws(() => GitHubApiStatusService.HasReachedMaximumApiCallLimit(invalidHttpResponseMessage.Headers)); + Assert.That(() => GitHubApiStatusService.HasReachedMaximumApiCallLimit(invalidHttpResponseMessage.Headers), Throws.TypeOf()); } [Test] @@ -66,7 +66,10 @@ public void HasReachedMaximumApiCallLimitTests_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.HasReachedMaximumApiCallLimit(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.HasReachedMaximumApiCallLimit(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/HttpResponseHeadersExtensionsTests.cs b/src/GitHubApiStatus.UnitTests/Tests/HttpResponseHeadersExtensionsTests.cs index 25a7b19..21df5cc 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/HttpResponseHeadersExtensionsTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/HttpResponseHeadersExtensionsTests.cs @@ -19,8 +19,11 @@ public void DoesContainGitHubRateLimitHeaderTest() doesContainGitHubRateLimitHeader_false = invalidHttpResponseHeaders.DoesContainGitHubRateLimitHeader(); //Assert - Assert.IsTrue(doesContainGitHubRateLimitHeader_true); - Assert.IsFalse(doesContainGitHubRateLimitHeader_false); + Assert.Multiple(() => + { + Assert.That(doesContainGitHubRateLimitHeader_true, Is.True); + Assert.That(doesContainGitHubRateLimitHeader_false, Is.False); + }); } [Test] @@ -37,8 +40,11 @@ public void DoesContainGitHubRateLimitResetHeaderTest() doesContainGitHubRateLimitResetHeader_false = invalidHttpResponseHeaders.DoesContainGitHubRateLimitResetHeader(); //Assert - Assert.IsTrue(doesContainGitHubRateLimitResetHeader_true); - Assert.IsFalse(doesContainGitHubRateLimitResetHeader_false); + Assert.Multiple(() => + { + Assert.That(doesContainGitHubRateLimitResetHeader_true, Is.True); + Assert.That(doesContainGitHubRateLimitResetHeader_false, Is.False); + }); } [Test] @@ -55,7 +61,13 @@ public void DoesContainGitHubRateLimitRemainingHeaderTest() doesContainGitHubRateLimitRemainingHeader_false = invalidHttpResponseHeaders.DoesContainGitHubRateLimitRemainingHeader(); //Assert - Assert.IsTrue(doesContainGitHubRateLimitRemainingHeader_true); - Assert.IsFalse(doesContainGitHubRateLimitRemainingHeader_false); + Assert.Multiple(() => + { + Assert.That(doesContainGitHubRateLimitRemainingHeader_true, Is.True); + Assert.That(doesContainGitHubRateLimitRemainingHeader_false, Is.False); + }); } -} \ No newline at end of file +} + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/IsAbuseRateLimitTest.cs b/src/GitHubApiStatus.UnitTests/Tests/IsAbuseRateLimitTest.cs index d04b275..3049dae 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/IsAbuseRateLimitTest.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/IsAbuseRateLimitTest.cs @@ -1,47 +1,57 @@ using NUnit.Framework; - + namespace GitHubApiStatus.UnitTests; + +class IsAbuseRateLimitTest : BaseTest +{ + [Test] + public void IsAbuseRateLimit() + { + //Arrange + var httpResponseHeaders = CreateHttpResponseHeaders(500, DateTimeOffset.UtcNow, 0, isAbuseRateLimit: true); -class IsAbuseRateLimitTest : BaseTest -{ - [Test] - public void IsAbuseRateLimit() - { - //Arrange - var httpResponseHeaders = CreateHttpResponseHeaders(500, DateTimeOffset.UtcNow, 0, isAbuseRateLimit: true); - - //Act - var isAbuseRateLimit = GitHubApiStatusService.IsAbuseRateLimit(httpResponseHeaders, out var delta); - - //Assert - Assert.IsTrue(isAbuseRateLimit); - Assert.IsNotNull(delta); - } - - [Test] - public void IsNotAbuseRateLimit() - { - //Arrange - var httpResponseHeaders = CreateHttpResponseHeaders(500, DateTimeOffset.UtcNow, 0); - - //Act - var isAbuseRateLimit = GitHubApiStatusService.IsAbuseRateLimit(httpResponseHeaders, out TimeSpan? delta); - - //Assert - Assert.IsFalse(isAbuseRateLimit); - Assert.IsNull(delta); - } + //Act + var isAbuseRateLimit = GitHubApiStatusService.IsAbuseRateLimit(httpResponseHeaders, out var delta); - [Test] - public void NullHttpResponseHeaders() - { - //Arrange + //Assert + Assert.Multiple(() => + { + Assert.That(isAbuseRateLimit, Is.True); + Assert.That(delta, Is.Not.Null); + }); + } - //Act + [Test] + public void IsNotAbuseRateLimit() + { + //Arrange + var httpResponseHeaders = CreateHttpResponseHeaders(500, DateTimeOffset.UtcNow, 0); + + //Act + var isAbuseRateLimit = GitHubApiStatusService.IsAbuseRateLimit(httpResponseHeaders, out TimeSpan? delta); + + //Assert + Assert.Multiple(() => + { + Assert.That(isAbuseRateLimit, Is.False); + Assert.That(delta, Is.Null); + }); + } - //Assert + [Test] + public void NullHttpResponseHeaders() + { + //Arrange + + //Act + + //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => GitHubApiStatusService.IsAbuseRateLimit(null, out _)); + Assert.That(() => GitHubApiStatusService.IsAbuseRateLimit(null, out _), Throws.TypeOf()); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. - } -} \ No newline at end of file + } +} + + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/IsResponseFromAuthenticatedRequestTests.cs b/src/GitHubApiStatus.UnitTests/Tests/IsResponseFromAuthenticatedRequestTests.cs index d356653..c94cc70 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/IsResponseFromAuthenticatedRequestTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/IsResponseFromAuthenticatedRequestTests.cs @@ -16,14 +16,13 @@ public void IsResponseFromAuthenticatedRequest_ValidHttpResponseHeaders_True() const int rateLimitRemaining = 0; const bool isUserAuthenticated_Expected = true; - var validHttpResponseHeaders = CreateHttpResponseHeaders(rateLimit, DateTimeOffset.UtcNow, rateLimitRemaining, isAuthenticated: isUserAuthenticated_Expected); //Act isUserAuthenticated_Actual = GitHubApiStatusService.IsResponseFromAuthenticatedRequest(validHttpResponseHeaders); //Assert - Assert.AreEqual(isUserAuthenticated_Expected, isUserAuthenticated_Actual); + Assert.That(isUserAuthenticated_Actual, Is.EqualTo(isUserAuthenticated_Expected)); } [Test] @@ -36,14 +35,13 @@ public void IsResponseFromAuthenticatedRequest_ValidHttpResponseHeaders_False() const int rateLimitRemaining = 10; const bool isUserAuthenticated_Expected = false; - var validHttpResponseHeaders = CreateHttpResponseHeaders(rateLimit, DateTimeOffset.UtcNow, rateLimitRemaining, isAuthenticated: isUserAuthenticated_Expected); //Act isUserAuthenticated_Actual = GitHubApiStatusService.IsResponseFromAuthenticatedRequest(validHttpResponseHeaders); //Assert - Assert.AreEqual(isUserAuthenticated_Expected, isUserAuthenticated_Actual); + Assert.That(isUserAuthenticated_Actual, Is.EqualTo(isUserAuthenticated_Expected)); } [Test] @@ -56,7 +54,7 @@ public void IsResponseFromAuthenticatedRequest_InvalidHttpResponseHeaders() var isUserAuthenticated = GitHubApiStatusService.IsResponseFromAuthenticatedRequest(invalidHttpResponseMessage.Headers); //Assert - Assert.IsFalse(isUserAuthenticated); + Assert.That(isUserAuthenticated, Is.False); } [Test] @@ -69,7 +67,11 @@ public void IsResponseFromAuthenticatedRequest_NullHttpResponseHeaders() //Assert #pragma warning disable CS8604 // Possible null reference argument. - Assert.Throws(() => GitHubApiStatusService.IsResponseFromAuthenticatedRequest(nullHttpResponseHeaders)); + Assert.That(() => GitHubApiStatusService.IsResponseFromAuthenticatedRequest(nullHttpResponseHeaders), Throws.TypeOf()); #pragma warning restore CS8604 // Possible null reference argument. } -} \ No newline at end of file +} + + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/ProductHeaderValueTests.cs b/src/GitHubApiStatus.UnitTests/Tests/ProductHeaderValueTests.cs index fefcac1..d606b6b 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/ProductHeaderValueTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/ProductHeaderValueTests.cs @@ -1,5 +1,5 @@ using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using NUnit.Framework; namespace GitHubApiStatus.UnitTests; @@ -16,9 +16,12 @@ public void NullProductHeaderValueTest() //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => gitHubApiStatusService.AddProductHeaderValue(null)); + Assert.Multiple(() => + { + Assert.That(() => gitHubApiStatusService.AddProductHeaderValue(null), Throws.TypeOf()); + Assert.That(gitHubApiStatusService.IsProductHeaderValueValid, Is.False); + }); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.IsFalse(gitHubApiStatusService.IsProductHeaderValueValid); } [Test] @@ -32,12 +35,19 @@ public void NullNameTest() //Assert #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. #if NET8_0_OR_GREATER - Assert.Throws(() => gitHubApiStatusService.AddProductHeaderValue(new ProductHeaderValue(null))); + Assert.Multiple(() => + { + Assert.That(() => gitHubApiStatusService.AddProductHeaderValue(new ProductHeaderValue(null)), Throws.TypeOf()); + Assert.That(gitHubApiStatusService.IsProductHeaderValueValid, Is.False); + }); #else - Assert.Throws(() => gitHubApiStatusService.AddProductHeaderValue(new ProductHeaderValue(null))); + Assert.Multiple(() => + { + Assert.That(() => gitHubApiStatusService.AddProductHeaderValue(new ProductHeaderValue(null)), Throws.TypeOf()); + Assert.That(gitHubApiStatusService.IsProductHeaderValueValid, Is.False); + }); #endif #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.IsFalse(gitHubApiStatusService.IsProductHeaderValueValid); } [Test] @@ -52,15 +62,23 @@ public async Task ValidProductHeaderValueTest() var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits().ConfigureAwait(false); //Assert - Assert.IsNotNull(gitHubApiStatusService); - Assert.IsTrue(gitHubApiStatusService.IsProductHeaderValueValid); - - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(gitHubApiStatusService.IsProductHeaderValueValid, Is.True); + + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } -} \ No newline at end of file +} + + + + + diff --git a/src/GitHubApiStatus.UnitTests/Tests/SetAuthenticationHeaderValueTests.cs b/src/GitHubApiStatus.UnitTests/Tests/SetAuthenticationHeaderValueTests.cs index 9c673fe..b16f6f2 100644 --- a/src/GitHubApiStatus.UnitTests/Tests/SetAuthenticationHeaderValueTests.cs +++ b/src/GitHubApiStatus.UnitTests/Tests/SetAuthenticationHeaderValueTests.cs @@ -1,5 +1,5 @@ using System.Net.Http.Headers; -using GitStatus.Shared; +using GitStatus.Common; using NUnit.Framework; namespace GitHubApiStatus.UnitTests; @@ -15,10 +15,13 @@ public void NullAuthenticationHeaderValue() //Act //Assert + Assert.Multiple(() => + { #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.Throws(() => gitHubApiStatusService.SetAuthenticationHeaderValue(null)); + Assert.That(() => gitHubApiStatusService.SetAuthenticationHeaderValue(null), Throws.TypeOf()); #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. - Assert.IsFalse(gitHubApiStatusService.IsAuthenticationHeaderValueSet); + Assert.That(gitHubApiStatusService.IsAuthenticationHeaderValueSet, Is.False); + }); } [TestCase("Basic")] @@ -33,13 +36,13 @@ public void InvalidSchemeAuthenticationHeaderValue(string scheme) //Act //Assert - Assert.Throws(() => gitHubApiStatusService.SetAuthenticationHeaderValue(authenticationHeaderValue)); + Assert.That(() => gitHubApiStatusService.SetAuthenticationHeaderValue(authenticationHeaderValue), Throws.TypeOf()); } [TestCase(null)] [TestCase("")] [TestCase(" ")] - public void InvalidParameterAuthenticationHeaderValue(string parameter) + public void InvalidParameterAuthenticationHeaderValue(string? parameter) { //Arrange var gitHubApiStatusService = new GitHubApiStatusService(); @@ -48,7 +51,7 @@ public void InvalidParameterAuthenticationHeaderValue(string parameter) //Act //Assert - Assert.Throws(() => gitHubApiStatusService.SetAuthenticationHeaderValue(authenticationHeaderValue)); + Assert.That(() => gitHubApiStatusService.SetAuthenticationHeaderValue(authenticationHeaderValue), Throws.TypeOf()); } [Test] @@ -66,13 +69,21 @@ public async Task BEARERSchemeAuthenticationHeaderValue() var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits().ConfigureAwait(false); //Assert - Assert.IsNotNull(gitHubApiStatusService); - Assert.IsNotNull(apiRateLimits); - Assert.IsNotNull(apiRateLimits.AppManifestConfiguration); - Assert.IsNotNull(apiRateLimits.CodeScanningUpload); - Assert.IsNotNull(apiRateLimits.GraphQLApi); - Assert.IsNotNull(apiRateLimits.RestApi); - Assert.IsNotNull(apiRateLimits.SearchApi); - Assert.IsNotNull(apiRateLimits.SourceImport); + Assert.Multiple(() => + { + Assert.That(gitHubApiStatusService, Is.Not.Null); + Assert.That(apiRateLimits, Is.Not.Null); + Assert.That(apiRateLimits.AppManifestConfiguration, Is.Not.Null); + Assert.That(apiRateLimits.CodeScanningUpload, Is.Not.Null); + Assert.That(apiRateLimits.GraphQLApi, Is.Not.Null); + Assert.That(apiRateLimits.RestApi, Is.Not.Null); + Assert.That(apiRateLimits.SearchApi, Is.Not.Null); + Assert.That(apiRateLimits.SourceImport, Is.Not.Null); + }); } -} \ No newline at end of file +} + + + + + diff --git a/src/GitHubApiStatus/GitHubApiStatus.csproj b/src/GitHubApiStatus/GitHubApiStatus.csproj index fc6f414..92a0fbd 100644 --- a/src/GitHubApiStatus/GitHubApiStatus.csproj +++ b/src/GitHubApiStatus/GitHubApiStatus.csproj @@ -1,98 +1,91 @@ - - - netstandard1.3;netstandard2.0;netstandard2.1;net6.0;net8.0 - true - GitHubApiStatus.snk - GitHubApiStatus - GitHubApiStatus - GitHubApiStatus - true - true - true - snupkg - -GitHub API Rate Limit Status + + netstandard1.3;netstandard2.0;netstandard2.1;net8.0;net9.0 + true + GitHubApiStatus.snk + GitHubApiStatus + GitHubApiStatus + GitHubApiStatus + true + true + true + snupkg + + GitHub API Rate Limit Status -Calculate the GitHub API Rate Limits for the following GitHub APIs -- REST API -- Seach API -- GraphQL API -- Source Import API -- Code Scanning Upload API -- App Manifest Configuration API - - github, git, api, rate, rate limit - GitHub API Rate Limit Status - -GitHub API Rate Limit Status + Calculate the GitHub API Rate Limits for the following GitHub APIs + - REST API + - Seach API + - GraphQL API + - Source Import API + - Code Scanning Upload API + - App Manifest Configuration API + + github, git, api, rate, rate limit + GitHub API Rate Limit Status + + GitHub API Rate Limit Status -Calculate the GitHub API Rate Limits for the following GitHub APIs -- REST API -- Seach API -- GraphQL API -- Source Import API -- Code Scanning Upload API -- App Manifest Configuration API - - -New In This Release: -- Add .NET 8.0 -- (Breaking) Add System.Diagnostics.CodeAnalysis to IGitHubApiStatusService - - 3.0.0 - https://github.com/brminnick/GitHubApiStatus - $(AssemblyName) ($(TargetFramework)) - 1.0.0.0 - 1.0.0.0 - $(Version)$(VersionSuffix) - Brandon Minnick - Brandon Minnick - en - ©Copyright 2020 Brandon Minnick. All rights reserved. - false - $(DefineConstants); - false - false - MIT - https://github.com/brminnick/GitHubApiStatus - portable - Release;Debug - false - - - true - portable - bin\Release\netstandard1.0\GitHubApiStatus.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Calculate the GitHub API Rate Limits for the following GitHub APIs + - REST API + - Seach API + - GraphQL API + - Source Import API + - Code Scanning Upload API + - App Manifest Configuration API + + + New In This Release: + - Add .NET 9.0 + + $(NuGetVersion) + https://github.com/brminnick/GitHubApiStatus + $(AssemblyName) ($(TargetFramework)) + 1.0.0.0 + 1.0.0.0 + $(Version)$(VersionSuffix) + Brandon Minnick + Brandon Minnick + en + ©Copyright 2020 Brandon Minnick. All rights reserved. + false + $(DefineConstants); + false + false + MIT + https://github.com/brminnick/GitHubApiStatus + portable + Release;Debug + false + + + true + portable + bin\Release\netstandard1.0\GitHubApiStatus.xml + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimitResponse.cs b/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimitResponse.cs index e21b926..c9741a6 100644 --- a/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimitResponse.cs +++ b/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimitResponse.cs @@ -2,5 +2,5 @@ interface IGitHubApiRateLimitResponse { - public IGitHubApiRateLimits Results { get; } + IGitHubApiRateLimits Results { get; } } \ No newline at end of file diff --git a/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimits.cs b/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimits.cs index 987fe1a..f7046cd 100644 --- a/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimits.cs +++ b/src/GitHubApiStatus/Interfaces/IGitHubApiRateLimits.cs @@ -8,30 +8,30 @@ public interface IGitHubApiRateLimits /// /// REST API Rate Limit Status /// - public IRateLimitStatus RestApi { get; } + IRateLimitStatus RestApi { get; } /// /// Search API Rate Limit Status /// - public IRateLimitStatus SearchApi { get; } + IRateLimitStatus SearchApi { get; } /// /// GraphQL API Rate Limit Status /// - public IRateLimitStatus GraphQLApi { get; } + IRateLimitStatus GraphQLApi { get; } /// /// Source Import API Rate Limit Status /// - public IRateLimitStatus SourceImport { get; } + IRateLimitStatus SourceImport { get; } /// /// Code Scanning API Rate Limit Status /// - public IRateLimitStatus CodeScanningUpload { get; } + IRateLimitStatus CodeScanningUpload { get; } /// /// App Manifest Configuration API Rate Limit Status /// - public IRateLimitStatus AppManifestConfiguration { get; } + IRateLimitStatus AppManifestConfiguration { get; } } \ No newline at end of file diff --git a/src/GitHubApiStatus/Interfaces/IGitHubApiStatusService.cs b/src/GitHubApiStatus/Interfaces/IGitHubApiStatusService.cs index bafee4e..9ab8c7e 100644 --- a/src/GitHubApiStatus/Interfaces/IGitHubApiStatusService.cs +++ b/src/GitHubApiStatus/Interfaces/IGitHubApiStatusService.cs @@ -6,7 +6,7 @@ namespace GitHubApiStatus; /// /// Interface for GitHubApiStatusService /// -public interface IGitHubApiStatusService +public interface IGitHubApiStatusService : IDisposable { /// /// Determines if GitHubApiClient.DefaultRequestHeaders.UserAgent is Valid diff --git a/src/GitHubApiStatus/Interfaces/IRateLimitStatus.cs b/src/GitHubApiStatus/Interfaces/IRateLimitStatus.cs index 2c83a0f..536409a 100644 --- a/src/GitHubApiStatus/Interfaces/IRateLimitStatus.cs +++ b/src/GitHubApiStatus/Interfaces/IRateLimitStatus.cs @@ -8,25 +8,25 @@ public interface IRateLimitStatus /// /// Time Remaining until Rate Limit Reset /// - public TimeSpan RateLimitReset_TimeRemaining { get; } + TimeSpan RateLimitReset_TimeRemaining { get; } /// /// GitHub API Rate Limit /// - public int RateLimit { get; } + int RateLimit { get; } /// /// Remaining Request Count to GitHub API /// - public int RemainingRequestCount { get; } + int RemainingRequestCount { get; } /// /// Rate Limit Reset Time Stamp in Unix Epoch Seconds /// - public long RateLimitReset_UnixEpochSeconds { get; } + long RateLimitReset_UnixEpochSeconds { get; } /// /// Rate Limit Reset Time Stamp /// - public DateTimeOffset RateLimitReset_DateTime { get; } + DateTimeOffset RateLimitReset_DateTime { get; } } \ No newline at end of file diff --git a/src/GitHubApiStatus/Services/GitHubApiStatusService.cs b/src/GitHubApiStatus/Services/GitHubApiStatusService.cs index 9936749..ef4fc73 100644 --- a/src/GitHubApiStatus/Services/GitHubApiStatusService.cs +++ b/src/GitHubApiStatus/Services/GitHubApiStatusService.cs @@ -16,7 +16,7 @@ namespace GitHubApiStatus; /// /// GitHub API Status Service /// -public class GitHubApiStatusService : IGitHubApiStatusService, IDisposable +public class GitHubApiStatusService : IGitHubApiStatusService { /// /// GitHub Http Response Rate Limit Header Key