Files
tiku-backend.net/Tiku.IntegrationTests/Api/PlatformAdminStaticEndpointTests.cs

118 lines
7.2 KiB
C#

using System.Net;
namespace Tiku.IntegrationTests.Api;
public sealed class PlatformAdminStaticEndpointTests
{
[Fact]
public async Task Platform_admin_static_shell_is_served_without_api_authentication()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
var response = await client.GetAsync("/platform-admin/");
var body = await response.Content.ReadAsStringAsync();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Contains("恭学题库 SaaS · 平台管理", body, StringComparison.Ordinal);
Assert.Contains("./platform-api.js", body, StringComparison.Ordinal);
Assert.Contains("./platform-auth.js", body, StringComparison.Ordinal);
Assert.Contains("platformAuthGate", body, StringComparison.Ordinal);
}
[Fact]
public async Task Platform_admin_short_path_redirects_to_static_shell_directory()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient(new()
{
AllowAutoRedirect = false
});
var response = await client.GetAsync("/platform-admin");
Assert.Equal(HttpStatusCode.MovedPermanently, response.StatusCode);
Assert.Equal("/platform-admin/", response.Headers.Location?.AbsolutePath);
}
[Fact]
public async Task Platform_admin_runtime_uses_real_api_without_mock_fallback()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
var runtime = await client.GetStringAsync("/platform-admin/runtime-config.js");
var authentication = await client.GetStringAsync("/platform-admin/platform-auth.js");
Assert.Contains("mode: 'api'", runtime, StringComparison.Ordinal);
Assert.Contains("fallbackToMock: false", runtime, StringComparison.Ordinal);
Assert.Contains("/api/auth/login/password", authentication, StringComparison.Ordinal);
Assert.Contains("/api/auth/password/change-required", authentication, StringComparison.Ordinal);
Assert.DoesNotContain("/api/auth/mfa", authentication, StringComparison.Ordinal);
}
[Fact]
public async Task Platform_admin_shell_covers_current_platform_capabilities_and_dto_fields()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
var application = await client.GetStringAsync("/platform-admin/app.js");
var api = await client.GetStringAsync("/platform-admin/platform-api.js");
var contract = await client.GetStringAsync("/platform-admin/spec-contract.js");
Assert.Contains("租户域名与证书", application, StringComparison.Ordinal);
Assert.Contains("SaaS 商品与版本", application, StringComparison.Ordinal);
Assert.Contains("SaaS 订单与交易", application, StringComparison.Ordinal);
Assert.Contains("平台角色与功能", application, StringComparison.Ordinal);
Assert.Contains("function businessStatusLabel(value)", application, StringComparison.Ordinal);
Assert.Contains("function backendStatusLabel()", application, StringComparison.Ordinal);
Assert.DoesNotContain("业务功能名称和中文说明", application, StringComparison.Ordinal);
Assert.DoesNotContain("中文说明", application, StringComparison.Ordinal);
Assert.DoesNotContain("API 契约", application, StringComparison.Ordinal);
Assert.Contains("/api/backoffice/platform/bootstrap", contract, StringComparison.Ordinal);
Assert.Contains("/api/platform-admin/payment-settings/channels", contract, StringComparison.Ordinal);
Assert.Contains("/api/platform-admin/tenant-capabilities/crm/logs", contract, StringComparison.Ordinal);
Assert.Contains("userId: input.userId", api, StringComparison.Ordinal);
Assert.Contains("roleIds: input.roleIds", api, StringComparison.Ordinal);
Assert.Contains("resolutionNote: input.resolutionNote", api, StringComparison.Ordinal);
Assert.Contains("platformPermissionLabels[item.code]", api, StringComparison.Ordinal);
Assert.Contains("'platform:role:manage': '管理平台角色与权限'", api, StringComparison.Ordinal);
Assert.DoesNotContain("authUserId: input.authUserId", api, StringComparison.Ordinal);
Assert.DoesNotContain("platformPermissions:", api, StringComparison.Ordinal);
Assert.DoesNotContain("staffId: input.staffId", api, StringComparison.Ordinal);
}
[Fact]
public async Task Platform_question_bank_workspace_loads_cache_busted_scripts_and_real_api_bindings()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
var shell = await client.GetStringAsync("/platform-admin/");
var application = await client.GetStringAsync("/platform-admin/app.js");
var api = await client.GetStringAsync("/platform-admin/platform-api.js");
var contract = await client.GetStringAsync("/platform-admin/spec-contract.js");
Assert.Contains("app.js?v=20260730-question-bank1", shell, StringComparison.Ordinal);
Assert.Contains("platform-api.js?v=20260730-question-bank1", shell, StringComparison.Ordinal);
Assert.Contains("spec-contract.js?v=20260730-question-bank1", shell, StringComparison.Ordinal);
Assert.Contains("operationId: 'PlatformQuestionBanksController_upsertBank'", application, StringComparison.Ordinal);
Assert.Contains("operationId: 'PlatformQuestionBanksController_upsertNode'", application, StringComparison.Ordinal);
Assert.Contains("operationId: 'PlatformQuestionBanksController_upsertQuestion'", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_archiveQuestions", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_archiveNode", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_archiveBank", application, StringComparison.Ordinal);
Assert.Contains("data-action=\"shift-bank-node\"", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_signAssetUpload", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_confirmAssetUpload", application, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_upsertBank(input)", api, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_upsertQuestion(input)", api, StringComparison.Ordinal);
Assert.Contains("PlatformQuestionBanksController_executeImport(input)", api, StringComparison.Ordinal);
Assert.Contains("['P-09', 'PlatformQuestionBanksController_upsertBank', 'PUT', '/api/platform-admin/question-banks']", contract, StringComparison.Ordinal);
Assert.Contains("['P-09', 'PlatformQuestionBanksController_executeImport', 'POST', '/api/platform-admin/question-banks/imports']", contract, StringComparison.Ordinal);
Assert.DoesNotContain("question_bank:grant", application, StringComparison.Ordinal);
Assert.DoesNotContain("question_bank:ops", application, StringComparison.Ordinal);
}
}