You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.3 KiB
168 lines
4.3 KiB
import { describe, expect, mock, test } from "bun:test";
|
|
|
|
const defaultPostsPreview = {
|
|
items: [
|
|
{ slug: "p1", title: "post-1" },
|
|
{ slug: "p2", title: "post-2" },
|
|
{ slug: "p3", title: "post-3" },
|
|
],
|
|
total: 3,
|
|
};
|
|
|
|
const defaultTimelinePreview = {
|
|
items: [
|
|
{ id: 1, title: "timeline-1" },
|
|
{ id: 2, title: "timeline-2" },
|
|
{ id: 3, title: "timeline-3" },
|
|
],
|
|
total: 9,
|
|
};
|
|
|
|
const defaultRssPreview = {
|
|
items: [
|
|
{ id: 10, title: "rss-1" },
|
|
{ id: 11, title: "rss-2" },
|
|
{ id: 12, title: "rss-3" },
|
|
],
|
|
total: 12,
|
|
};
|
|
|
|
const getPublicPostsPreviewBySlug = mock(async () => defaultPostsPreview);
|
|
const getPublicTimelinePreviewBySlug = mock(async () => defaultTimelinePreview);
|
|
const getPublicRssPreviewBySlug = mock(async () => defaultRssPreview);
|
|
const unusedPageMock = async () => {
|
|
throw new Error("page service should not be called in public-hub tests");
|
|
};
|
|
|
|
mock.module("#server/service/posts", () => ({
|
|
getPublicPostsPreviewBySlug,
|
|
getPublicPostsPageBySlug: unusedPageMock,
|
|
}));
|
|
|
|
mock.module("#server/service/timeline", () => ({
|
|
getPublicTimelinePreviewBySlug,
|
|
getPublicTimelinePageBySlug: unusedPageMock,
|
|
}));
|
|
|
|
mock.module("#server/service/rss", () => ({
|
|
getPublicRssPreviewBySlug,
|
|
getPublicRssPageBySlug: unusedPageMock,
|
|
}));
|
|
|
|
const { getPublicHubBySlug } = await import("./index");
|
|
|
|
describe("public hub service", () => {
|
|
test("items 少于 2 时保持原样", async () => {
|
|
getPublicPostsPreviewBySlug.mockResolvedValueOnce({
|
|
items: [{ slug: "only-post", title: "post-only" }],
|
|
total: 1,
|
|
});
|
|
getPublicTimelinePreviewBySlug.mockResolvedValueOnce({
|
|
items: [{ id: 100, title: "timeline-only" }],
|
|
total: 1,
|
|
});
|
|
getPublicRssPreviewBySlug.mockResolvedValueOnce({
|
|
items: [{ id: 200, title: "rss-only" }],
|
|
total: 1,
|
|
});
|
|
|
|
const result = await getPublicHubBySlug("short-list-user");
|
|
|
|
expect(result).toEqual({
|
|
modules: {
|
|
posts: {
|
|
items: [{ slug: "only-post", title: "post-only" }],
|
|
total: 1,
|
|
},
|
|
timeline: {
|
|
items: [{ id: 100, title: "timeline-only" }],
|
|
total: 1,
|
|
},
|
|
reading: {
|
|
items: [{ id: 200, title: "rss-only" }],
|
|
total: 1,
|
|
},
|
|
},
|
|
posts: {
|
|
items: [{ slug: "only-post", title: "post-only" }],
|
|
total: 1,
|
|
},
|
|
timeline: {
|
|
items: [{ id: 100, title: "timeline-only" }],
|
|
total: 1,
|
|
},
|
|
rssItems: {
|
|
items: [{ id: 200, title: "rss-only" }],
|
|
total: 1,
|
|
},
|
|
});
|
|
});
|
|
|
|
test("聚合 posts/timeline/reading 的预览与 total,且预览上限 2", async () => {
|
|
const result = await getPublicHubBySlug("demo-user");
|
|
|
|
expect(getPublicPostsPreviewBySlug).toHaveBeenCalledWith("demo-user");
|
|
expect(getPublicTimelinePreviewBySlug).toHaveBeenCalledWith("demo-user");
|
|
expect(getPublicRssPreviewBySlug).toHaveBeenCalledWith("demo-user");
|
|
|
|
expect(result).toEqual({
|
|
modules: {
|
|
posts: {
|
|
items: [
|
|
{ slug: "p1", title: "post-1" },
|
|
{ slug: "p2", title: "post-2" },
|
|
],
|
|
total: 3,
|
|
},
|
|
timeline: {
|
|
items: [
|
|
{ id: 1, title: "timeline-1" },
|
|
{ id: 2, title: "timeline-2" },
|
|
],
|
|
total: 9,
|
|
},
|
|
reading: {
|
|
items: [
|
|
{ id: 10, title: "rss-1" },
|
|
{ id: 11, title: "rss-2" },
|
|
],
|
|
total: 12,
|
|
},
|
|
},
|
|
posts: {
|
|
items: [
|
|
{ slug: "p1", title: "post-1" },
|
|
{ slug: "p2", title: "post-2" },
|
|
{ slug: "p3", title: "post-3" },
|
|
],
|
|
total: 3,
|
|
},
|
|
timeline: {
|
|
items: [
|
|
{ id: 1, title: "timeline-1" },
|
|
{ id: 2, title: "timeline-2" },
|
|
{ id: 3, title: "timeline-3" },
|
|
],
|
|
total: 9,
|
|
},
|
|
rssItems: {
|
|
items: [
|
|
{ id: 10, title: "rss-1" },
|
|
{ id: 11, title: "rss-2" },
|
|
{ id: 12, title: "rss-3" },
|
|
],
|
|
total: 12,
|
|
},
|
|
});
|
|
});
|
|
|
|
test("任一依赖 reject 时函数整体 reject", async () => {
|
|
getPublicTimelinePreviewBySlug.mockRejectedValueOnce(
|
|
new Error("timeline service failed"),
|
|
);
|
|
|
|
await expect(getPublicHubBySlug("failing-user")).rejects.toThrow(
|
|
"timeline service failed",
|
|
);
|
|
});
|
|
});
|
|
|