Add admin database download
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -23,6 +23,23 @@ public sealed class HostingCoverageTests
|
||||
Assert.Contains(services, d => d.ServiceType == typeof(IDiceRoller));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddRpgRollerCore_WithFileConnectionString_RegistersResolvedSqliteDatabaseFile()
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
var contentRoot = Path.Combine(Path.GetTempPath(), $"rpgroller-hosting-{Guid.NewGuid():N}");
|
||||
var configuration = new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?> { ["ConnectionStrings:RpgRoller"] = "Data Source=App_Data/rpgroller.db" }).Build();
|
||||
var environment = new TestWebHostEnvironment { ContentRootPath = contentRoot };
|
||||
|
||||
services.AddRpgRollerCore(configuration, environment);
|
||||
|
||||
using var provider = services.BuildServiceProvider();
|
||||
var databaseFile = provider.GetRequiredService<SqliteDatabaseFile>();
|
||||
|
||||
Assert.Equal(Path.Combine(contentRoot, "App_Data", "rpgroller.db"), databaseFile.Path);
|
||||
Assert.True(Directory.Exists(Path.Combine(contentRoot, "App_Data")));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SqliteSchemaUpgrader_MigratesLegacySchema()
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using RpgRoller.Data;
|
||||
using RpgRoller.Hosting;
|
||||
|
||||
namespace RpgRoller.Tests;
|
||||
|
||||
@@ -38,8 +39,10 @@ public abstract class ApiTestBase : IClassFixture<WebApplicationFactory<Program>
|
||||
services.RemoveAll<DbContextOptions<RpgRollerDbContext>>();
|
||||
services.RemoveAll<IDbContextFactory<RpgRollerDbContext>>();
|
||||
services.RemoveAll<RpgRollerDbContext>();
|
||||
services.RemoveAll<SqliteDatabaseFile>();
|
||||
|
||||
var dbPath = Path.Combine(Path.GetTempPath(), $"rpgroller-tests-{Guid.NewGuid():N}.db");
|
||||
services.AddSingleton(new SqliteDatabaseFile(dbPath));
|
||||
services.AddDbContextFactory<RpgRollerDbContext>(options => options.UseSqlite($"Data Source={dbPath}"));
|
||||
}));
|
||||
}
|
||||
@@ -83,4 +86,4 @@ public abstract class ApiTestBase : IClassFixture<WebApplicationFactory<Program>
|
||||
}
|
||||
|
||||
private readonly WebApplicationFactory<Program> m_BaseFactory;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user