Проверить логин владельца в ответе аудита
Подставка хранилища пользователей умеет FindOwnerLoginsByTenantIdsAsync; тест аудита проверяет userName.
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user