- Updated docker-compose.yml to include environment variables and health checks for the app service. - Modified Dockerfile to install curl for health checks and adjusted the build process for backend services. - Improved user notification handling in activation, blocking, and config revocation commands by integrating Telegram notifications. - Added new test cases to validate the updated command handlers and Telegram notifier functionality. - Enhanced documentation to reflect the new Telegram bot features and user management improvements.
77 lines
3.4 KiB
C#
77 lines
3.4 KiB
C#
using System.Net;
|
|
using PnvPanel.IntegrationTests.TestSupport;
|
|
using Xunit;
|
|
using static PnvPanel.IntegrationTests.TestSupport.AuthTestHelper;
|
|
|
|
namespace PnvPanel.IntegrationTests.Activation;
|
|
|
|
[Collection(IntegrationTestCollection.Name)]
|
|
public class ActivationFlowTests(PnvPanelWebApplicationFactory factory)
|
|
{
|
|
private sealed record ActivationRequestResponse(Guid Id, string? Comment, DateTimeOffset CreatedAt);
|
|
|
|
[Fact]
|
|
public async Task RequestThenAdminApprove_ActivatesUser()
|
|
{
|
|
using var userClient = factory.CreateClient();
|
|
var userName = $"dave_{Guid.NewGuid():N}"[..20];
|
|
var (userId, userToken) = await RegisterAndLoginAsync(userClient, userName, "P@ssw0rd123");
|
|
userClient.UseBearerToken(userToken);
|
|
|
|
var requestResponse = await userClient.PostJsonAsync("/api/activation/request", new { comment = "Please activate me" });
|
|
Assert.Equal(HttpStatusCode.OK, requestResponse.StatusCode);
|
|
var request = await requestResponse.ReadAsAsync<ActivationRequestResponse>();
|
|
Assert.NotNull(request);
|
|
|
|
using var adminClient = factory.CreateClient();
|
|
var adminToken = await LoginAsAdminAsync(adminClient);
|
|
adminClient.UseBearerToken(adminToken);
|
|
|
|
var approveResponse = await adminClient.PostAsync($"/api/admin/activation-requests/{request!.Id}/approve", content: null);
|
|
Assert.Equal(HttpStatusCode.NoContent, approveResponse.StatusCode);
|
|
|
|
var meResponse = await userClient.GetAsync("/api/auth/me");
|
|
var me = await meResponse.ReadAsAsync<CurrentUserResponse>();
|
|
Assert.True(me!.IsActivated);
|
|
Assert.Equal(userId, me.Id);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task RequestThenAdminReject_KeepsUserNotActivated()
|
|
{
|
|
using var userClient = factory.CreateClient();
|
|
var userName = $"erin_{Guid.NewGuid():N}"[..20];
|
|
var (_, userToken) = await RegisterAndLoginAsync(userClient, userName, "P@ssw0rd123");
|
|
userClient.UseBearerToken(userToken);
|
|
|
|
var requestResponse = await userClient.PostJsonAsync("/api/activation/request", new { comment = (string?)null });
|
|
var request = await requestResponse.ReadAsAsync<ActivationRequestResponse>();
|
|
|
|
using var adminClient = factory.CreateClient();
|
|
var adminToken = await LoginAsAdminAsync(adminClient);
|
|
adminClient.UseBearerToken(adminToken);
|
|
|
|
var rejectResponse = await adminClient.PostJsonAsync($"/api/admin/activation-requests/{request!.Id}/reject", new { reason = "not enough info" });
|
|
Assert.Equal(HttpStatusCode.NoContent, rejectResponse.StatusCode);
|
|
|
|
var meResponse = await userClient.GetAsync("/api/auth/me");
|
|
var me = await meResponse.ReadAsAsync<CurrentUserResponse>();
|
|
Assert.False(me!.IsActivated);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Request_WhenAlreadyPending_ReturnsConflict()
|
|
{
|
|
using var userClient = factory.CreateClient();
|
|
var userName = $"frank_{Guid.NewGuid():N}"[..20];
|
|
var (_, userToken) = await RegisterAndLoginAsync(userClient, userName, "P@ssw0rd123");
|
|
userClient.UseBearerToken(userToken);
|
|
|
|
var first = await userClient.PostJsonAsync("/api/activation/request", new { comment = (string?)null });
|
|
Assert.Equal(HttpStatusCode.OK, first.StatusCode);
|
|
|
|
var second = await userClient.PostJsonAsync("/api/activation/request", new { comment = (string?)null });
|
|
Assert.Equal(HttpStatusCode.Conflict, second.StatusCode);
|
|
}
|
|
}
|