Files
tiku-backend.net/Tiku.IntegrationTests/Api/OpenApiDocumentationTests.cs
xiong 558b2a4ea8
Some checks failed
ci / release-gate (push) Has been cancelled
fix:修复openapi文档错误
2026-08-03 14:34:23 +08:00

92 lines
4.2 KiB
C#

using System.Net;
using System.Text.Json;
namespace Tiku.IntegrationTests.Api;
public sealed class OpenApiDocumentationTests
{
[Fact]
public async Task Openapi_document_can_be_generated_with_key_paths()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
using var response = await client.GetAsync("/openapi/v1.json");
var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.True(document.RootElement.GetProperty("paths").TryGetProperty("/api/tenant/auth/login/password", out _));
Assert.True(document.RootElement.GetProperty("paths").TryGetProperty("/api/public/catalog/regions", out _));
}
[Fact]
public async Task Authentication_operations_are_grouped_by_client_boundary()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
using var response = await client.GetAsync("/openapi/v1.json");
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var paths = document.RootElement.GetProperty("paths");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("平台端-认证", GetOnlyTag(paths, "/api/platform/auth/login/password"));
Assert.Equal("租户端-认证", GetOnlyTag(paths, "/api/tenant/auth/login/password"));
Assert.Equal("学生端-认证", GetOnlyTag(paths, "/api/student/auth/login/password"));
Assert.Equal("租户端-浏览器认证", GetOnlyTag(paths, "/api/tenant/auth/browser/login/password"));
}
[Fact]
public async Task Platform_operation_metadata_prefers_action_permission_and_exposes_risk()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
using var response = await client.GetAsync("/openapi/v1.json");
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var operation = document.RootElement.GetProperty("paths")
.GetProperty("/api/platform/approvals/{requestId}/approve")
.GetProperty("post");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("platform:approval:decide", operation.GetProperty("x-tiku-required-permission").GetString());
Assert.Equal("high", operation.GetProperty("x-tiku-risk-level").GetString());
}
[Fact]
public async Task Openapi_uses_role_scoped_routes_without_legacy_prefixes()
{
await using var factory = new ApiTestFactory();
using var client = factory.CreateClient();
using var response = await client.GetAsync("/openapi/v1.json");
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var paths = document.RootElement.GetProperty("paths").EnumerateObject()
.Select(item => item.Name)
.ToArray();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Contains(paths, path => path.StartsWith("/api/platform/", StringComparison.Ordinal));
Assert.Contains(paths, path => path.StartsWith("/api/tenant/", StringComparison.Ordinal));
Assert.Contains(paths, path => path.StartsWith("/api/student/", StringComparison.Ordinal));
Assert.Contains(paths, path => path.StartsWith("/api/public/", StringComparison.Ordinal));
Assert.Contains(paths, path => path.StartsWith("/api/system/", StringComparison.Ordinal));
Assert.DoesNotContain(paths, path =>
path.StartsWith("/api/platform-admin", StringComparison.Ordinal) ||
path.StartsWith("/api/backoffice/", StringComparison.Ordinal) ||
path.StartsWith("/api/tenant-admin", StringComparison.Ordinal) ||
path.StartsWith("/api/tenant-content", StringComparison.Ordinal) ||
path.StartsWith("/api/tenant-commerce", StringComparison.Ordinal));
}
private static string? GetOnlyTag(JsonElement paths, string path)
{
return paths.GetProperty(path)
.GetProperty("post")
.GetProperty("tags")
.EnumerateArray()
.Single()
.GetString();
}
}