feat: add asset and video readonly endpoints
This commit is contained in:
212
Tiku.IntegrationTests/Api/AssetEndpointTests.cs
Normal file
212
Tiku.IntegrationTests/Api/AssetEndpointTests.cs
Normal file
@@ -0,0 +1,212 @@
|
||||
using System.Net;
|
||||
using System.Text.Json;
|
||||
using Tiku.Domain.Common;
|
||||
using Tiku.Domain.Content;
|
||||
using Tiku.Domain.Tenancy;
|
||||
|
||||
namespace Tiku.IntegrationTests.Api;
|
||||
|
||||
public sealed class AssetEndpointTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Content_assets_return_public_active_assets_by_default()
|
||||
{
|
||||
var tenantId = Guid.NewGuid();
|
||||
var regionId = Guid.NewGuid();
|
||||
await using var factory = new ApiTestFactory();
|
||||
await factory.SeedAsync(
|
||||
Tenant(tenantId, "master"),
|
||||
new ContentAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
RegionId = regionId,
|
||||
Title = "公开讲义",
|
||||
FileName = "handbook.pdf",
|
||||
AssetType = ContentAssetType.Pdf,
|
||||
StorageProvider = AssetStorageProvider.AliyunOss,
|
||||
Bucket = "tiku-assets",
|
||||
ObjectKey = $"{tenantId:N}/handbook.pdf",
|
||||
MimeType = "application/pdf",
|
||||
Visibility = ContentVisibility.Public,
|
||||
Status = ContentStatus.Active,
|
||||
SortOrder = 2
|
||||
},
|
||||
new ContentAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
RegionId = regionId,
|
||||
Title = "会员讲义",
|
||||
Visibility = ContentVisibility.Members,
|
||||
Status = ContentStatus.Active,
|
||||
SortOrder = 1
|
||||
},
|
||||
new ContentAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
RegionId = regionId,
|
||||
Title = "归档讲义",
|
||||
Visibility = ContentVisibility.Public,
|
||||
Status = ContentStatus.Archived
|
||||
});
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var response = await client.GetAsync($"/api/catalog/content-assets?tenantCode=master®ionId={regionId}&assetType=pdf");
|
||||
var items = await ReadItemsAsync(response);
|
||||
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
var item = Assert.Single(items);
|
||||
Assert.Equal("公开讲义", item.GetProperty("title").GetString());
|
||||
Assert.Equal("AliyunOss", item.GetProperty("storageProvider").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Content_assets_can_include_locked_catalog_items_when_requested()
|
||||
{
|
||||
var tenantId = Guid.NewGuid();
|
||||
await using var factory = new ApiTestFactory();
|
||||
await factory.SeedAsync(
|
||||
Tenant(tenantId, "master"),
|
||||
new ContentAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
Title = "会员讲义",
|
||||
Visibility = ContentVisibility.Members,
|
||||
Status = ContentStatus.Active
|
||||
});
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var response = await client.GetAsync("/api/catalog/content-assets?tenantCode=master&includeLocked=true");
|
||||
var items = await ReadItemsAsync(response);
|
||||
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
Assert.Equal("会员讲义", Assert.Single(items).GetProperty("title").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Images_filter_private_items_until_include_locked()
|
||||
{
|
||||
var tenantId = Guid.NewGuid();
|
||||
await using var factory = new ApiTestFactory();
|
||||
await factory.SeedAsync(
|
||||
Tenant(tenantId, "master"),
|
||||
new ImageAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
Title = "公开图",
|
||||
Category = "banner",
|
||||
IsPublic = true
|
||||
},
|
||||
new ImageAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
Title = "内部图",
|
||||
Category = "banner",
|
||||
IsPublic = false
|
||||
});
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var publicResponse = await client.GetAsync("/api/catalog/images?tenantCode=master&category=banner");
|
||||
using var lockedResponse = await client.GetAsync("/api/catalog/images?tenantCode=master&category=banner&includeLocked=true");
|
||||
|
||||
Assert.Equal(["公开图"], (await ReadItemsAsync(publicResponse)).Select(item => item.GetProperty("title").GetString()!).ToArray());
|
||||
var lockedTitles = (await ReadItemsAsync(lockedResponse))
|
||||
.Select(item => item.GetProperty("title").GetString()!)
|
||||
.ToArray();
|
||||
Assert.Equal(2, lockedTitles.Length);
|
||||
Assert.Contains("内部图", lockedTitles);
|
||||
Assert.Contains("公开图", lockedTitles);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task App_assets_support_asset_key_lookup()
|
||||
{
|
||||
var tenantId = Guid.NewGuid();
|
||||
await using var factory = new ApiTestFactory();
|
||||
await factory.SeedAsync(
|
||||
Tenant(tenantId, "master"),
|
||||
new AppAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
AssetKey = "logo",
|
||||
FileName = "logo.png"
|
||||
},
|
||||
new AppAsset
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
AssetKey = "icon",
|
||||
FileName = "icon.png"
|
||||
});
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var response = await client.GetAsync("/api/catalog/app-assets?tenantCode=master&assetKey=logo");
|
||||
var item = Assert.Single(await ReadItemsAsync(response));
|
||||
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
Assert.Equal("logo", item.GetProperty("assetKey").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Question_videos_include_video_explanation_summary()
|
||||
{
|
||||
var tenantId = Guid.NewGuid();
|
||||
var questionId = Guid.NewGuid();
|
||||
var videoId = Guid.NewGuid();
|
||||
await using var factory = new ApiTestFactory();
|
||||
await factory.SeedAsync(
|
||||
Tenant(tenantId, "master"),
|
||||
new VideoExplanation
|
||||
{
|
||||
Id = videoId,
|
||||
TenantId = tenantId,
|
||||
Title = "解题视频",
|
||||
IsActive = true,
|
||||
SortOrder = 1
|
||||
},
|
||||
new QuestionVideo
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
TenantId = tenantId,
|
||||
QuestionId = questionId,
|
||||
VideoId = videoId,
|
||||
VideoType = QuestionVideoType.Specific
|
||||
});
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var response = await client.GetAsync($"/api/catalog/question-videos?tenantCode=master&questionId={questionId}");
|
||||
var item = Assert.Single(await ReadItemsAsync(response));
|
||||
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
Assert.Equal(questionId, item.GetProperty("questionId").GetGuid());
|
||||
Assert.Equal("解题视频", item.GetProperty("video").GetProperty("title").GetString());
|
||||
}
|
||||
|
||||
private static Tenant Tenant(Guid id, string slug)
|
||||
{
|
||||
return new Tenant
|
||||
{
|
||||
Id = id,
|
||||
Slug = slug,
|
||||
Name = slug,
|
||||
Status = TenantStatus.Active,
|
||||
Metadata = JsonDefaults.Object()
|
||||
};
|
||||
}
|
||||
|
||||
private static async Task<JsonElement[]> ReadItemsAsync(HttpResponseMessage response)
|
||||
{
|
||||
var body = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
|
||||
return body.RootElement
|
||||
.GetProperty("items")
|
||||
.EnumerateArray()
|
||||
.Select(item => item.Clone())
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user