Проверить логин владельца в ответе аудита

Подставка хранилища пользователей умеет FindOwnerLoginsByTenantIdsAsync; тест аудита проверяет userName.
This commit is contained in:
2026-09-13 20:23:19 +03:00
parent a99bb4a713
commit 525759b232
2 changed files with 30 additions and 1 deletions
@@ -282,6 +282,7 @@ public sealed class OperatorAuditEndpointsHttpTests
{
var tenantId = Guid.NewGuid();
var auditStore = new TestAuditLogStore();
var userStore = NewUserStore(tenantId, "owner@acme");
await auditStore.Store.AppendAsync(
new AuditRecordDto(
AuditEvents.TenantStatusChanged,
@@ -295,7 +296,7 @@ public sealed class OperatorAuditEndpointsHttpTests
await OperatorAuthHttpHost.RunAsync(
NewOperatorStore(),
NewUserStore(),
userStore,
async (baseAddress, _, _, _, _, _) =>
{
HttpClient operatorClient = CreateClient(baseAddress);
@@ -306,6 +307,7 @@ public sealed class OperatorAuditEndpointsHttpTests
JsonElement item = (await ReadJsonAsync(response)).GetProperty("items")[0];
Assert.Equal(tenantId, item.GetProperty("tenantId").GetGuid());
Assert.Equal("owner@acme", item.GetProperty("userName").GetString());
Assert.Equal("acme", item.GetProperty("tenantName").GetString());
JsonElement change = item.GetProperty("changes")[0];
Assert.Equal("status", change.GetProperty("field").GetString());
@@ -346,6 +348,20 @@ public sealed class OperatorAuditEndpointsHttpTests
return store;
}
// Фейк-хранилище с одним пользователем заданного тенанта (владелец для разрешения логина).
private static TestAuthStore NewUserStore(Guid tenantId, string login)
{
var passwordHasher = TestHashers.New();
var store = new TestAuthStore();
store.AddUser(new StoredUserDto(
Guid.NewGuid(),
login,
tenantId,
"active",
passwordHasher.Hash(UserPassword)));
return store;
}
// HTTP-клиент с собственным CookieContainer (изоляция сценариев кук).
private static HttpClient CreateClient(string baseAddress) =>
new(new HttpClientHandler { UseCookies = true, CookieContainer = new CookieContainer() })
@@ -50,6 +50,8 @@ public sealed class TestAuthStore
.Returns(ci => FindById(ci.ArgAt<Guid>(0)));
Store.ListUsersByTenantIdAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>())
.Returns(ci => ListByTenantId(ci.ArgAt<Guid>(0)));
Store.FindOwnerLoginsByTenantIdsAsync(Arg.Any<IReadOnlyCollection<Guid>>(), Arg.Any<CancellationToken>())
.Returns(ci => OwnerLogins(ci.ArgAt<IReadOnlyCollection<Guid>>(0)));
Store.When(s => s.CreateUserAsync(Arg.Any<StoredUserDto>(), Arg.Any<CancellationToken>()))
.Do(ci =>
{
@@ -113,6 +115,17 @@ public sealed class TestAuthStore
.ToList();
}
private IReadOnlyDictionary<Guid, string> OwnerLogins(IReadOnlyCollection<Guid> tenantIds)
{
var owners = new Dictionary<Guid, string>();
foreach (StoredUserDto user in _users.Where(u => tenantIds.Contains(u.TenantId)))
{
owners.TryAdd(user.TenantId, user.Login);
}
return owners;
}
private void UpdatePasswordHash(Guid userId, string passwordHash)
{
int index = _users.FindIndex(u => u.Id == userId);