14oqjtsnb: Play trending video answers as video with thumbnail fallback

This commit is contained in:
2026-10-19 17:40:44 -06:00
parent 77f0dd09a4
commit 31fdc41f23
6 changed files with 111 additions and 21 deletions
+21 -2
View File
@@ -13,7 +13,7 @@ const expert = (o: Partial<DiscoverExpert> = {}): DiscoverExpert => ({
});
const minnect = (o: Partial<DiscoverMinnect> = {}): DiscoverMinnect => ({
id: 9, question: "How do I price?", views: 1234, thumbnailUrl: "https://x/t.jpg",
audio: { url: "https://x/a.mp3", duration: 30, waveform: null },
media: { kind: "audio", url: "https://x/a.mp3", duration: 30, waveform: null },
expert: { slug: "ann", displayName: "Ann Lee", pictureUrl: null, byline: null, rating: null }, ...o,
});
const html = (el: ReturnType<typeof createElement>) => renderToStaticMarkup(el);
@@ -51,9 +51,28 @@ describe("TrendingMinnectsRail", () => {
expect(out).toContain('src="https://x/a.mp3"');
expect(out).toContain("t.jpg");
});
it("renders a video with poster for video answers, no audio element", () => {
const url = "https://valuentainment-quick-questions-prod.s3.amazonaws.com/a.mov?X-Amz-Signature=abc";
const out = html(createElement(TrendingMinnectsRail, {
minnects: [minnect({ media: { kind: "video", url, duration: 9, waveform: null } })],
}));
expect(out).toContain("<video");
expect(out).toContain("controls");
expect(out).toContain("preload=\"none\"");
expect(out).toContain("X-Amz-Signature=abc");
expect(out).toContain('poster="https://x/t.jpg"');
expect(out).not.toContain("<audio");
expect(out).not.toContain("autoPlay");
});
it("has no media element for a missing url but keeps the thumbnail", () => {
const out = html(createElement(TrendingMinnectsRail, { minnects: [minnect({ media: null })] }));
expect(out).not.toContain("<audio");
expect(out).not.toContain("<video");
expect(out).toContain("minnect-thumb");
});
it("has no audio element or thumbnail when those are missing", () => {
const out = html(createElement(TrendingMinnectsRail, {
minnects: [minnect({ audio: { url: null, duration: null, waveform: null }, thumbnailUrl: null, question: null, views: null })],
minnects: [minnect({ media: null, thumbnailUrl: null, question: null, views: null })],
}));
expect(out).not.toContain("<audio");
expect(out).not.toContain("minnect-thumb");
+17 -2
View File
@@ -52,7 +52,7 @@ describe("GET /api/discover", () => {
});
expect(json.trendingMinnects[0]).toEqual({
id: "c1", question: "How?", views: 10, thumbnailUrl: "https://img/t.jpg",
audio: { url: "https://a/1.mp3", duration: 42, waveform: [1, 2, 3] },
media: { kind: "audio", url: "https://a/1.mp3", duration: 42, waveform: [1, 2, 3] },
expert: { slug: "jane-doe", displayName: "Jane Doe", pictureUrl: "https://img/jane.jpg", byline: "Coach", rating: 4.9 },
});
expect(json.categories).toEqual([
@@ -90,7 +90,7 @@ describe("GET /api/discover", () => {
reviewsCount: null, available: null, location: { city: null, country: null },
}]);
expect(out.trendingMinnects).toHaveLength(1);
expect(out.trendingMinnects[0].audio).toEqual({ url: null, duration: null, waveform: null });
expect(out.trendingMinnects[0].media).toBeNull();
expect(out.categories).toEqual([{ id: 3, name: "A", icon: null, sortOrder: 0 }]);
expect(mapDiscover(null)).toEqual({ featuredExperts: [], trendingMinnects: [], categories: [] });
});
@@ -108,3 +108,18 @@ describe("GET /api/discover", () => {
expect(b.res.status).toBe(502);
});
});
describe("trending media kind", () => {
const conv = (answer: unknown) => mapDiscover({ data: { trending_conversations: [{ id: 1, answer }] } }).trendingMinnects[0].media;
it.each(["MOV", "mp4", "M4V", "QuickTime", "MO4", "webm"])("maps %s to video and keeps the signed url", (t) => {
const url = "https://valuentainment-quick-questions-prod.s3.amazonaws.com/a.mov?X-Amz-Signature=abc";
expect(conv({ url, file_type: t, duration: 5 })).toEqual({ kind: "video", url, duration: 5, waveform: null });
});
it("maps other or missing file types to audio", () => {
expect(conv({ url: "https://a/x", file_type: "aac" })?.kind).toBe("audio");
expect(conv({ url: "https://a/x" })?.kind).toBe("audio");
});
it("has no media without a url", () => {
expect(conv({ file_type: "MOV" })).toBeNull();
});
});