mirror of
https://github.com/JimLiu/baoyu-skills.git
synced 2026-07-12 05:51:44 +08:00
444 lines
14 KiB
TypeScript
444 lines
14 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { extractArticleDocumentFromPayload } from "../adapters/x/article";
|
|
|
|
describe("x article extraction", () => {
|
|
test("renders markdown entities referenced by atomic blocks", () => {
|
|
const payload = {
|
|
data: {
|
|
tweetResult: {
|
|
result: {
|
|
rest_id: "2036762680401223946",
|
|
legacy: {
|
|
full_text: "Fallback text",
|
|
favorite_count: 12,
|
|
retweet_count: 3,
|
|
reply_count: 1,
|
|
created_at: "Wed Mar 25 11:10:38 +0000 2026",
|
|
},
|
|
core: {
|
|
user_results: {
|
|
result: {
|
|
legacy: {
|
|
name: "Eric Zakariasson",
|
|
screen_name: "ericzakariasson",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
article: {
|
|
article_results: {
|
|
result: {
|
|
title: "Building CLIs for agents",
|
|
content_state: {
|
|
blocks: [
|
|
{
|
|
type: "unstyled",
|
|
text: "Make it non-interactive.",
|
|
data: {},
|
|
entityRanges: [],
|
|
inlineStyleRanges: [],
|
|
},
|
|
{
|
|
type: "atomic",
|
|
text: " ",
|
|
data: {},
|
|
entityRanges: [{ key: 0, length: 1, offset: 0 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
{
|
|
type: "unstyled",
|
|
text: "Return data on success.",
|
|
data: {},
|
|
entityRanges: [],
|
|
inlineStyleRanges: [],
|
|
},
|
|
],
|
|
entityMap: [
|
|
{
|
|
key: "0",
|
|
value: {
|
|
type: "MARKDOWN",
|
|
mutability: "Mutable",
|
|
data: {
|
|
markdown: "```bash\n$ mycli deploy --env production --dry-run\n```",
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const document = extractArticleDocumentFromPayload(
|
|
payload,
|
|
"2036762680401223946",
|
|
"https://x.com/ericzakariasson/status/2036762680401223946",
|
|
);
|
|
|
|
expect(document).not.toBeNull();
|
|
expect(document?.metadata?.kind).toBe("x/article");
|
|
|
|
const content = document?.content[0];
|
|
expect(content?.type).toBe("markdown");
|
|
if (!content || content.type !== "markdown") {
|
|
throw new Error("Expected markdown content");
|
|
}
|
|
|
|
expect(content.markdown).toContain("```bash");
|
|
expect(content.markdown).toContain("$ mycli deploy --env production --dry-run");
|
|
expect(content.markdown).toContain("Make it non-interactive.");
|
|
expect(content.markdown).toContain("Return data on success.");
|
|
});
|
|
|
|
test("renders media, embedded tweets, and cover image from article entities", () => {
|
|
const embeddedTweetPayload = {
|
|
data: {
|
|
tweetResult: {
|
|
result: {
|
|
rest_id: "999",
|
|
legacy: {
|
|
full_text: "Embedded tweet text",
|
|
favorite_count: 4,
|
|
retweet_count: 2,
|
|
reply_count: 1,
|
|
created_at: "Wed Mar 25 11:10:38 +0000 2026",
|
|
extended_entities: {
|
|
media: [
|
|
{
|
|
type: "photo",
|
|
media_url_https: "https://pbs.twimg.com/media/embedded.jpg",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
core: {
|
|
user_results: {
|
|
result: {
|
|
core: {
|
|
name: "Embedded Author",
|
|
screen_name: "embedded_author",
|
|
},
|
|
legacy: {},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const articlePayload = {
|
|
data: {
|
|
tweetResult: {
|
|
result: {
|
|
rest_id: "2036670816344064290",
|
|
legacy: {
|
|
full_text: "Fallback text",
|
|
favorite_count: 12,
|
|
retweet_count: 3,
|
|
reply_count: 1,
|
|
created_at: "Wed Mar 25 11:10:38 +0000 2026",
|
|
},
|
|
core: {
|
|
user_results: {
|
|
result: {
|
|
legacy: {
|
|
name: "Eric Zakariasson",
|
|
screen_name: "ericzakariasson",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
article: {
|
|
article_results: {
|
|
result: {
|
|
title: "Article with media",
|
|
cover_media: {
|
|
media_info: {
|
|
original_img_url: "https://pbs.twimg.com/media/cover?format=jpeg&name=small",
|
|
},
|
|
},
|
|
media_entities: [
|
|
{
|
|
media_id: "42",
|
|
media_info: {
|
|
original_img_url: "https://pbs.twimg.com/media/body.jpg",
|
|
},
|
|
},
|
|
],
|
|
content_state: {
|
|
blocks: [
|
|
{
|
|
type: "unstyled",
|
|
text: "Read more: https://t.co/example",
|
|
data: {},
|
|
entityRanges: [{ key: 2, length: 20, offset: 11 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
{
|
|
type: "atomic",
|
|
text: " ",
|
|
data: {},
|
|
entityRanges: [{ key: 0, length: 1, offset: 0 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
{
|
|
type: "atomic",
|
|
text: " ",
|
|
data: {},
|
|
entityRanges: [{ key: 1, length: 1, offset: 0 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
],
|
|
entityMap: [
|
|
{
|
|
key: "0",
|
|
value: {
|
|
type: "MEDIA",
|
|
mutability: "Immutable",
|
|
data: {
|
|
mediaItems: [{ mediaId: "42" }],
|
|
},
|
|
},
|
|
},
|
|
{
|
|
key: "1",
|
|
value: {
|
|
type: "TWEET",
|
|
mutability: "Immutable",
|
|
data: {
|
|
tweetId: "999",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
key: "2",
|
|
value: {
|
|
type: "LINK",
|
|
mutability: "Mutable",
|
|
data: {
|
|
url: "https://example.com/report",
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const document = extractArticleDocumentFromPayload(
|
|
articlePayload,
|
|
"2036670816344064290",
|
|
"https://x.com/ericzakariasson/status/2036670816344064290",
|
|
[articlePayload, embeddedTweetPayload],
|
|
);
|
|
|
|
expect(document).not.toBeNull();
|
|
expect(document?.metadata?.coverImage).toBe(
|
|
"https://pbs.twimg.com/media/cover?format=jpg&name=4096x4096",
|
|
);
|
|
|
|
const content = document?.content[0];
|
|
expect(content?.type).toBe("markdown");
|
|
if (!content || content.type !== "markdown") {
|
|
throw new Error("Expected markdown content");
|
|
}
|
|
|
|
expect(content.markdown).toContain("https://example.com/report");
|
|
expect(content.markdown).toContain("");
|
|
expect(content.markdown).toContain("> Embedded Author (@embedded_author)");
|
|
expect(content.markdown).toContain("> Embedded tweet text");
|
|
expect(content.markdown).toContain(
|
|
"> ",
|
|
);
|
|
});
|
|
|
|
test("prefers expanded link entity urls in article blocks", () => {
|
|
const payload = {
|
|
data: {
|
|
tweetResult: {
|
|
result: {
|
|
rest_id: "2036670816344064290",
|
|
legacy: {
|
|
full_text: "Fallback text",
|
|
favorite_count: 12,
|
|
retweet_count: 3,
|
|
reply_count: 1,
|
|
created_at: "Wed Mar 25 11:10:38 +0000 2026",
|
|
},
|
|
core: {
|
|
user_results: {
|
|
result: {
|
|
legacy: {
|
|
name: "Eric Zakariasson",
|
|
screen_name: "ericzakariasson",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
article: {
|
|
article_results: {
|
|
result: {
|
|
title: "Article with expanded links",
|
|
content_state: {
|
|
blocks: [
|
|
{
|
|
type: "unstyled",
|
|
text: "Read more: https://t.co/example",
|
|
data: {},
|
|
entityRanges: [{ key: 0, length: 20, offset: 11 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
],
|
|
entityMap: [
|
|
{
|
|
key: "0",
|
|
value: {
|
|
type: "LINK",
|
|
mutability: "Mutable",
|
|
data: {
|
|
expanded_url: "https://example.com/report",
|
|
url: "https://t.co/example",
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const document = extractArticleDocumentFromPayload(
|
|
payload,
|
|
"2036670816344064290",
|
|
"https://x.com/ericzakariasson/status/2036670816344064290",
|
|
);
|
|
|
|
expect(document).not.toBeNull();
|
|
|
|
const content = document?.content[0];
|
|
expect(content?.type).toBe("markdown");
|
|
if (!content || content.type !== "markdown") {
|
|
throw new Error("Expected markdown content");
|
|
}
|
|
|
|
expect(content.markdown).toContain("https://example.com/report");
|
|
expect(content.markdown).not.toContain("https://t.co/example");
|
|
});
|
|
|
|
test("renders article video media as the highest bitrate mp4 link", () => {
|
|
const payload = {
|
|
data: {
|
|
tweetResult: {
|
|
result: {
|
|
rest_id: "2046628728210350366",
|
|
legacy: {
|
|
full_text: "Fallback text",
|
|
favorite_count: 12,
|
|
retweet_count: 3,
|
|
reply_count: 1,
|
|
created_at: "Tue Apr 21 16:34:47 +0000 2026",
|
|
},
|
|
core: {
|
|
user_results: {
|
|
result: {
|
|
legacy: {
|
|
name: "Google AI Studio",
|
|
screen_name: "GoogleAIStudio",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
article: {
|
|
article_results: {
|
|
result: {
|
|
title: "Article with video",
|
|
media_entities: [
|
|
{
|
|
media_id: "2046627051822530560",
|
|
media_info: {
|
|
__typename: "ApiVideo",
|
|
variants: [
|
|
{
|
|
bit_rate: 2176000,
|
|
content_type: "video/mp4",
|
|
url: "https://video.twimg.com/amplify_video/2046627051822530560/vid/avc1/1280x720/medium.mp4",
|
|
},
|
|
{
|
|
content_type: "application/x-mpegURL",
|
|
url: "https://video.twimg.com/amplify_video/2046627051822530560/pl/playlist.m3u8",
|
|
},
|
|
{
|
|
bit_rate: 10368000,
|
|
content_type: "video/mp4",
|
|
url: "https://video.twimg.com/amplify_video/2046627051822530560/vid/avc1/1920x1080/high.mp4",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
content_state: {
|
|
blocks: [
|
|
{
|
|
type: "atomic",
|
|
text: " ",
|
|
data: {},
|
|
entityRanges: [{ key: 0, length: 1, offset: 0 }],
|
|
inlineStyleRanges: [],
|
|
},
|
|
],
|
|
entityMap: [
|
|
{
|
|
key: "0",
|
|
value: {
|
|
type: "MEDIA",
|
|
mutability: "Immutable",
|
|
data: {
|
|
mediaItems: [{ mediaId: "2046627051822530560" }],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const document = extractArticleDocumentFromPayload(
|
|
payload,
|
|
"2046628728210350366",
|
|
"https://x.com/GoogleAIStudio/status/2046628728210350366",
|
|
);
|
|
|
|
expect(document).not.toBeNull();
|
|
|
|
const content = document?.content[0];
|
|
expect(content?.type).toBe("markdown");
|
|
if (!content || content.type !== "markdown") {
|
|
throw new Error("Expected markdown content");
|
|
}
|
|
|
|
expect(content.markdown).toBe(
|
|
"[video](https://video.twimg.com/amplify_video/2046627051822530560/vid/avc1/1920x1080/high.mp4)",
|
|
);
|
|
});
|
|
});
|