From 23c1a241e8b37931ad8a3ed1b2a1627a9bc335e8 Mon Sep 17 00:00:00 2001 From: Tigran TIKSN Torosyan Date: Wed, 17 Jun 2026 13:52:57 -0500 Subject: [PATCH 1/2] Add dotnet outdated --- .config/dotnet-tools.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index fdd2ce6a..665e687e 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -22,6 +22,13 @@ "dotnet-gitversion" ], "rollForward": false + }, + "dotnet-outdated-tool": { + "version": "4.8.1", + "commands": [ + "dotnet-outdated" + ], + "rollForward": false } } } \ No newline at end of file From e0331fcaca12d25371df02c891e41ef39017c802 Mon Sep 17 00:00:00 2001 From: Tigran TIKSN Torosyan Date: Wed, 17 Jun 2026 16:15:29 -0500 Subject: [PATCH 2/2] Use token in tests --- Directory.Packages.props | 2 +- .../BranchesControllerWithSystemLicense.cs | 101 +++++++++--------- .../CompanyControllerWithSystemLicense.cs | 36 +++---- .../CompanyLicenseControllerEmptyDatabase.cs | 4 +- ...mpanyLicenseControllerWithSystemLicense.cs | 4 +- ...panySettingsControllerWithSystemLicense.cs | 41 +++---- .../DepartmentsControllerWithSystemLicense.cs | 12 +-- .../EmployeeControllerWithSystemLicense.cs | 84 +++++++-------- .../Extensions/ServiceCollectionExtensions.cs | 5 +- .../IAccessTokenContext.cs | 8 ++ ...cs => TestHttpTransportWithAccessToken.cs} | 44 ++++++-- .../API.IntegrationTests.csproj | 2 +- 12 files changed, 190 insertions(+), 153 deletions(-) create mode 100644 tests/API.FunctionalTests/IAccessTokenContext.cs rename tests/API.FunctionalTests/{TestHttpTransport.cs => TestHttpTransportWithAccessToken.cs} (73%) diff --git a/Directory.Packages.props b/Directory.Packages.props index 13b71970..1600f657 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -40,4 +40,4 @@ - + \ No newline at end of file diff --git a/tests/API.FunctionalTests/ControllerApis/BranchesControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/BranchesControllerWithSystemLicense.cs index 24b10b6f..8cadbd30 100644 --- a/tests/API.FunctionalTests/ControllerApis/BranchesControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/BranchesControllerWithSystemLicense.cs @@ -25,9 +25,9 @@ public async Task CreateBranchWithAdministratorAccessWithInvalidTimeZoneIdTokenA { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); const string branchName = "Branch-392136901"; const string timeZoneId = "USZone"; var address = new AddressModel("1234 Main St", "Suite 100", "Los Angeles", "CA", "12345", "US"); @@ -40,9 +40,9 @@ public async Task CreateBranchWithAdministratorAccessWithLicensedTimeZoneIdToken { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); const string branchName = "Branch-392136901"; const string timeZoneId = "America/New_York"; @@ -60,9 +60,9 @@ public async Task CreateBranchWithAdministratorAccessWithUnlicensedTimeZoneIdTok { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); const string branchName = "Branch-392136901"; const string timeZoneId = "Australia/Perth"; @@ -83,9 +83,9 @@ public async Task CreateBranchWithUserAccessTokenWithInvalidTimeZoneIdAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); const string branchName = "Branch-826076795"; (await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, "USZone", address: null), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); @@ -96,9 +96,9 @@ public async Task CreateBranchWithUserAccessTokenWithLicensedTimeZoneIdAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); const string branchName = "Branch-826076795"; (await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, "America/Detroit", address: null), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); @@ -109,9 +109,9 @@ public async Task CreateBranchWithUserAccessTokenWithUnlicensedTimeZoneIdAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.User1"); const string branchName = "Branch-826076795"; (await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, "Australia/Perth", address: null), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); @@ -122,10 +122,10 @@ public async Task CreateThenDeleteBranchWithAdministratorAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var branchEasyStore = _factory.Services.GetRequiredService().Resolve(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); const string branchName = "Branch-832159009"; const string timeZoneId = "America/New_York"; @@ -167,9 +167,9 @@ public async Task DeleteExistingBranchWithDependenciesWithAdministratorAccessTok using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JKXJVFFPWRP9E7YNBQE8KMRB.Tenant1.User35292075"); + accessTokenContext.SetAccessToken("01JKXJVFFPWRP9E7YNBQE8KMRB.Tenant1.User35292075"); await employeeClient.CreateEmployeeAsync(new EmployeeModificationModel(firstName, lastName, fullName), TestContext.Current.CancellationToken); @@ -177,7 +177,7 @@ public async Task DeleteExistingBranchWithDependenciesWithAdministratorAccessTok employeeResponseModel.ShouldNotBeNull(); var createdEmployee = employeeResponseModel.Items.First(); - transport.SetAuthorizationToken("Bearer", "01JKXHHECNDQ6BYNA6CQQ2S59P.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JKXHHECNDQ6BYNA6CQQ2S59P.Tenant1.ADMIN1"); await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, timeZoneId, address: null), TestContext.Current.CancellationToken); @@ -187,6 +187,7 @@ public async Task DeleteExistingBranchWithDependenciesWithAdministratorAccessTok var createdBranchModel = branchResponseModel.Items.Single(x => string.Equals(x.Name, branchName, StringComparison.OrdinalIgnoreCase)); + var transport = scope.ServiceProvider.GetRequiredService(); await transport.PutAsync( $"/api/1.0/Employees/{createdEmployee.Id}", EndpointSecurity.RequireToken, @@ -203,10 +204,10 @@ public async Task DeleteExistingBranchWithoutDependenciesWithAdministratorAccess { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var branchEasyStore = _factory.Services.GetRequiredService().Resolve(); - transport.SetAuthorizationToken("Bearer", "01JA0JKF0VRC9JPZ9JSAMHGAFS.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA0JKF0VRC9JPZ9JSAMHGAFS.Tenant1.ADMIN1"); var existingBranch = branchEasyStore.Entities.Values.Single(x => string.Equals(x.Name, "Branch2-1972002548", StringComparison.Ordinal)); @@ -220,10 +221,10 @@ public async Task DeleteExistingBranchWithoutDependenciesWithUserAccessTokenAsyn { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var branchEasyStore = _factory.Services.GetRequiredService().Resolve(); - transport.SetAuthorizationToken("Bearer", "01JA0JKF0VRC9JPZ9JSAMHGAFS.Tenant1.User2"); + accessTokenContext.SetAccessToken("01JA0JKF0VRC9JPZ9JSAMHGAFS.Tenant1.User2"); var existingBranch = branchEasyStore.Entities.Values.Single(x => string.Equals(x.Name, "Branch3-1513925028", StringComparison.Ordinal)); @@ -235,9 +236,9 @@ public async Task DeleteMissingBranchWithAdministratorAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1J99K3NCGNA6X4Z194PJXF.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1J99K3NCGNA6X4Z194PJXF.Tenant1.ADMIN1"); await Should.NotThrowAsync(async () => await branchClient.DeleteBranchAsync(123456789, TestContext.Current.CancellationToken)); @@ -248,9 +249,9 @@ public async Task DeleteMissingBranchWithUserAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA0JKPRJDN7RXSMGXZ946WRB.Tenant1000.User1"); + accessTokenContext.SetAccessToken("01JA0JKPRJDN7RXSMGXZ946WRB.Tenant1000.User1"); (await branchClient.DeleteBranchAsync(123456789, TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); } @@ -268,9 +269,9 @@ public async Task ListBranches_WithSearchTerm_ReturnsFilteredResultsAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); // Create branches with distinct names await branchClient.CreateBranchAsync(new BranchModificationModel("NYC Downtown Branch", "America/New_York", null), TestContext.Current.CancellationToken); @@ -290,9 +291,9 @@ public async Task ListBranches_WithSpecificIds_ReturnsRequestedBranchesAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); // Create branches and collect their IDs var branchIds = new List(); @@ -325,9 +326,9 @@ public async Task ListBranches_WithValidPaging_ReturnsPaginatedResultsAsync(int // Create multiple branches using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); for (int i = 1; i <= 12; i++) { @@ -355,15 +356,15 @@ public async Task ListCreatedBranchesAsync() using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JMV0X5W7N908QW69WVVDPFAW.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JMV0X5W7N908QW69WVVDPFAW.Tenant1.ADMIN1"); await branchClient.CreateBranchAsync(new BranchModificationModel(branch1Name, timeZoneId, address: null), TestContext.Current.CancellationToken); await branchClient.CreateBranchAsync(new BranchModificationModel(branch2Name, timeZoneId, address: null), TestContext.Current.CancellationToken); await branchClient.CreateBranchAsync(new BranchModificationModel(branch3Name, timeZoneId, address: null), TestContext.Current.CancellationToken); - transport.SetAuthorizationToken("Bearer", "01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.User1"); + accessTokenContext.SetAccessToken("01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.User1"); var retrievalResponseModel = (await branchClient.GetBranchesAsync(new BranchQueryRequestModel { PageNumber = 1, PageSize = 100 }, TestContext.Current.CancellationToken)).Unwrap(); @@ -403,9 +404,9 @@ public async Task RetrieveExistingBranchesWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SYCJ4MHZXGQKT0ARG7KNCC.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9SYCJ4MHZXGQKT0ARG7KNCC.Tenant1.User1"); var responseModel = (await branchClient.GetBranchesAsync(new BranchQueryRequestModel { PageNumber = 1, PageSize = 5 }, TestContext.Current.CancellationToken)).Unwrap(); responseModel.ShouldNotBeNull(); @@ -420,9 +421,9 @@ public async Task RetrieveMissingBranchWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SYCPN31B53QHRR7Y13D30F.Tenant1000.User1000"); + accessTokenContext.SetAccessToken("01J9SYCPN31B53QHRR7Y13D30F.Tenant1000.User1000"); var responseModel = (await branchClient.GetBranchesAsync(new BranchQueryRequestModel { PageNumber = 1, PageSize = 5 }, TestContext.Current.CancellationToken)).Unwrap(); responseModel.ShouldNotBeNull(); @@ -447,9 +448,9 @@ public async Task UpdateBranchWithAdministratorAccessTokenWithInvalidAddressAsyn { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); var creationBranchName = $"Branch-{Random.Shared.Next()}"; const string creationTimeZoneId = "America/Los_Angeles"; var creationAddress = new AddressModel("1234 Main St", "Suite 100", "Los Angeles", "CA", "12345", "US"); @@ -472,9 +473,9 @@ public async Task UpdateBranchWithAdministratorAccessWithLicensedTimeZoneIdToken { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); const string creationBranchName = "Branch-753988509"; const string creationTimeZoneId = "America/Los_Angeles"; var creationAddress = new AddressModel("1234 Main St", "Suite 100", "Los Angeles", "CA", "12345", "US"); @@ -527,9 +528,9 @@ public async Task UpdateBranch_WithValidData_SucceedsAsync() // Create a branch first using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); const string branchName = "Test Branch 647834591"; await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, "America/New_York", null), TestContext.Current.CancellationToken); @@ -558,9 +559,9 @@ public async Task UpdateBranch_WithInvalidTimeZone_ReturnsUnprocessableEntityAsy // Create a branch first using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.ADMIN1"); const string branchName = "Test Branch 984679490"; await branchClient.CreateBranchAsync(new BranchModificationModel(branchName, "America/New_York", null), TestContext.Current.CancellationToken); @@ -578,9 +579,9 @@ public async Task UpdateBranch_WithInvalidBranchId_ReturnsNotFoundAsync() { using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant101.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant101.ADMIN1"); (await branchClient.UpdateBranchAsync(999999, new BranchModificationModel("Updated Branch", "America/Chicago", null), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); } @@ -600,9 +601,9 @@ public async Task UpdateBranchWithDifferentCountryCodeShouldFailAsync() // Arrange using var scope = _factory.Services.CreateScope(); var branchClient = scope.ServiceProvider.GetRequiredService().BranchClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9WMVQRX3J3K00JCDGZN4V59.Tenant1.ADMIN1"); // Create initial branch with US address const string branchName = "Branch-CountryValidation"; diff --git a/tests/API.FunctionalTests/ControllerApis/CompanyControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/CompanyControllerWithSystemLicense.cs index 04e77369..9623a288 100644 --- a/tests/API.FunctionalTests/ControllerApis/CompanyControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/CompanyControllerWithSystemLicense.cs @@ -25,9 +25,9 @@ public async Task CreateCompanyWithAdministratorAccessTokenAndUnlicensedCountryA { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant102.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant102.ADMIN1"); const string companyName = "Company-1412593541"; (await companyClient.CreateCompanyAsync(new CompanyModificationModel(companyName, "KZ"), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.UnprocessableEntity); @@ -38,10 +38,10 @@ public async Task CreateCompanyWithAdministratorAccessTokenWithLicensedCountryAs { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var licenseEasyStoreBucket = _factory.Services.GetRequiredService().ResolveBucket("License"); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant101.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant101.ADMIN1"); const string companyName = "Company-1993954667"; await companyClient.CreateCompanyAsync(new CompanyModificationModel(companyName, "us"), TestContext.Current.CancellationToken); @@ -70,9 +70,9 @@ public async Task CreateCompanyWithUserAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJFK2J690FS0Q3TCX4P3F.Tenant101.User1"); + accessTokenContext.SetAccessToken("01JA1ZJFK2J690FS0Q3TCX4P3F.Tenant101.User1"); const string companyName = "Company-144764445"; (await companyClient.CreateCompanyAsync(new CompanyModificationModel(companyName, "US"), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); @@ -92,9 +92,9 @@ public async Task DeleteExistingCompanyWithDependenciesWithAdministratorAccessTo { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.ADMIN1"); (await companyClient.DeleteCompanyAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.FailedDependency); } @@ -104,10 +104,10 @@ public async Task DeleteExistingCompanyWithoutDependenciesWithAdministratorAcces { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var companyEasyStore = _factory.Services.GetRequiredService().Resolve(); - transport.SetAuthorizationToken("Bearer", "01J9SJ94KK62JSRNQD7H70NCF7.Tenant3.ADMIN1"); + accessTokenContext.SetAccessToken("01J9SJ94KK62JSRNQD7H70NCF7.Tenant3.ADMIN1"); companyEasyStore.Entities.Values.FirstOrDefault(x => string.Equals(x.Name, "Company3-1868946743", StringComparison.Ordinal)).ShouldNotBeNull(); @@ -121,9 +121,9 @@ public async Task DeleteExistingCompanyWithUserAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.User1"); (await companyClient.DeleteCompanyAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.Forbidden); } @@ -133,9 +133,9 @@ public async Task DeleteMissingCompanyWithAdministratorAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SJ94KK62JSRNQD7H70NCF7.Tenant1000.ADMIN1"); + accessTokenContext.SetAccessToken("01J9SJ94KK62JSRNQD7H70NCF7.Tenant1000.ADMIN1"); await Should.NotThrowAsync(async () => await companyClient.DeleteCompanyAsync(TestContext.Current.CancellationToken)); @@ -163,9 +163,9 @@ public async Task RetrieveExistingCompanyWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.User1"); + accessTokenContext.SetAccessToken("01J9SJ94KK62JSRNQD7H70NCF7.Tenant1.User1"); var responseModel = (await companyClient.GetCompanyAsync(TestContext.Current.CancellationToken)).Unwrap(); responseModel.ShouldNotBeNull(); @@ -179,9 +179,9 @@ public async Task RetrieveMissingCompanyWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyClient = scope.ServiceProvider.GetRequiredService().CompanyClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9SXMEMR1GQ3EE3Q4A872GKD.Tenant1000.User1000"); + accessTokenContext.SetAccessToken("01J9SXMEMR1GQ3EE3Q4A872GKD.Tenant1000.User1000"); (await companyClient.GetCompanyAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); } diff --git a/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerEmptyDatabase.cs b/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerEmptyDatabase.cs index fb3a84dd..7f2aabdd 100644 --- a/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerEmptyDatabase.cs +++ b/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerEmptyDatabase.cs @@ -61,9 +61,9 @@ public async Task RetrieveCompanyLicenseWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var companyLicenseClient = scope.ServiceProvider.GetRequiredService().CompanyLicenseClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1R22PNGNDJNP12A506EFWZ.Tenant1.User1"); + accessTokenContext.SetAccessToken("01JA1R22PNGNDJNP12A506EFWZ.Tenant1.User1"); (await companyLicenseClient.GetLicenseAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.UnprocessableEntity); } diff --git a/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerWithSystemLicense.cs index 9dc0926f..7f1593a9 100644 --- a/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/CompanyLicenseControllerWithSystemLicense.cs @@ -23,9 +23,9 @@ public async Task CreateCompanyLicenseWithAdministratorAccessTokenAsync() using var scope = _factory.Services.CreateScope(); var companyLicenseClient = scope.ServiceProvider.GetRequiredService().CompanyLicenseClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User1"); var licenseResponseModel = (await companyLicenseClient.GetLicenseAsync(TestContext.Current.CancellationToken)).Unwrap(); licenseResponseModel.ShouldNotBeNull(); diff --git a/tests/API.FunctionalTests/ControllerApis/CompanySettingsControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/CompanySettingsControllerWithSystemLicense.cs index 6eafe512..4b176aa1 100644 --- a/tests/API.FunctionalTests/ControllerApis/CompanySettingsControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/CompanySettingsControllerWithSystemLicense.cs @@ -23,9 +23,9 @@ public async Task CreateCompanySettingsWithAdministratorAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant3.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant3.ADMIN1"); const string colorSchemeId = "new-theme"; @@ -44,9 +44,9 @@ public async Task CreateCompanySettingsWithInvalidColorSchemeIdAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant4.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant4.ADMIN1"); // Test various invalid colorSchemeId formats var invalidColorSchemeIds = new[] @@ -73,7 +73,7 @@ public async Task CreateCompanySettingsWithValidColorSchemeIdFormatsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); // Test various valid colorSchemeId formats var validTestCases = new[] @@ -86,10 +86,11 @@ public async Task CreateCompanySettingsWithValidColorSchemeIdFormatsAsync() foreach (var testCase in validTestCases) { - transport.SetAuthorizationToken("Bearer", $"01JA1ZJAWF27S0J8Z2VJE7673Y.{testCase.Tenant}.ADMIN1"); + accessTokenContext.SetAccessToken($"01JA1ZJAWF27S0J8Z2VJE7673Y.{testCase.Tenant}.ADMIN1"); const string companyName = "Company-1412593541"; + var transport = scope.ServiceProvider.GetRequiredService(); await transport.PostAsync( "/api/1.0/Company", EndpointSecurity.RequireToken, @@ -112,9 +113,9 @@ public async Task CreateDuplicateCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.ADMIN1"); // Try to create company settings for a company that already has settings (await settingsClient.CreateCompanySettingsAsync( @@ -126,9 +127,9 @@ public async Task DeleteExistingCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JB0RAH24ZJBA53AJF5F5MMZX.Tenant2.ADMIN1"); + accessTokenContext.SetAccessToken("01JB0RAH24ZJBA53AJF5F5MMZX.Tenant2.ADMIN1"); await settingsClient.DeleteCompanySettingsAsync(TestContext.Current.CancellationToken); @@ -140,9 +141,9 @@ public async Task DeleteNonExistentCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.ADMIN1"); (await settingsClient.DeleteCompanySettingsAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); } @@ -154,9 +155,9 @@ public async Task GetExistingCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.User1"); + accessTokenContext.SetAccessToken("01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.User1"); var responseModel = (await settingsClient.GetCompanySettingsAsync(TestContext.Current.CancellationToken)).Unwrap(); @@ -170,9 +171,9 @@ public async Task GetNonExistentCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.User1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.User1"); (await settingsClient.GetCompanySettingsAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); } @@ -188,9 +189,9 @@ public async Task UpdateExistingCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.ADMIN1"); + accessTokenContext.SetAccessToken("01JB0QS2K6SA4KYD8S920W7DMG.Tenant1.ADMIN1"); const string newColorSchemeId = "updated-theme"; @@ -208,9 +209,9 @@ public async Task UpdateNonExistentCompanySettingsAsync() { using var scope = _factory.Services.CreateScope(); var settingsClient = scope.ServiceProvider.GetRequiredService().CompanySettingsClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.ADMIN1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1000.ADMIN1"); (await settingsClient.UpdateCompanySettingsAsync( new CompanySettingsModificationModel("new-theme"), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); diff --git a/tests/API.FunctionalTests/ControllerApis/DepartmentsControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/DepartmentsControllerWithSystemLicense.cs index 68609804..aee22f40 100644 --- a/tests/API.FunctionalTests/ControllerApis/DepartmentsControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/DepartmentsControllerWithSystemLicense.cs @@ -24,9 +24,9 @@ public async Task CreateAndListDepartmentsAsync() using var scope = _factory.Services.CreateScope(); var departmentClient = scope.ServiceProvider.GetRequiredService().DepartmentClient; var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN420425736"); + accessTokenContext.SetAccessToken("01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN420425736"); const string firstName = "First35292075"; const string lastName = "Last35292075"; @@ -81,9 +81,9 @@ public async Task DeleteExistingDepartmentWithoutDependenciesWithAdministratorAc using var scope = _factory.Services.CreateScope(); var departmentClient = scope.ServiceProvider.GetRequiredService().DepartmentClient; var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN430851539"); + accessTokenContext.SetAccessToken("01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN430851539"); await employeeClient.CreateEmployeeAsync(new EmployeeModificationModel(firstName, lastName, fullName), TestContext.Current.CancellationToken); @@ -123,9 +123,9 @@ public async Task UpdateExistingDepartmentWithAdministratorAccessTokenAsync() using var scope = _factory.Services.CreateScope(); var departmentClient = scope.ServiceProvider.GetRequiredService().DepartmentClient; var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN604735919"); + accessTokenContext.SetAccessToken("01JMV0XC70JH9GC8P9M6SYYYAK.Tenant1.ADMIN604735919"); await employeeClient.CreateEmployeeAsync(new EmployeeModificationModel(firstName, lastName, fullName), TestContext.Current.CancellationToken); diff --git a/tests/API.FunctionalTests/ControllerApis/EmployeeControllerWithSystemLicense.cs b/tests/API.FunctionalTests/ControllerApis/EmployeeControllerWithSystemLicense.cs index d0c3e461..4bee492c 100644 --- a/tests/API.FunctionalTests/ControllerApis/EmployeeControllerWithSystemLicense.cs +++ b/tests/API.FunctionalTests/ControllerApis/EmployeeControllerWithSystemLicense.cs @@ -39,9 +39,9 @@ public async Task CreateExistingEmployeeWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User1"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User1"); const string firstName = "First812685875"; const string lastName = "Last812685875"; @@ -65,9 +65,9 @@ public async Task CreateMissingEmployeeWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User100"); + accessTokenContext.SetAccessToken("01JA1ZJAWF27S0J8Z2VJE7673Y.Tenant1.User100"); const string firstName = "First576536102"; const string lastName = "Last576536102"; @@ -98,10 +98,10 @@ public async Task DeleteExistingEmployeeWithoutDependenciesWithUserAccessTokenAs { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var employeeEasyStore = _factory.Services.GetRequiredService().Resolve(); - transport.SetAuthorizationToken("Bearer", "01J9ZHFMA4ZXFE4EVMZARRTK7M.Tenant2.User1"); + accessTokenContext.SetAccessToken("01J9ZHFMA4ZXFE4EVMZARRTK7M.Tenant2.User1"); var existingEmployee = employeeEasyStore.Entities.Values.Single(x => string.Equals(x.FullName, "Meaghan Riley", StringComparison.OrdinalIgnoreCase)); @@ -115,9 +115,9 @@ public async Task DeleteMissingEmployeeWithUserAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9ZHG6056FSRFJ7GC9E21JFD.Tenant1000.User1"); + accessTokenContext.SetAccessToken("01J9ZHG6056FSRFJ7GC9E21JFD.Tenant1000.User1"); // Attempting to delete the authenticated user's employee explicitly is idempotent and succeeds await Should.NotThrowAsync(async () => await employeeClient.DeleteCurrentEmployeeAsync(TestContext.Current.CancellationToken)); @@ -138,12 +138,12 @@ public async Task ListCreatedEmployeesAsync() using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); var employeeIds = new List(); foreach (var x in Seq(36883136, 36883144, 36883148)) { - transport.SetAuthorizationToken("Bearer", $"01JND081MJRM7Q0CHWEY1038EF.Tenant1.User{x}"); + accessTokenContext.SetAccessToken($"01JND081MJRM7Q0CHWEY1038EF.Tenant1.User{x}"); var firstName = $"First{x}"; var lastName = $"Last{x}"; @@ -191,8 +191,8 @@ public async Task RetrieveExistingEmployeeWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9ZHGBMC1DVP4R33QRYZ04RX.Tenant1.User1"); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); + accessTokenContext.SetAccessToken("01J9ZHGBMC1DVP4R33QRYZ04RX.Tenant1.User1"); var responseModel = (await employeeClient.GetCurrentEmployeeAsync(TestContext.Current.CancellationToken)).Unwrap(); @@ -210,8 +210,8 @@ public async Task RetrieveMissingEmployeeWithAccessTokenAsync() { using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01J9ZHGFXBG4WKNJKBSG7T2Y76.Tenant1000.User1000"); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); + accessTokenContext.SetAccessToken("01J9ZHGFXBG4WKNJKBSG7T2Y76.Tenant1000.User1000"); // The endpoint returns 404 if the authenticated user's employee cannot be found (await employeeClient.GetCurrentEmployeeAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.NotFound); @@ -224,9 +224,9 @@ public async Task UpdateEmployeeAssignedDepartmentAsync() using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; var departmentClient = scope.ServiceProvider.GetRequiredService().DepartmentClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - transport.SetAuthorizationToken("Bearer", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425736"); + accessTokenContext.SetAccessToken("01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425736"); await employeeClient.CreateEmployeeAsync(new EmployeeModificationModel("First", "Last", "Full Name"), TestContext.Current.CancellationToken); @@ -258,10 +258,10 @@ public async Task UpdateEmployee_WithReportsTo_SucceedsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var manager = await CreateEmployeeAsync(employeeClient, transport, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425737"); - var employee = await CreateEmployeeAsync(employeeClient, transport, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425738"); + var manager = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425737"); + var employee = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425738"); // Act await employeeClient.ManageEmployeeAsync(employee.Id, new EmployeeManagementModel(null, null, manager.Id, "Staff"), TestContext.Current.CancellationToken); @@ -278,14 +278,14 @@ public async Task DeleteEmployee_WithDirectReport_FailsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var manager = await CreateEmployeeAsync(employeeClient, transport, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425739"); - var employee = await CreateEmployeeAsync(employeeClient, transport, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425740"); + var manager = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425739"); + var employee = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425740"); await employeeClient.ManageEmployeeAsync(employee.Id, new EmployeeManagementModel(null, null, manager.Id, "Staff"), TestContext.Current.CancellationToken); // Act & Assert - transport.SetAuthorizationToken("Bearer", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425739"); + accessTokenContext.SetAccessToken("01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425739"); (await employeeClient.DeleteCurrentEmployeeAsync(TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.FailedDependency); } @@ -296,9 +296,9 @@ public async Task UpdateEmployee_WithNonExistentReportsTo_FailsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var employee = await CreateEmployeeAsync(employeeClient, transport, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425741"); + var employee = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425741"); // Act (await employeeClient.ManageEmployeeAsync(employee.Id, new EmployeeManagementModel(null, null, 999999L, "Staff"), TestContext.Current.CancellationToken)).ShouldFailWith(HttpStatusCode.UnprocessableEntity); @@ -310,10 +310,10 @@ public async Task UpdateEmployee_WithCyclicalReference_FailsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var employee1 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425742"); - var employee2 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425743"); + var employee1 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425742"); + var employee2 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425743"); await employeeClient.ManageEmployeeAsync(employee2.Id, new EmployeeManagementModel(null, null, employee1.Id, "Staff"), TestContext.Current.CancellationToken); @@ -327,11 +327,11 @@ public async Task UpdateEmployee_WithLongerCyclicalReference_FailsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var employee1 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425744"); - var employee2 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425745"); - var employee3 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "Three", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425746"); + var employee1 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425744"); + var employee2 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425745"); + var employee3 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "Three", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425746"); await employeeClient.ManageEmployeeAsync(employee2.Id, new EmployeeManagementModel(null, null, employee1.Id, "Staff"), TestContext.Current.CancellationToken); await employeeClient.ManageEmployeeAsync(employee3.Id, new EmployeeManagementModel(null, null, employee2.Id, "Staff"), TestContext.Current.CancellationToken); @@ -346,12 +346,12 @@ public async Task ListEmployees_ByReportsToId_ReturnsFilteredResultsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var manager = await CreateEmployeeAsync(employeeClient, transport, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425747"); - var employee1 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425748"); - var employee2 = await CreateEmployeeAsync(employeeClient, transport, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425749"); - await CreateEmployeeAsync(employeeClient, transport, "Employee", "Three", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425750"); + var manager = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425747"); + var employee1 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "One", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425748"); + var employee2 = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "Two", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425749"); + await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "Three", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425750"); await employeeClient.ManageEmployeeAsync(employee1.Id, new EmployeeManagementModel(null, null, manager.Id, "Staff"), TestContext.Current.CancellationToken); await employeeClient.ManageEmployeeAsync(employee2.Id, new EmployeeManagementModel(null, null, manager.Id, "Staff"), TestContext.Current.CancellationToken); @@ -376,10 +376,10 @@ public async Task ListEmployees_TopLevelOnly_ReturnsFilteredResultsAsync() // Arrange using var scope = _factory.Services.CreateScope(); var employeeClient = scope.ServiceProvider.GetRequiredService().EmployeeClient; - var transport = (TestHttpTransport)scope.ServiceProvider.GetRequiredService(); + var accessTokenContext = scope.ServiceProvider.GetRequiredService(); - var manager = await CreateEmployeeAsync(employeeClient, transport, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425751"); - var employee = await CreateEmployeeAsync(employeeClient, transport, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425752"); + var manager = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Manager", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425751"); + var employee = await CreateEmployeeAsync(employeeClient, accessTokenContext, "Employee", "User", "01K4H70V6A2K39JB4NCYPQ07KY.Tenant1.ADMIN420425752"); await employeeClient.ManageEmployeeAsync(employee.Id, new EmployeeManagementModel(null, null, manager.Id, "Staff"), TestContext.Current.CancellationToken); // Act @@ -397,11 +397,11 @@ public async Task ListEmployees_TopLevelOnly_ReturnsFilteredResultsAsync() result.Items.Any(x => x.Id == manager.Id).ShouldBeTrue(); } - private static async Task CreateEmployeeAsync(IEmployeeClient client, TestHttpTransport transport, string firstName, string lastName, string? token = null) + private static async Task CreateEmployeeAsync(IEmployeeClient client, IAccessTokenContext accessTokenContext, string firstName, string lastName, string? token = null) { if (token != null) { - transport.SetAuthorizationToken("Bearer", token); + accessTokenContext.SetAccessToken(token); } await client.CreateEmployeeAsync(new EmployeeModificationModel(firstName, lastName, $"{firstName} {lastName}"), TestContext.Current.CancellationToken); diff --git a/tests/API.FunctionalTests/Extensions/ServiceCollectionExtensions.cs b/tests/API.FunctionalTests/Extensions/ServiceCollectionExtensions.cs index 6ab97c42..0fda555d 100644 --- a/tests/API.FunctionalTests/Extensions/ServiceCollectionExtensions.cs +++ b/tests/API.FunctionalTests/Extensions/ServiceCollectionExtensions.cs @@ -8,7 +8,10 @@ public static class ServiceCollectionExtensions { public static IServiceCollection AddBridge(this IServiceCollection services) { - _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(sp => sp.GetRequiredService()); + _ = services.AddScoped(sp => sp.GetRequiredService()); + _ = services.AddScoped(sp => sp.GetRequiredService()); _ = services.AddScoped(); return services; diff --git a/tests/API.FunctionalTests/IAccessTokenContext.cs b/tests/API.FunctionalTests/IAccessTokenContext.cs new file mode 100644 index 00000000..769e6ac7 --- /dev/null +++ b/tests/API.FunctionalTests/IAccessTokenContext.cs @@ -0,0 +1,8 @@ +namespace Fossa.API.FunctionalTests; + +public interface IAccessTokenContext +{ + void ClearAccessToken(); + + void SetAccessToken(string accessToken); +} diff --git a/tests/API.FunctionalTests/TestHttpTransport.cs b/tests/API.FunctionalTests/TestHttpTransportWithAccessToken.cs similarity index 73% rename from tests/API.FunctionalTests/TestHttpTransport.cs rename to tests/API.FunctionalTests/TestHttpTransportWithAccessToken.cs index 42072f73..a5d96fff 100644 --- a/tests/API.FunctionalTests/TestHttpTransport.cs +++ b/tests/API.FunctionalTests/TestHttpTransportWithAccessToken.cs @@ -1,26 +1,26 @@ using System.Net.Http.Headers; using System.Net.Http.Json; -using System.Threading; -using System.Threading.Tasks; using Fossa.API.Web; using Fossa.Bridge.Models.ApiModels; using Fossa.Bridge.Services; +using Microsoft.AspNetCore.Authentication.JwtBearer; namespace Fossa.API.FunctionalTests; -public class TestHttpTransport : IHttpTransport +public class TestHttpTransportWithAccessToken : IHttpTransport, IAccessTokenProvider, IAccessTokenContext { private readonly HttpClient _httpClient; + private Option _accessToken; - public TestHttpTransport(CustomWebApplicationFactory factory) + public TestHttpTransportWithAccessToken(CustomWebApplicationFactory factory) { ArgumentNullException.ThrowIfNull(factory); _httpClient = factory.CreateClient(); } - public void SetAuthorizationToken(string scheme, string parameter) + public void ClearAccessToken() { - _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(scheme, parameter); + _accessToken = None; } public async Task DeleteAsync( @@ -29,6 +29,7 @@ public async Task DeleteAsync( CancellationToken cancellationToken) { var requestUri = NormalizeRequestUri(endpointUrl); + ApplyAccessToken(endpointSecurity); var response = await _httpClient.DeleteAsync(requestUri, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -45,6 +46,7 @@ public async Task> GetAsync( where TResponse : class { var requestUri = NormalizeRequestUri(endpointUrl); + ApplyAccessToken(endpointSecurity); var response = await _httpClient.GetAsync(requestUri, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -55,7 +57,13 @@ public async Task> GetAsync( return ClientResult.NewSuccess(result ?? throw new InvalidOperationException("Response content is null.")); } - public async Task PostAsync( + public Task GetTokenAsync(CancellationToken cancellationToken) + => _accessToken.Match( + token => Task.FromResult(token), + () => throw new InvalidOperationException("Access token is not available.") + ); + + public async Task PatchAsync( string endpointUrl, EndpointSecurity endpointSecurity, TRequest request, @@ -63,7 +71,8 @@ public async Task PostAsync( where TRequest : notnull { var requestUri = NormalizeRequestUri(endpointUrl); - var response = await _httpClient.PostAsJsonAsync(requestUri, request, cancellationToken); + ApplyAccessToken(endpointSecurity); + var response = await _httpClient.PatchAsJsonAsync(requestUri, request, cancellationToken); if (!response.IsSuccessStatusCode) { return ClientUnitResult.NewFailure(await ReadProblemDetailsAsync(response, cancellationToken)); @@ -72,7 +81,7 @@ public async Task PostAsync( return ClientUnitResult.Success; } - public async Task PatchAsync( + public async Task PostAsync( string endpointUrl, EndpointSecurity endpointSecurity, TRequest request, @@ -80,7 +89,8 @@ public async Task PatchAsync( where TRequest : notnull { var requestUri = NormalizeRequestUri(endpointUrl); - var response = await _httpClient.PatchAsJsonAsync(requestUri, request, cancellationToken); + ApplyAccessToken(endpointSecurity); + var response = await _httpClient.PostAsJsonAsync(requestUri, request, cancellationToken); if (!response.IsSuccessStatusCode) { return ClientUnitResult.NewFailure(await ReadProblemDetailsAsync(response, cancellationToken)); @@ -97,6 +107,7 @@ public async Task PutAsync( where TRequest : notnull { var requestUri = NormalizeRequestUri(endpointUrl); + ApplyAccessToken(endpointSecurity); var response = await _httpClient.PutAsJsonAsync(requestUri, request, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -106,6 +117,12 @@ public async Task PutAsync( return ClientUnitResult.Success; } + public void SetAccessToken(string accessToken) + { + ArgumentException.ThrowIfNullOrWhiteSpace(accessToken); + _accessToken = Some(accessToken); + } + private static string NormalizeRequestUri(string endpointUrl) => endpointUrl.StartsWith('/') ? endpointUrl : "/" + endpointUrl; @@ -114,4 +131,11 @@ private static async Task ReadProblemDetailsAsync( CancellationToken cancellationToken) => await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken) ?? throw new InvalidOperationException("Problem details response content is null."); + + private void ApplyAccessToken(EndpointSecurity endpointSecurity) + { + var endpointAccessToken = endpointSecurity.IsRequireToken ? _accessToken : None; + endpointAccessToken.IfSome(token => _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(JwtBearerDefaults.AuthenticationScheme, token)); + endpointAccessToken.IfNone(() => _httpClient.DefaultRequestHeaders.Authorization = null); + } } diff --git a/tests/API.IntegrationTests/API.IntegrationTests.csproj b/tests/API.IntegrationTests/API.IntegrationTests.csproj index 284c6b15..ce7453af 100644 --- a/tests/API.IntegrationTests/API.IntegrationTests.csproj +++ b/tests/API.IntegrationTests/API.IntegrationTests.csproj @@ -44,4 +44,4 @@ - + \ No newline at end of file