x
This commit is contained in:
1 parent
bd8f5882e0
commit
e509e3f0a2
8 files changed
+581
-12
No files matched your search
@@ -17,6 +17,7 @@ const websiteBlockTypes = [
|
||||
"BANNER",
|
||||
"HERO_ARTICLE",
|
||||
"RICH_TEXT",
|
||||
"ARTICLE_MEDIA",
|
||||
"SCENT_NOTES_BREAKDOWN",
|
||||
"QUOTE_CALLOUT",
|
||||
"PRODUCT_CAROUSEL",
|
||||
@@ -67,6 +68,20 @@ describe("Page Builder block contracts", () => {
|
||||
});
|
||||
});
|
||||
|
||||
test("ARTICLE_MEDIA requires imageAlt when imageUrl is provided", () => {
|
||||
const result = validatePayloadAgainstMetadata("ARTICLE_MEDIA", {
|
||||
body: { th: "ข้อความภาษาไทย" },
|
||||
imageUrl: "/uploads/article.jpg",
|
||||
});
|
||||
|
||||
expect(result.valid).toBe(false);
|
||||
expect(result.validationIssues).toContainEqual({
|
||||
path: "imageAlt",
|
||||
message: "imageAlt is required when imageUrl is provided",
|
||||
code: "custom",
|
||||
});
|
||||
});
|
||||
|
||||
test("create_page_with_section rejects invalid payloads without calling backend", async () => {
|
||||
let postCalls = 0;
|
||||
const api = {
|
||||
@@ -133,4 +148,78 @@ describe("Page Builder block contracts", () => {
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
test("add_page_section rejects invalid payloads without calling backend", async () => {
|
||||
let postCalls = 0;
|
||||
const api = {
|
||||
post: async () => {
|
||||
postCalls += 1;
|
||||
throw new Error("Backend must not be called");
|
||||
},
|
||||
} as any;
|
||||
|
||||
const result = await handleSectionTool(api, "add_page_section", {
|
||||
pageId: 15,
|
||||
type: "HERO_V2",
|
||||
payload: {},
|
||||
});
|
||||
|
||||
expect(result && "isError" in result ? result.isError : false).toBe(true);
|
||||
expect(postCalls).toBe(0);
|
||||
});
|
||||
|
||||
test("add_page_section uses the existing-page endpoint and returns compact output", async () => {
|
||||
const calls: Array<{ url: string; payload: unknown }> = [];
|
||||
const api = {
|
||||
post: async (url: string, payload: unknown) => {
|
||||
calls.push({ url, payload });
|
||||
return {
|
||||
data: {
|
||||
success: true,
|
||||
pageId: 15,
|
||||
pageSlug: "fine-blanking-ddc-3-in-1",
|
||||
sectionId: 36,
|
||||
section: { id: 36, type: "HERO_ARTICLE", order: 2 },
|
||||
},
|
||||
};
|
||||
},
|
||||
} as any;
|
||||
const payload = getPageBlockSchema("HERO_ARTICLE").recommendedPayload;
|
||||
|
||||
const result = await handleSectionTool(api, "add_page_section", {
|
||||
pageId: 15,
|
||||
pageSlug: "fine-blanking-ddc-3-in-1",
|
||||
type: "HERO_ARTICLE",
|
||||
payload,
|
||||
order: 2,
|
||||
});
|
||||
const response = JSON.parse(result?.content[0]?.text ?? "{}");
|
||||
|
||||
expect(calls).toEqual([{
|
||||
url: "/pages/15/sections",
|
||||
payload: {
|
||||
type: "HERO_ARTICLE",
|
||||
payload,
|
||||
isActive: true,
|
||||
order: 2,
|
||||
},
|
||||
}]);
|
||||
expect(response).toEqual({
|
||||
success: true,
|
||||
tool: "add_page_section",
|
||||
pageId: 15,
|
||||
pageSlug: "fine-blanking-ddc-3-in-1",
|
||||
preview: {
|
||||
lang: "th",
|
||||
previewPath: "/th/fine-blanking-ddc-3-in-1",
|
||||
previewUrl: "/th/fine-blanking-ddc-3-in-1",
|
||||
},
|
||||
sectionId: 36,
|
||||
type: "HERO_ARTICLE",
|
||||
order: 2,
|
||||
warnings: [
|
||||
"overlayColor is accepted by backend schema but is not used by apps/website HeroArticleSection today.",
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user