Skip to content

Merge pull request #225 from AdrianJSClark/224-season-driver-standing… #108

Merge pull request #225 from AdrianJSClark/224-season-driver-standing…

Merge pull request #225 from AdrianJSClark/224-season-driver-standing… #108

GitHub Actions / .NET Tests succeeded Sep 29, 2024 in 0s

486 passed, 0 failed and 0 skipped

Tests passed successfully

Report Passed Failed Skipped Time
src/TestResults/Aydsko.iRacingData.IntegrationTests.trx 42s
src/TestResults/net48/Aydsko.iRacingData.UnitTests.trx 162✅ 56s
src/TestResults/net6.0/Aydsko.iRacingData.UnitTests.trx 162✅ 47s
src/TestResults/net8.0/Aydsko.iRacingData.UnitTests.trx 162✅ 39s

✅ src/TestResults/Aydsko.iRacingData.IntegrationTests.trx

No tests found

✅ src/TestResults/net48/Aydsko.iRacingData.UnitTests.trx

162 tests were completed in 56s with 162 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests 76✅ 6s
Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests 2✅ 13ms
Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests 4✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests 8✅ 9ms
Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests 10✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests 8✅ 7ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.CookiePersistenceTests 4✅ 46ms
Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests 4✅ 161ms
Aydsko.iRacingData.UnitTests.DictionaryExtensionTests 6✅ 10ms
Aydsko.iRacingData.UnitTests.PasswordEncodingTests 14✅ 50ms
Aydsko.iRacingData.UnitTests.ServicesTests 2✅ 630ms
Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests 2✅ 84ms
Aydsko.iRacingData.UnitTests.UrlExtensionsTests 6✅ 4ms

✅ Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests

✅ GetBestLapStatisticsSuccessfulAsync
✅ GetCarAssetDetailsSuccessfulAsync
✅ GetCarClassesSuccessfulAsync
✅ GetCarsSuccessfulAsync
✅ GetCategoriesSuccessfulAsync
✅ GetClubHistoryLookupsSuccessfulAsync
✅ GetCountriesSuccessfulAsync
✅ GetCustomerLeagueSessionsAsync
✅ GetDivisionsSuccessfulAsync
✅ GetDriverAwardsSuccessfulAsync
✅ GetDriverInfoWithLicensesSuccessfulAsync
✅ GetDriverInfoWithoutLicensesSuccessfulAsync
✅ GetEventTypesSuccessfulAsync
✅ GetHostedSessionsCombinedSuccessfulAsync
✅ GetHostedSessionsSuccessfulAsync
✅ GetLeaguePointsSystemsSuccessfulAsync
✅ GetLeagueWithLicensesSucceedsAsync
✅ GetLeagueWithoutLicensesSucceedsAsync
✅ GetLicenseLookupsSuccessfulAsync
✅ GetLookupsSuccessfulAsync
✅ GetLookupWithExpiredAuthWorksAsync
✅ GetMemberChartDataSuccessfulAsync
✅ GetMemberDivisionSuccessfulAsync
✅ GetMemberInfoDuringMaintenanceThrowsAsync
✅ GetMemberInfoSucceedsAsync
✅ GetMemberParticipationCreditsSucceedsAsync
✅ GetMemberProfileFailsOnLoginWithGatewayTimeoutAsync
✅ GetMemberProfileFailsWithGatewayTimeoutAsync
✅ GetMemberProfileSuccessfulAsync
✅ GetMemberRecapSuccessfulAsync
✅ GetMemberRecentRacesSucceedsAsync
✅ GetMemberSummarySuccessfulAsync
✅ GetMemberYearlyStatisticsSuccessfulAsync
✅ GetPastSeasonsForSeriesSuccessfulAsync
✅ GetRaceGuideSuccessfulAsync
✅ GetSeasonDriverStandingsSuccessfulAsync
✅ GetSeasonQualifyResultsSuccessfulAsync
✅ GetSeasonResultsHandlesBadRequestAsync
✅ GetSeasonsWithoutSeriesSuccessfulAsync
✅ GetSeasonsWithSeriesSuccessfulAsync
✅ GetSeasonTeamStandingsSuccessfulAsync
✅ GetSeasonTimeTrialResultsSuccessfulAsync
✅ GetSeasonTimeTrialStandingsSuccessfulAsync
✅ GetSeriesAssetsSuccessfulAsync
✅ GetSeriesSuccessfulAsync
✅ GetServiceStatusSuccessfulAsync
✅ GetSingleDriverSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetSingleDriverSubsessionLapsSuccessfulAsync
✅ GetSpectatorSubsessionDetailsSuccessfulAsync
✅ GetSpectatorSubsessionIdentifiersAsync
✅ GetStatisticsSeriesSuccessfulAsync
✅ GetSubsessionEventLogForbiddenThrowsErrorsAsync
✅ GetSubsessionEventLogSuccessfulAsync
✅ GetSubSessionLapChartSuccessfulAsync
✅ GetSubSessionResultForbiddenThrowsErrorsAsync
✅ GetSubSessionResultForLeagueSuccessfulAsync
✅ GetSubSessionResultForTeamSuccessfulAsync
✅ GetSubSessionResultSuccessfulAsync
✅ GetSubSessionResultUnauthorizedThrowsErrorsAsync
✅ GetSubSessionResultWithWeatherSuccessfulAsync
✅ GetTeamSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetTeamSubsessionLapsSuccessfulAsync
✅ GetTeamSuccessfulAsync
✅ GetTimeAttackMemberSeasonResultsSuccessfulAsync
✅ GetTimeAttackSeriesSuccessfulAsync
✅ GetTrackAssetsSuccessfulAsync
✅ GetTracksSuccessfulAsync
✅ GetWeatherForecastAsync
✅ GetWorldRecordStatisticsSuccessfulAsync
✅ ListHostedSessionsCombinedSuccessfulAsync
✅ ListHostedSessionsSuccessfulAsync
✅ ListSeasonsSuccessfulAsync
✅ SearchDriversSuccessfulAsync
✅ SearchHostedResultsSuccessfulAsync
✅ SearchLeagueDirectorySuccessfulAsync
✅ SearchOfficialResultsSuccessfulAsync

✅ Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests

✅ Read Value: 11:29:57 to 11:30:57 27 Jan 2023
✅ Write Value: 11:29:57 to 11:30:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests

✅ Read Value: 11:19:12 27-Jan-2023
✅ Read Value: 22:29:57 27 Jan 2023
✅ Write Value: 11:19:12 27-Jan-2023
✅ Write Value: 22:29:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests

✅ Read Value: JSON Null value
✅ Read Value: JSON Number value of 1
✅ Read Value: JSON Number value of zero
✅ Read Value: JSON String value of 'ABC123'
✅ Write Value: JSON Null value
✅ Write Value: JSON Number value of 1
✅ Write Value: JSON Number value of zero
✅ Write Value: JSON String value of 'ABC123'

✅ Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests

✅ Read Value: 0 / 0:00.000
✅ Read Value: 600000 / 1:00.000
✅ Read Value: 834560 / 1:23.456
✅ Read Value: null / null
✅ Write Value: 0 / 0:00.000
✅ Write Value: 600000 / 1:00.000
✅ Write Value: 834560 / 1:23.456
✅ Write Value: null / null

✅ Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests

✅ Read Value: Value "" returns null
✅ Read Value: Value "Grand Prix" returns that
✅ Read Value: Value "International" returns that
✅ Read Value: Value "n/a" returns null
✅ Read Value: Value "n/A" returns null
✅ Read Value: Value "N/a" returns null
✅ Read Value: Value "N/A" returns null
✅ Write Value: Value "Grand Prix" returns that
✅ Write Value: Value "International" returns that
✅ Write Value: Value "N/A" returns null

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests

✅ Read Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Read Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Read Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Read Value: Value [630] returns [TimeSpan.FromHours(10.5)]
✅ Write Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Write Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Write Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Write Value: Value [630] returns [TimeSpan.FromHours(10.5)]

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests

✅ Read Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Read Value: Value 0 returns TimeSpan.Zero
✅ Read Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Read Value: Value 14400 returns TimeSpan.FromHours(4)
✅ Write Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Write Value: Value 0 returns TimeSpan.Zero
✅ Write Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Write Value: Value 14400 returns TimeSpan.FromHours(4)

✅ Aydsko.iRacingData.UnitTests.CookiePersistenceTests

✅ GivenACookieContainerWithCookiesAndNoRestoreOrSaveFunctionsThenTheCookiesAreUsedAsync
✅ GivenOptionsWithARestoreFuncTheFuncIsCalledToGetTheCookiesAsync
✅ GivenOptionsWithASaveActionTheSaveActionIsCalledWithTheCookiesAsync
✅ GivenOptionsWithNullDelegateValuesWhenAMethodIsCalledThenItWillSucceedAsync

✅ Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests

✅ GivenHungaroringTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenHungaroringTrackId_ThenGetTrackAssetScreenshotUrisAsyncReturnsCorrectResultsAsync
✅ GivenSuzukaTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.DictionaryExtensionTests

✅ CheckAddParameterIfNotNull<Boolean>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Boolean])
✅ CheckAddParameterIfNotNull<DateTime>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.DateTime])
✅ CheckAddParameterIfNotNull<EventType>(Aydsko.iRacingData.UnitTests.ExampleData`1[Aydsko.iRacingData.Common.EventType])
✅ CheckAddParameterIfNotNull<IEnumerable`1>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Collections.Generic.IEnumerable`1[System.String]])
✅ CheckAddParameterIfNotNull<Int32[]>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Int32[]])
✅ CheckAddParameterIfNotNull<String>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.String])

✅ Aydsko.iRacingData.UnitTests.PasswordEncodingTests

✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")

✅ Aydsko.iRacingData.UnitTests.ServicesTests

✅ LoginAndUserAgentDefaultWorksWhenResolvedFromServicesAsync
✅ LoginAndUserAgentWorksWhenResolvedFromServicesAsync

✅ Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests

✅ GivenHungaroringTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.UrlExtensionsTests

✅ ValidateToUrlWithQueryMethod("https://example.com?a=b",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[=&?, =?&=?&]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, System.String[]]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[])

✅ src/TestResults/net6.0/Aydsko.iRacingData.UnitTests.trx

162 tests were completed in 47s with 162 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests 76✅ 4s
Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests 2✅ 3ms
Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests 4✅ 0ms
Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests 8✅ 0ms
Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests 10✅ 0ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests 8✅ 3ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.CookiePersistenceTests 4✅ 7ms
Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests 4✅ 122ms
Aydsko.iRacingData.UnitTests.DictionaryExtensionTests 6✅ 44ms
Aydsko.iRacingData.UnitTests.PasswordEncodingTests 14✅ 34ms
Aydsko.iRacingData.UnitTests.ServicesTests 2✅ 615ms
Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests 2✅ 64ms
Aydsko.iRacingData.UnitTests.UrlExtensionsTests 6✅ 0ms

✅ Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests

✅ GetBestLapStatisticsSuccessfulAsync
✅ GetCarAssetDetailsSuccessfulAsync
✅ GetCarClassesSuccessfulAsync
✅ GetCarsSuccessfulAsync
✅ GetCategoriesSuccessfulAsync
✅ GetClubHistoryLookupsSuccessfulAsync
✅ GetCountriesSuccessfulAsync
✅ GetCustomerLeagueSessionsAsync
✅ GetDivisionsSuccessfulAsync
✅ GetDriverAwardsSuccessfulAsync
✅ GetDriverInfoWithLicensesSuccessfulAsync
✅ GetDriverInfoWithoutLicensesSuccessfulAsync
✅ GetEventTypesSuccessfulAsync
✅ GetHostedSessionsCombinedSuccessfulAsync
✅ GetHostedSessionsSuccessfulAsync
✅ GetLeaguePointsSystemsSuccessfulAsync
✅ GetLeagueWithLicensesSucceedsAsync
✅ GetLeagueWithoutLicensesSucceedsAsync
✅ GetLicenseLookupsSuccessfulAsync
✅ GetLookupsSuccessfulAsync
✅ GetLookupWithExpiredAuthWorksAsync
✅ GetMemberChartDataSuccessfulAsync
✅ GetMemberDivisionSuccessfulAsync
✅ GetMemberInfoDuringMaintenanceThrowsAsync
✅ GetMemberInfoSucceedsAsync
✅ GetMemberParticipationCreditsSucceedsAsync
✅ GetMemberProfileFailsOnLoginWithGatewayTimeoutAsync
✅ GetMemberProfileFailsWithGatewayTimeoutAsync
✅ GetMemberProfileSuccessfulAsync
✅ GetMemberRecapSuccessfulAsync
✅ GetMemberRecentRacesSucceedsAsync
✅ GetMemberSummarySuccessfulAsync
✅ GetMemberYearlyStatisticsSuccessfulAsync
✅ GetPastSeasonsForSeriesSuccessfulAsync
✅ GetRaceGuideSuccessfulAsync
✅ GetSeasonDriverStandingsSuccessfulAsync
✅ GetSeasonQualifyResultsSuccessfulAsync
✅ GetSeasonResultsHandlesBadRequestAsync
✅ GetSeasonsWithoutSeriesSuccessfulAsync
✅ GetSeasonsWithSeriesSuccessfulAsync
✅ GetSeasonTeamStandingsSuccessfulAsync
✅ GetSeasonTimeTrialResultsSuccessfulAsync
✅ GetSeasonTimeTrialStandingsSuccessfulAsync
✅ GetSeriesAssetsSuccessfulAsync
✅ GetSeriesSuccessfulAsync
✅ GetServiceStatusSuccessfulAsync
✅ GetSingleDriverSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetSingleDriverSubsessionLapsSuccessfulAsync
✅ GetSpectatorSubsessionDetailsSuccessfulAsync
✅ GetSpectatorSubsessionIdentifiersAsync
✅ GetStatisticsSeriesSuccessfulAsync
✅ GetSubsessionEventLogForbiddenThrowsErrorsAsync
✅ GetSubsessionEventLogSuccessfulAsync
✅ GetSubSessionLapChartSuccessfulAsync
✅ GetSubSessionResultForbiddenThrowsErrorsAsync
✅ GetSubSessionResultForLeagueSuccessfulAsync
✅ GetSubSessionResultForTeamSuccessfulAsync
✅ GetSubSessionResultSuccessfulAsync
✅ GetSubSessionResultUnauthorizedThrowsErrorsAsync
✅ GetSubSessionResultWithWeatherSuccessfulAsync
✅ GetTeamSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetTeamSubsessionLapsSuccessfulAsync
✅ GetTeamSuccessfulAsync
✅ GetTimeAttackMemberSeasonResultsSuccessfulAsync
✅ GetTimeAttackSeriesSuccessfulAsync
✅ GetTrackAssetsSuccessfulAsync
✅ GetTracksSuccessfulAsync
✅ GetWeatherForecastAsync
✅ GetWorldRecordStatisticsSuccessfulAsync
✅ ListHostedSessionsCombinedSuccessfulAsync
✅ ListHostedSessionsSuccessfulAsync
✅ ListSeasonsSuccessfulAsync
✅ SearchDriversSuccessfulAsync
✅ SearchHostedResultsSuccessfulAsync
✅ SearchLeagueDirectorySuccessfulAsync
✅ SearchOfficialResultsSuccessfulAsync

✅ Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests

✅ Read Value: 11:29:57 to 11:30:57 27 Jan 2023
✅ Write Value: 11:29:57 to 11:30:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests

✅ Read Value: 11:19:12 27-Jan-2023
✅ Read Value: 22:29:57 27 Jan 2023
✅ Write Value: 11:19:12 27-Jan-2023
✅ Write Value: 22:29:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests

✅ Read Value: JSON Null value
✅ Read Value: JSON Number value of 1
✅ Read Value: JSON Number value of zero
✅ Read Value: JSON String value of 'ABC123'
✅ Write Value: JSON Null value
✅ Write Value: JSON Number value of 1
✅ Write Value: JSON Number value of zero
✅ Write Value: JSON String value of 'ABC123'

✅ Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests

✅ Read Value: 0 / 0:00.000
✅ Read Value: 600000 / 1:00.000
✅ Read Value: 834560 / 1:23.456
✅ Read Value: null / null
✅ Write Value: 0 / 0:00.000
✅ Write Value: 600000 / 1:00.000
✅ Write Value: 834560 / 1:23.456
✅ Write Value: null / null

✅ Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests

✅ Read Value: Value "" returns null
✅ Read Value: Value "Grand Prix" returns that
✅ Read Value: Value "International" returns that
✅ Read Value: Value "n/a" returns null
✅ Read Value: Value "n/A" returns null
✅ Read Value: Value "N/a" returns null
✅ Read Value: Value "N/A" returns null
✅ Write Value: Value "Grand Prix" returns that
✅ Write Value: Value "International" returns that
✅ Write Value: Value "N/A" returns null

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests

✅ Read Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Read Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Read Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Read Value: Value [630] returns [TimeSpan.FromHours(10.5)]
✅ Write Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Write Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Write Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Write Value: Value [630] returns [TimeSpan.FromHours(10.5)]

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests

✅ Read Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Read Value: Value 0 returns TimeSpan.Zero
✅ Read Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Read Value: Value 14400 returns TimeSpan.FromHours(4)
✅ Write Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Write Value: Value 0 returns TimeSpan.Zero
✅ Write Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Write Value: Value 14400 returns TimeSpan.FromHours(4)

✅ Aydsko.iRacingData.UnitTests.CookiePersistenceTests

✅ GivenACookieContainerWithCookiesAndNoRestoreOrSaveFunctionsThenTheCookiesAreUsedAsync
✅ GivenOptionsWithARestoreFuncTheFuncIsCalledToGetTheCookiesAsync
✅ GivenOptionsWithASaveActionTheSaveActionIsCalledWithTheCookiesAsync
✅ GivenOptionsWithNullDelegateValuesWhenAMethodIsCalledThenItWillSucceedAsync

✅ Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests

✅ GivenHungaroringTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenHungaroringTrackId_ThenGetTrackAssetScreenshotUrisAsyncReturnsCorrectResultsAsync
✅ GivenSuzukaTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.DictionaryExtensionTests

✅ CheckAddParameterIfNotNull<Boolean>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Boolean])
✅ CheckAddParameterIfNotNull<DateTime>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.DateTime])
✅ CheckAddParameterIfNotNull<EventType>(Aydsko.iRacingData.UnitTests.ExampleData`1[Aydsko.iRacingData.Common.EventType])
✅ CheckAddParameterIfNotNull<IEnumerable`1>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Collections.Generic.IEnumerable`1[System.String]])
✅ CheckAddParameterIfNotNull<Int32[]>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Int32[]])
✅ CheckAddParameterIfNotNull<String>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.String])

✅ Aydsko.iRacingData.UnitTests.PasswordEncodingTests

✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")

✅ Aydsko.iRacingData.UnitTests.ServicesTests

✅ LoginAndUserAgentDefaultWorksWhenResolvedFromServicesAsync
✅ LoginAndUserAgentWorksWhenResolvedFromServicesAsync

✅ Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests

✅ GivenHungaroringTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.UrlExtensionsTests

✅ ValidateToUrlWithQueryMethod("https://example.com?a=b",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[=&?, =?&=?&]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, System.String[]]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[])

✅ src/TestResults/net8.0/Aydsko.iRacingData.UnitTests.trx

162 tests were completed in 39s with 162 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests 76✅ 2s
Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests 2✅ 21ms
Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests 4✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests 8✅ 22ms
Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests 10✅ 1ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests 8✅ 5ms
Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests 8✅ 1ms
Aydsko.iRacingData.UnitTests.CookiePersistenceTests 4✅ 8ms
Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests 4✅ 72ms
Aydsko.iRacingData.UnitTests.DictionaryExtensionTests 6✅ 12ms
Aydsko.iRacingData.UnitTests.PasswordEncodingTests 14✅ 17ms
Aydsko.iRacingData.UnitTests.ServicesTests 2✅ 58ms
Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests 2✅ 49ms
Aydsko.iRacingData.UnitTests.UrlExtensionsTests 6✅ 1ms

✅ Aydsko.iRacingData.UnitTests.CapturedResponseValidationTests

✅ GetBestLapStatisticsSuccessfulAsync
✅ GetCarAssetDetailsSuccessfulAsync
✅ GetCarClassesSuccessfulAsync
✅ GetCarsSuccessfulAsync
✅ GetCategoriesSuccessfulAsync
✅ GetClubHistoryLookupsSuccessfulAsync
✅ GetCountriesSuccessfulAsync
✅ GetCustomerLeagueSessionsAsync
✅ GetDivisionsSuccessfulAsync
✅ GetDriverAwardsSuccessfulAsync
✅ GetDriverInfoWithLicensesSuccessfulAsync
✅ GetDriverInfoWithoutLicensesSuccessfulAsync
✅ GetEventTypesSuccessfulAsync
✅ GetHostedSessionsCombinedSuccessfulAsync
✅ GetHostedSessionsSuccessfulAsync
✅ GetLeaguePointsSystemsSuccessfulAsync
✅ GetLeagueWithLicensesSucceedsAsync
✅ GetLeagueWithoutLicensesSucceedsAsync
✅ GetLicenseLookupsSuccessfulAsync
✅ GetLookupsSuccessfulAsync
✅ GetLookupWithExpiredAuthWorksAsync
✅ GetMemberChartDataSuccessfulAsync
✅ GetMemberDivisionSuccessfulAsync
✅ GetMemberInfoDuringMaintenanceThrowsAsync
✅ GetMemberInfoSucceedsAsync
✅ GetMemberParticipationCreditsSucceedsAsync
✅ GetMemberProfileFailsOnLoginWithGatewayTimeoutAsync
✅ GetMemberProfileFailsWithGatewayTimeoutAsync
✅ GetMemberProfileSuccessfulAsync
✅ GetMemberRecapSuccessfulAsync
✅ GetMemberRecentRacesSucceedsAsync
✅ GetMemberSummarySuccessfulAsync
✅ GetMemberYearlyStatisticsSuccessfulAsync
✅ GetPastSeasonsForSeriesSuccessfulAsync
✅ GetRaceGuideSuccessfulAsync
✅ GetSeasonDriverStandingsSuccessfulAsync
✅ GetSeasonQualifyResultsSuccessfulAsync
✅ GetSeasonResultsHandlesBadRequestAsync
✅ GetSeasonsWithoutSeriesSuccessfulAsync
✅ GetSeasonsWithSeriesSuccessfulAsync
✅ GetSeasonTeamStandingsSuccessfulAsync
✅ GetSeasonTimeTrialResultsSuccessfulAsync
✅ GetSeasonTimeTrialStandingsSuccessfulAsync
✅ GetSeriesAssetsSuccessfulAsync
✅ GetSeriesSuccessfulAsync
✅ GetServiceStatusSuccessfulAsync
✅ GetSingleDriverSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetSingleDriverSubsessionLapsSuccessfulAsync
✅ GetSpectatorSubsessionDetailsSuccessfulAsync
✅ GetSpectatorSubsessionIdentifiersAsync
✅ GetStatisticsSeriesSuccessfulAsync
✅ GetSubsessionEventLogForbiddenThrowsErrorsAsync
✅ GetSubsessionEventLogSuccessfulAsync
✅ GetSubSessionLapChartSuccessfulAsync
✅ GetSubSessionResultForbiddenThrowsErrorsAsync
✅ GetSubSessionResultForLeagueSuccessfulAsync
✅ GetSubSessionResultForTeamSuccessfulAsync
✅ GetSubSessionResultSuccessfulAsync
✅ GetSubSessionResultUnauthorizedThrowsErrorsAsync
✅ GetSubSessionResultWithWeatherSuccessfulAsync
✅ GetTeamSubsessionLapsForbiddenThrowsErrorsAsync
✅ GetTeamSubsessionLapsSuccessfulAsync
✅ GetTeamSuccessfulAsync
✅ GetTimeAttackMemberSeasonResultsSuccessfulAsync
✅ GetTimeAttackSeriesSuccessfulAsync
✅ GetTrackAssetsSuccessfulAsync
✅ GetTracksSuccessfulAsync
✅ GetWeatherForecastAsync
✅ GetWorldRecordStatisticsSuccessfulAsync
✅ ListHostedSessionsCombinedSuccessfulAsync
✅ ListHostedSessionsSuccessfulAsync
✅ ListSeasonsSuccessfulAsync
✅ SearchDriversSuccessfulAsync
✅ SearchHostedResultsSuccessfulAsync
✅ SearchLeagueDirectorySuccessfulAsync
✅ SearchOfficialResultsSuccessfulAsync

✅ Aydsko.iRacingData.UnitTests.Converters.ServiceStatusHistoryItemArrayConverterConverterTests

✅ Read Value: 11:29:57 to 11:30:57 27 Jan 2023
✅ Write Value: 11:29:57 to 11:30:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StatusTimeStampConverterTests

✅ Read Value: 11:19:12 27-Jan-2023
✅ Read Value: 22:29:57 27 Jan 2023
✅ Write Value: 11:19:12 27-Jan-2023
✅ Write Value: 22:29:57 27 Jan 2023

✅ Aydsko.iRacingData.UnitTests.Converters.StringFromStringOrNumberConverterTests

✅ Read Value: JSON Null value
✅ Read Value: JSON Number value of 1
✅ Read Value: JSON Number value of zero
✅ Read Value: JSON String value of 'ABC123'
✅ Write Value: JSON Null value
✅ Write Value: JSON Number value of 1
✅ Write Value: JSON Number value of zero
✅ Write Value: JSON String value of 'ABC123'

✅ Aydsko.iRacingData.UnitTests.Converters.TenThousandthSecondDurationConverterTests

✅ Read Value: 0 / 0:00.000
✅ Read Value: 600000 / 1:00.000
✅ Read Value: 834560 / 1:23.456
✅ Read Value: null / null
✅ Write Value: 0 / 0:00.000
✅ Write Value: 600000 / 1:00.000
✅ Write Value: 834560 / 1:23.456
✅ Write Value: null / null

✅ Aydsko.iRacingData.UnitTests.Converters.TrackConfigNameNaConverterTests

✅ Read Value: Value "" returns null
✅ Read Value: Value "Grand Prix" returns that
✅ Read Value: Value "International" returns that
✅ Read Value: Value "n/a" returns null
✅ Read Value: Value "n/A" returns null
✅ Read Value: Value "N/a" returns null
✅ Read Value: Value "N/A" returns null
✅ Write Value: Value "Grand Prix" returns that
✅ Write Value: Value "International" returns that
✅ Write Value: Value "N/A" returns null

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanArrayConverterTests

✅ Read Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Read Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Read Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Read Value: Value [630] returns [TimeSpan.FromHours(10.5)]
✅ Write Value: Value [-240] returns [TimeSpan.FromHours(-4)]
✅ Write Value: Value [0,0] returns [TimeSpan.Zero,TimeSpan.Zero]
✅ Write Value: Value [240,0] returns [TimeSpan.FromHours(4),TimeSpan.Zero]
✅ Write Value: Value [630] returns [TimeSpan.FromHours(10.5)]

✅ Aydsko.iRacingData.UnitTests.Converters.UtcOffsetToTimeSpanConverterTests

✅ Read Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Read Value: Value 0 returns TimeSpan.Zero
✅ Read Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Read Value: Value 14400 returns TimeSpan.FromHours(4)
✅ Write Value: Value -14400 returns TimeSpan.FromHours(-4)
✅ Write Value: Value 0 returns TimeSpan.Zero
✅ Write Value: Value 14400 returns TimeSpan.FromHours(10.5)
✅ Write Value: Value 14400 returns TimeSpan.FromHours(4)

✅ Aydsko.iRacingData.UnitTests.CookiePersistenceTests

✅ GivenACookieContainerWithCookiesAndNoRestoreOrSaveFunctionsThenTheCookiesAreUsedAsync
✅ GivenOptionsWithARestoreFuncTheFuncIsCalledToGetTheCookiesAsync
✅ GivenOptionsWithASaveActionTheSaveActionIsCalledWithTheCookiesAsync
✅ GivenOptionsWithNullDelegateValuesWhenAMethodIsCalledThenItWillSucceedAsync

✅ Aydsko.iRacingData.UnitTests.DataClientTrackAssetScreenshotUrisTests

✅ GivenHungaroringTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenHungaroringTrackId_ThenGetTrackAssetScreenshotUrisAsyncReturnsCorrectResultsAsync
✅ GivenSuzukaTrack_ThenGetTrackAssetScreenshotUrisReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.DictionaryExtensionTests

✅ CheckAddParameterIfNotNull<Boolean>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Boolean])
✅ CheckAddParameterIfNotNull<DateTime>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.DateTime])
✅ CheckAddParameterIfNotNull<EventType>(Aydsko.iRacingData.UnitTests.ExampleData`1[Aydsko.iRacingData.Common.EventType])
✅ CheckAddParameterIfNotNull<IEnumerable`1>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Collections.Generic.IEnumerable`1[System.String]])
✅ CheckAddParameterIfNotNull<Int32[]>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.Int32[]])
✅ CheckAddParameterIfNotNull<String>(Aydsko.iRacingData.UnitTests.ExampleData`1[System.String])

✅ Aydsko.iRacingData.UnitTests.PasswordEncodingTests

✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsCalledIfCookiesAreExpiredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ LoginIsNotCalledIfCookiesAreSuccessfullyRestoredAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","MyPassWord","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodAsync("[email protected]","SuperSecretPassword","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaMethodWithPasswordIsEncodedParamAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","MyPassWord",False,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=",True,"xGKecAR27ALXNuMLsGaG0v5Q9pSs2tZTZRKNgmHMg+Q=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=",True,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")
✅ ValidateLoginRequestViaOptionsAsync("[email protected]","SuperSecretPassword",False,"nXmEFCdpHheD1R3XBVkm6VQavR7ZLbW7SRmzo/MfFso=")

✅ Aydsko.iRacingData.UnitTests.ServicesTests

✅ LoginAndUserAgentDefaultWorksWhenResolvedFromServicesAsync
✅ LoginAndUserAgentWorksWhenResolvedFromServicesAsync

✅ Aydsko.iRacingData.UnitTests.TrackScreenshotServiceTests

✅ GivenHungaroringTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync
✅ GivenSuzukaTrackId_ThenGetScreenshotsByTrackIdReturnsCorrectResultsAsync

✅ Aydsko.iRacingData.UnitTests.UrlExtensionsTests

✅ ValidateToUrlWithQueryMethod("https://example.com?a=b",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[=&?, =?&=?&]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar], [baz, bat]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, bar]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[[foo, System.String[]]])
✅ ValidateToUrlWithQueryMethod("https://example.com",[])