Add admin database download

This commit is contained in:
2026-04-01 22:25:43 +02:00
parent 637a2ef7ac
commit b062ad1adf
10 changed files with 132 additions and 7 deletions

View File

@@ -1,3 +1,5 @@
using System.Text;
namespace RpgRoller.Tests;
public sealed class CampaignApiTests : ApiTestBase
@@ -160,6 +162,40 @@ public sealed class CampaignApiTests : ApiTestBase
Assert.Contains(usersAfterDelete, user => user.Id == gm.Id);
}
[Fact]
public async Task AdminDatabaseDownload_RequiresAdminAndReturnsSqliteFile()
{
using var factory = CreateFactory();
using var anonymousClient = factory.CreateClient(new() { AllowAutoRedirect = false });
using var adminClient = factory.CreateClient(new() { AllowAutoRedirect = false });
using var memberClient = factory.CreateClient(new() { AllowAutoRedirect = false });
await RegisterAsync(adminClient, "admin-download", "Password123", "Admin Download");
await LoginAsync(adminClient, "admin-download", "Password123");
await RegisterAsync(memberClient, "member-download", "Password123", "Member Download");
await LoginAsync(memberClient, "member-download", "Password123");
var unauthorized = await anonymousClient.GetAsync("/api/admin/database");
Assert.Equal(HttpStatusCode.Unauthorized, unauthorized.StatusCode);
var forbidden = await memberClient.GetAsync("/api/admin/database");
Assert.Equal(HttpStatusCode.BadRequest, forbidden.StatusCode);
var response = await adminClient.GetAsync("/api/admin/database");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("application/octet-stream", response.Content.Headers.ContentType?.MediaType);
var disposition = response.Content.Headers.ContentDisposition;
Assert.NotNull(disposition);
Assert.Equal("attachment", disposition.DispositionType);
Assert.EndsWith(".db", disposition.FileName?.Trim('"'), StringComparison.OrdinalIgnoreCase);
var bytes = await response.Content.ReadAsByteArrayAsync();
Assert.True(bytes.Length >= 16);
Assert.Equal("SQLite format 3\0", Encoding.ASCII.GetString(bytes, 0, 16));
}
[Fact]
public async Task CampaignOptionsEndpoint_ReturnsCampaignsBeyondVisibleCampaignList()
{