Added skoruba user service integration test
This commit is contained in:
@@ -11,7 +11,7 @@ public sealed class AddUserRoleEndpoint : IEndpoint
|
||||
{
|
||||
public void Map(IEndpointRouteBuilder builder)
|
||||
{
|
||||
builder.MapPatch("api/users/{userId:Guid}/roles/{roleId}", async (Guid userId, string roleId, HttpContext context,
|
||||
builder.MapPatch("api/users/{userId:Guid}/roles/{roleId:Guid}", async (Guid userId, Guid roleId, HttpContext context,
|
||||
IUserService userService, CancellationToken cancellationToken = default) =>
|
||||
await userService.AddUserRoleAsync(userId, roleId, context.GetUserId(), cancellationToken) switch
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@ public sealed class DeleteUserRoleEndpoint : IEndpoint
|
||||
{
|
||||
public void Map(IEndpointRouteBuilder builder)
|
||||
{
|
||||
builder.MapDelete("api/users/{userId:Guid}/roles/{roleId}", async (Guid userId, string roleId, HttpContext context,
|
||||
builder.MapDelete("api/users/{userId:Guid}/roles/{roleId:Guid}", async (Guid userId, Guid roleId, HttpContext context,
|
||||
IUserService service, CancellationToken cancellationToken = default) =>
|
||||
await service.DeleteUserRoleAsync(userId, roleId, context.GetUserId(), cancellationToken) switch
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@ public interface IUserService
|
||||
|
||||
[Log]
|
||||
[Audit]
|
||||
Task<Result> AddUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default);
|
||||
Task<Result> AddUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default);
|
||||
|
||||
[Log]
|
||||
[Audit]
|
||||
@@ -57,5 +57,5 @@ public interface IUserService
|
||||
|
||||
[Log]
|
||||
[Audit]
|
||||
Task<Result> DeleteUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default);
|
||||
Task<Result> DeleteUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
@@ -38,9 +38,6 @@ public static class Security
|
||||
client.BaseAddress = new Uri(configuration.GetConnectionString("SkorubaApi")!);
|
||||
}).AddClientCredentialsTokenHandler(ClientCredentialsClientName.Parse(SkorubaCredentialClient));
|
||||
|
||||
services.AddKeyedScoped(SkorubaHttpClient, (provider, key) =>
|
||||
provider.GetRequiredService<IHttpClientFactory>());
|
||||
|
||||
services.AddScoped<AuditInterceptor>();
|
||||
services.AddScoped<LoggingInterceptor>();
|
||||
services.AddSingleton<ProxyGenerator>();
|
||||
|
||||
@@ -14,7 +14,7 @@ public sealed class UserCacheService(UserService service, IDistributedCache cach
|
||||
public async Task<Result> AddUserClaimAsync(AddUserClaimRequest request, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await service.AddUserClaimAsync(request, userId, cancellationToken);
|
||||
|
||||
public async Task<Result> AddUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> AddUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await service.AddUserRoleAsync(targetUserId, roleId, userId, cancellationToken);
|
||||
|
||||
public async Task<Result> CreateUserAsync(string tenantIdHash, string idNumberHash, CreateUserRequest request, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
@@ -23,7 +23,7 @@ public sealed class UserCacheService(UserService service, IDistributedCache cach
|
||||
public async Task<Result> DeleteUserClaimAsync(string claimIdHash, Guid targetUserId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await service.DeleteUserClaimAsync(claimIdHash, targetUserId, userId, cancellationToken);
|
||||
|
||||
public async Task<Result> DeleteUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> DeleteUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await service.DeleteUserRoleAsync(targetUserId, roleId, userId, cancellationToken);
|
||||
|
||||
public async Task<Result<Role[]>> GetSystemRolesAsync(Guid userId, CancellationToken cancellationToken = default) =>
|
||||
|
||||
@@ -164,7 +164,7 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
|
||||
if (defaultRole == null)
|
||||
return Result.Fail(NotFoundError.Create("Role 'Contributor' not found."));
|
||||
|
||||
var roleAssignmentResult = await skorubaService.AddRoleAsync(newUserId, defaultRole.Id, cancellationToken);
|
||||
var roleAssignmentResult = await skorubaService.AddRoleAsync(newUserId, Guid.Parse(defaultRole.Id), cancellationToken);
|
||||
|
||||
if (roleAssignmentResult.IsFailed)
|
||||
return Result.Fail(UpdateError.Create("Failed to assign role to user."));
|
||||
@@ -255,7 +255,7 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
|
||||
await Result.Try((Func<Task<Result<Role[]>>>)(async () =>
|
||||
await skorubaService.GetAvailableRolesAsync(cancellationToken: cancellationToken)));
|
||||
|
||||
public async Task<Result> DeleteUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> DeleteUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
|
||||
@@ -278,7 +278,7 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
|
||||
.CausedBy(addClaimResult.Errors));
|
||||
}));
|
||||
|
||||
public async Task<Result> AddUserRoleAsync(Guid targetUserId, string roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> AddUserRoleAsync(Guid targetUserId, Guid roleId, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var userRolesResult = await skorubaService.GetUserRolesAsync(targetUserId, cancellationToken: cancellationToken);
|
||||
@@ -289,7 +289,7 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
|
||||
|
||||
foreach (var role in userRolesResult.Value)
|
||||
{
|
||||
var deleteRoleResult = await skorubaService.RemoveRoleAsync(targetUserId, role.Id, cancellationToken);
|
||||
var deleteRoleResult = await skorubaService.RemoveRoleAsync(targetUserId, Guid.Parse(role.Id), cancellationToken);
|
||||
|
||||
if (deleteRoleResult.IsFailed)
|
||||
return Result.Fail(UpdateError.Create("Failed to remove existing user role.")
|
||||
@@ -308,7 +308,7 @@ public sealed class UserService(IDbContextFactory<ApplicationDbContext> contextF
|
||||
return Result.Fail(NotFoundError.Create("Failed to retrieve system roles.")
|
||||
.CausedBy(systemRoles.Errors));
|
||||
|
||||
var targetRole = systemRoles.Value.FirstOrDefault(r => r.Id == roleId);
|
||||
var targetRole = systemRoles.Value.FirstOrDefault(r => r.Id == roleId.ToString());
|
||||
|
||||
if (targetRole == null)
|
||||
return Result.Fail(NotFoundError.Create("Role not found."));
|
||||
|
||||
@@ -30,11 +30,11 @@ public interface ISkorubaUserService
|
||||
|
||||
[Log]
|
||||
[Audit]
|
||||
Task<Result> AddRoleAsync(Guid userId, string roleId, CancellationToken cancellationToken = default);
|
||||
Task<Result> AddRoleAsync(Guid userId, Guid roleId, CancellationToken cancellationToken = default);
|
||||
|
||||
[Log]
|
||||
[Audit]
|
||||
Task<Result> RemoveRoleAsync(Guid userId, string roleId, CancellationToken cancellationToken = default);
|
||||
Task<Result> RemoveRoleAsync(Guid userId, Guid roleId, CancellationToken cancellationToken = default);
|
||||
|
||||
[Log]
|
||||
Task<Result<Role[]>> GetAvailableRolesAsync(string? searchText = null, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default);
|
||||
@@ -45,6 +45,9 @@ public interface ISkorubaUserService
|
||||
[Log]
|
||||
Task<Result<Models.Security.Claim[]>> GetUserClaimsAsync(Guid userId, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default);
|
||||
|
||||
[Log]
|
||||
Task<Result<Models.Security.Claim[]>> GetRoleClaimsAsync(Guid roleId, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default);
|
||||
|
||||
[Log]
|
||||
Task<Result> InvalidateUserSessionAsync(Guid userId, CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ using PostFundManagement.Domain.Models.Security;
|
||||
|
||||
namespace PostFundManagement.Infrastructure.Security;
|
||||
|
||||
public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClientFactory httpClientFactory) : ISkorubaUserService
|
||||
public class SkorubaUserService(IHttpClientFactory httpClientFactory) : ISkorubaUserService
|
||||
{
|
||||
public async Task<Result<string>> CreateUserAsync(CreateUserRequest request, Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<string>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var response = await httpClient.PostAsJsonAsync("api/users", request, cancellationToken);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
@@ -24,7 +24,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result<UserResponse>> GetUserAsync(Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<UserResponse>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var result = await httpClient.GetFromJsonAsync<UserResponse>($"api/users/{userId}", cancellationToken);
|
||||
|
||||
return Result.FailIf(result is null, NotFoundError.Create($"User {userId} not found."))
|
||||
@@ -34,7 +34,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result> UpdateUserAsync(UpdateUserRequest request, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var response = await httpClient.PutAsJsonAsync("api/users", request, cancellationToken);
|
||||
|
||||
return Result.OkIf(response.IsSuccessStatusCode, UpdateError.Create("Failed to update user."));
|
||||
@@ -43,7 +43,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result> SetUserLockoutAsync(Guid userId, bool disabled, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var user = await httpClient.GetFromJsonAsync<UpdateUserRequest>($"api/users/{userId}", cancellationToken);
|
||||
|
||||
if (user is null)
|
||||
@@ -63,7 +63,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result> AddClaimAsync(Guid userId, string claimType, string claimValue, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var payload = new { UserId = userId, ClaimType = claimType, ClaimValue = claimValue };
|
||||
|
||||
var response = await httpClient.PostAsJsonAsync($"api/users/{userId}/claims", payload, cancellationToken);
|
||||
@@ -74,7 +74,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result> RemoveClaimAsync(Guid userId, int claimId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var response = await httpClient.DeleteAsync($"api/users/{userId}/claims/{claimId}", cancellationToken);
|
||||
|
||||
return Result.OkIf(response.IsSuccessStatusCode, CreateError.Create("Failed to remove user claim."));
|
||||
@@ -83,7 +83,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result<Claim[]>> GetUserClaimsAsync(Guid userId, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<Claim[]>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
|
||||
var result = await httpClient.GetFromJsonAsync<ClaimsResponse>($"api/users/{userId}/claims?page={page}&pageSize={pageSize}", cancellationToken);
|
||||
|
||||
@@ -91,10 +91,10 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
.ToResult(result?.Claims.ToArray() ?? []);
|
||||
}));
|
||||
|
||||
public async Task<Result> AddRoleAsync(Guid userId, string roleId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> AddRoleAsync(Guid userId, Guid roleId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var payload = new { UserId = userId, RoleId = roleId };
|
||||
|
||||
var response = await httpClient.PostAsJsonAsync($"api/users/{userId}/roles", payload, cancellationToken);
|
||||
@@ -102,10 +102,10 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
return Result.OkIf(response.IsSuccessStatusCode, CreateError.Create("Failed to add user role."));
|
||||
}));
|
||||
|
||||
public async Task<Result> RemoveRoleAsync(Guid userId, string roleId, CancellationToken cancellationToken = default) =>
|
||||
public async Task<Result> RemoveRoleAsync(Guid userId, Guid roleId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var response = await httpClient.DeleteAsync($"api/users/{userId}/roles/{roleId}", cancellationToken);
|
||||
|
||||
return Result.OkIf(response.IsSuccessStatusCode, CreateError.Create("Failed to remove user role."));
|
||||
@@ -114,7 +114,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result<Role[]>> GetUserRolesAsync(Guid userId, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<Role[]>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
|
||||
var result = await httpClient.GetFromJsonAsync<RolesResponse>($"api/users/{userId}/roles?page={page}&pageSize={pageSize}", cancellationToken);
|
||||
|
||||
@@ -122,10 +122,21 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
.ToResult(result?.Roles?.ToArray() ?? []);
|
||||
}));
|
||||
|
||||
public async Task<Result<Claim[]>> GetRoleClaimsAsync(Guid roleId, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<Claim[]>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
|
||||
var result = await httpClient.GetFromJsonAsync<ClaimsResponse>($"api/roles/{roleId}/claims?page={page}&pageSize={pageSize}", cancellationToken);
|
||||
|
||||
return Result.FailIf(result is null, NotFoundError.Create($"Claims for role {roleId} could not be retrieved."))
|
||||
.ToResult(result?.Claims.ToArray() ?? []);
|
||||
}));
|
||||
|
||||
public async Task<Result> InvalidateUserSessionAsync(Guid userId, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
var user = await httpClient.GetFromJsonAsync<UserResponse>($"api/users/{userId}", cancellationToken);
|
||||
|
||||
if (user is null)
|
||||
@@ -139,7 +150,7 @@ public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClie
|
||||
public async Task<Result<Role[]>> GetAvailableRolesAsync(string? searchText = null, int page = 1, int pageSize = 50, CancellationToken cancellationToken = default) =>
|
||||
await Result.Try((Func<Task<Result<Role[]>>>)(async () =>
|
||||
{
|
||||
var httpClient = httpClientFactory.CreateClient();
|
||||
var httpClient = httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
|
||||
var query = $"api/roles?page={page}&pageSize={pageSize}";
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<UserSecretsId>079fcde1-9b10-4402-9624-5f0827b4dbfd</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="appsettings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
<Using Include="Microsoft.Extensions.Configuration" />
|
||||
<Using Include="Microsoft.Extensions.DependencyInjection" />
|
||||
<Using Include="System.Reflection" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PostFundManagement.Application\PostFundManagement.Application.csproj" />
|
||||
<ProjectReference Include="..\PostFundManagement.Infrastructure\PostFundManagement.Infrastructure.csproj" />
|
||||
<ProjectReference Include="..\PostFundManagement.Domain\PostFundManagement.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,109 @@
|
||||
using PostFundManagement.Application.Extensions;
|
||||
using PostFundManagement.Domain.Abstractions;
|
||||
using PostFundManagement.Infrastructure.Database.Services;
|
||||
using System.Diagnostics;
|
||||
using static PostFundManagement.Domain.Extensions.Constants;
|
||||
|
||||
namespace PostFundManagement.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// Integration tests for SkorubaUserService.GetUserRolesAsync method.
|
||||
///
|
||||
/// These tests hit the actual Skoruba API environment.
|
||||
/// Requires the following configuration:
|
||||
/// - MachineIdentitySettings with valid ClientId and ClientSecret from user secrets
|
||||
/// - SkorubaApi connection string pointing to the API endpoint
|
||||
/// - Network access to the Skoruba API
|
||||
///
|
||||
/// To run these tests:
|
||||
/// dotnet test --filter "FullyQualifiedName~SkorubaUserServiceGetUserRolesIntegrationTests"
|
||||
/// </summary>
|
||||
public class SkorubaUserServiceGetUserRolesIntegrationTests
|
||||
{
|
||||
private readonly ISkorubaUserService _skorubaService;
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
|
||||
public SkorubaUserServiceGetUserRolesIntegrationTests()
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
|
||||
// Load configuration from environment and secrets
|
||||
var configuration = new ConfigurationBuilder()
|
||||
.AddJsonFile("appsettings.json", optional: true)
|
||||
.AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true)
|
||||
.AddEnvironmentVariables()
|
||||
.Build();
|
||||
|
||||
services.AddSingleton(configuration);
|
||||
services.AddHttpClient();
|
||||
|
||||
// Register the Skoruba HTTP client with the actual DI configuration
|
||||
services.AddSkorubaApiService(configuration)
|
||||
.AddRegisterServicesWithCaching(configuration)
|
||||
.AddEndpointAndServiceCaching(configuration)
|
||||
.AddSharedServices()
|
||||
.AddHashServices(configuration)
|
||||
.AddApplicationDbContext(configuration)
|
||||
.AddHttpContextAccessor()
|
||||
.AddTransient<ITenantContextService, TenantContextService>();
|
||||
|
||||
var serviceProvider = services.BuildServiceProvider();
|
||||
_skorubaService = serviceProvider.GetRequiredService<ISkorubaUserService>();
|
||||
_httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Integration test: Verify HttpClient is properly configured with SkorubaHttpClient name.
|
||||
/// </summary>
|
||||
//[Fact(Skip = "Skipping integration test")]
|
||||
[Fact]
|
||||
public void HttpClientFactory_HasSkorubaHttpClientConfigured()
|
||||
{
|
||||
// Act
|
||||
var httpClient = _httpClientFactory.CreateClient(SkorubaHttpClient);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(httpClient);
|
||||
Assert.NotNull(httpClient.BaseAddress);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Integration test: Verify that the service properly formats API requests.
|
||||
/// Uses a fake/invalid user ID to test the HTTP request flow.
|
||||
/// </summary>
|
||||
//[Fact(Skip = "Skipping integration test")]
|
||||
[Fact]
|
||||
public async Task GetUserRolesAsync_SendsProperlyFormattedRequest()
|
||||
{
|
||||
// Arrange
|
||||
var userId = Guid.NewGuid();
|
||||
var page = 2;
|
||||
var pageSize = 25;
|
||||
|
||||
// Act - This will likely fail with 401 or 404
|
||||
var result = await _skorubaService.GetUserRolesAsync(userId, page, pageSize);
|
||||
|
||||
// Assert - Request was processed (even if it failed)
|
||||
Assert.False(result.IsSuccess);
|
||||
Assert.NotNull(result.Errors);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Integration test: Verify cancellation token is respected.
|
||||
/// </summary>
|
||||
//[Fact(Skip = "Skipping integration test")]
|
||||
[Fact]
|
||||
public async Task GetUserRolesAsync_RespectsCancellationToken()
|
||||
{
|
||||
// Arrange
|
||||
var userId = Guid.NewGuid();
|
||||
var cts = new CancellationTokenSource();
|
||||
cts.Cancel();
|
||||
|
||||
// Act & Assert
|
||||
await Assert.ThrowsAsync<OperationCanceledException>(async () =>
|
||||
{
|
||||
await _skorubaService.GetUserRolesAsync(userId, cancellationToken: cts.Token);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"EnableServiceCaching": true,
|
||||
"CorsOrigins": [
|
||||
"https://console.ifri.khongisa.co.za",
|
||||
"https://localhost:7208"
|
||||
],
|
||||
"GeneralS3Settings": {
|
||||
"ServiceUrl": "https://s3.garage.khongisa.co.za",
|
||||
"Region": "garage",
|
||||
"BucketName": "pfm",
|
||||
"CdnBaseUrl": "https://pfm.cdn.khongisa.co.za"
|
||||
},
|
||||
"Monitoring": {
|
||||
"Address": "http://aspire-dashboard-service.aspire.svc.cluster.local:18889",
|
||||
"ServiceName": "Pfm.DEV"
|
||||
},
|
||||
"SecuritySettings": {
|
||||
"Authority": "https://sts.security.khongisa.co.za",
|
||||
"Audience": "pfm-api-dev"
|
||||
},
|
||||
"MachineIdentitySettings": {
|
||||
"Authority": "https://sts.security.khongisa.co.za",
|
||||
"Scope": "skoruba_identity_admin_api"
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Warning",
|
||||
"Quartz": "Error",
|
||||
"Microsoft.AspNetCore": "Warning",
|
||||
"Microsoft.EntityFrameworkCore.Database": "Error",
|
||||
"Microsoft.EntityFrameworkCore.Update": "Error"
|
||||
}
|
||||
},
|
||||
"EmailProcessorCron": "0 */5 * * * ?",
|
||||
"Email": {
|
||||
"SmtpServer": "smtp.example.com",
|
||||
"SmtpPort": 587,
|
||||
"SenderEmail": "noreply@example.com",
|
||||
"SenderName": "Example"
|
||||
},
|
||||
"HasherSettings": {
|
||||
"MinHashLength": 11
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -7,6 +7,9 @@
|
||||
<File Path="PostFundManagement.snk" />
|
||||
<File Path="README.md" />
|
||||
</Folder>
|
||||
<Folder Name="/tests/">
|
||||
<Project Path="PostFundManagement.Tests/PostFundManagement.Tests.csproj" Id="ce650d27-8a68-436d-b5c1-db25f2286e85" />
|
||||
</Folder>
|
||||
<Project Path="PostFundManagement.Api/PostFundManagement.Api.csproj" />
|
||||
<Project Path="PostFundManagement.Application/PostFundManagement.Application.csproj" Id="750c7754-53a7-4573-abed-5c436246a04d" />
|
||||
<Project Path="PostFundManagement.Domain/PostFundManagement.Domain.csproj" />
|
||||
|
||||
Reference in New Issue
Block a user