Проверить логин владельца в ответе аудита
Подставка хранилища пользователей умеет FindOwnerLoginsByTenantIdsAsync; тест аудита проверяет userName.
This commit is contained in:
@@ -282,6 +282,7 @@ public sealed class OperatorAuditEndpointsHttpTests
|
|||||||
{
|
{
|
||||||
var tenantId = Guid.NewGuid();
|
var tenantId = Guid.NewGuid();
|
||||||
var auditStore = new TestAuditLogStore();
|
var auditStore = new TestAuditLogStore();
|
||||||
|
var userStore = NewUserStore(tenantId, "owner@acme");
|
||||||
await auditStore.Store.AppendAsync(
|
await auditStore.Store.AppendAsync(
|
||||||
new AuditRecordDto(
|
new AuditRecordDto(
|
||||||
AuditEvents.TenantStatusChanged,
|
AuditEvents.TenantStatusChanged,
|
||||||
@@ -295,7 +296,7 @@ public sealed class OperatorAuditEndpointsHttpTests
|
|||||||
|
|
||||||
await OperatorAuthHttpHost.RunAsync(
|
await OperatorAuthHttpHost.RunAsync(
|
||||||
NewOperatorStore(),
|
NewOperatorStore(),
|
||||||
NewUserStore(),
|
userStore,
|
||||||
async (baseAddress, _, _, _, _, _) =>
|
async (baseAddress, _, _, _, _, _) =>
|
||||||
{
|
{
|
||||||
HttpClient operatorClient = CreateClient(baseAddress);
|
HttpClient operatorClient = CreateClient(baseAddress);
|
||||||
@@ -306,6 +307,7 @@ public sealed class OperatorAuditEndpointsHttpTests
|
|||||||
|
|
||||||
JsonElement item = (await ReadJsonAsync(response)).GetProperty("items")[0];
|
JsonElement item = (await ReadJsonAsync(response)).GetProperty("items")[0];
|
||||||
Assert.Equal(tenantId, item.GetProperty("tenantId").GetGuid());
|
Assert.Equal(tenantId, item.GetProperty("tenantId").GetGuid());
|
||||||
|
Assert.Equal("owner@acme", item.GetProperty("userName").GetString());
|
||||||
Assert.Equal("acme", item.GetProperty("tenantName").GetString());
|
Assert.Equal("acme", item.GetProperty("tenantName").GetString());
|
||||||
JsonElement change = item.GetProperty("changes")[0];
|
JsonElement change = item.GetProperty("changes")[0];
|
||||||
Assert.Equal("status", change.GetProperty("field").GetString());
|
Assert.Equal("status", change.GetProperty("field").GetString());
|
||||||
@@ -346,6 +348,20 @@ public sealed class OperatorAuditEndpointsHttpTests
|
|||||||
return store;
|
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 (изоляция сценариев кук).
|
// HTTP-клиент с собственным CookieContainer (изоляция сценариев кук).
|
||||||
private static HttpClient CreateClient(string baseAddress) =>
|
private static HttpClient CreateClient(string baseAddress) =>
|
||||||
new(new HttpClientHandler { UseCookies = true, CookieContainer = new CookieContainer() })
|
new(new HttpClientHandler { UseCookies = true, CookieContainer = new CookieContainer() })
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ public sealed class TestAuthStore
|
|||||||
.Returns(ci => FindById(ci.ArgAt<Guid>(0)));
|
.Returns(ci => FindById(ci.ArgAt<Guid>(0)));
|
||||||
Store.ListUsersByTenantIdAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>())
|
Store.ListUsersByTenantIdAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>())
|
||||||
.Returns(ci => ListByTenantId(ci.ArgAt<Guid>(0)));
|
.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>()))
|
Store.When(s => s.CreateUserAsync(Arg.Any<StoredUserDto>(), Arg.Any<CancellationToken>()))
|
||||||
.Do(ci =>
|
.Do(ci =>
|
||||||
{
|
{
|
||||||
@@ -113,6 +115,17 @@ public sealed class TestAuthStore
|
|||||||
.ToList();
|
.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)
|
private void UpdatePasswordHash(Guid userId, string passwordHash)
|
||||||
{
|
{
|
||||||
int index = _users.FindIndex(u => u.Id == userId);
|
int index = _users.FindIndex(u => u.Id == userId);
|
||||||
|
|||||||
Reference in New Issue
Block a user