From 54589392f72ae5f8aefae233b8c4ef1b04b8275a Mon Sep 17 00:00:00 2001 From: zj1123581321 Date: Fri, 16 Oct 2026 15:09:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=88=86=E4=BA=AB=E9=A1=B5?= =?UTF-8?q?=20OG=20=E5=A4=A7=E5=9B=BE=E6=A0=87=E7=AD=BE=E7=9A=84=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E5=9B=9E=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Executor: grok-pi Agent-Model: grok-4.6 Agent-Effort: high Dispatch-Id: dlg-20261016-065955-fd1394 Task-Id: VideoTranscriptAPI-20261016-07 --- e2e/tests/pages.spec.ts | 36 ++++++++++++++++++++++++++++++++++++ tests/browser_server.py | 9 +++++++++ 2 files changed, 45 insertions(+) diff --git a/e2e/tests/pages.spec.ts b/e2e/tests/pages.spec.ts index a525f7d2..64de62b4 100644 --- a/e2e/tests/pages.spec.ts +++ b/e2e/tests/pages.spec.ts @@ -142,3 +142,39 @@ test('cleaned view smoke: cleanup state and recovery guidance are visible', asyn await expect(page.getByRole('heading', { name: /内容已清理/ })).toBeVisible(); await expect(page.getByText(/重新获取转录/)).toBeVisible(); }); + +test('share view with card emits twitter large image and og tags', async ({ page }) => { + const token = 'browser-fixture-view-og'; + const headline = 'Fixture "headline" & alt'; + await page.goto(`/view/${token}`); + await expect(page.locator('meta[name="twitter:card"]')).toHaveAttribute( + 'content', + 'summary_large_image', + ); + await expect(page.locator('meta[property="og:image"]')).toHaveAttribute( + 'content', + `${baseURL}/og/${token}.png?v=1`, + ); + await expect(page.locator('meta[property="og:image:width"]')).toHaveAttribute( + 'content', + '1200', + ); + await expect(page.locator('meta[property="og:image:height"]')).toHaveAttribute( + 'content', + '630', + ); + await expect(page.locator('meta[name="twitter:image:alt"]')).toHaveAttribute( + 'content', + headline, + ); + await expect(page.locator('meta[property="og:description"]')).toHaveAttribute( + 'content', + 'First fixture point', + ); +}); + +test('share view without card omits twitter card and og image tags', async ({ page }) => { + await page.goto('/view/browser-fixture-view'); + await expect(page.locator('meta[name="twitter:card"]')).toHaveCount(0); + await expect(page.locator('meta[property="og:image"]')).toHaveCount(0); +}); diff --git a/tests/browser_server.py b/tests/browser_server.py index 36919eb3..ae3e4c2c 100644 --- a/tests/browser_server.py +++ b/tests/browser_server.py @@ -23,6 +23,7 @@ VIEWS_SOURCE = ROOT / "src" / "video_transcript_api" / "api" / "routes" / "views.py" FIXTURE_TOKEN = "browser-fixture-token" VIEW_TOKEN = "browser-fixture-view" +VIEW_TOKEN_WITH_CARD = "browser-fixture-view-og" UPLOAD_VIEW_TOKEN = "upload_browser_fixture_view_1" UPLOAD_ID = "browser-fixture-upload-1" @@ -515,6 +516,14 @@ def serve_view(self, status: str, view_token: str = VIEW_TOKEN) -> None: "error_message": "夹具失败状态", "message": "夹具失败状态", } + if view_token == VIEW_TOKEN_WITH_CARD: + port = self.server.server_address[1] + context["share_card"] = { + "headline": 'Fixture "headline" & alt', + "points": ["First fixture point", "Second fixture point"], + "generated_at": "2026-10-16T12:00:00+08:00", + } + context["og_image_url"] = f"http://127.0.0.1:{port}/og/{view_token}.png?v=1" html = TEMPLATES.get_template(template_name).render(**context) self.send_bytes(200, html.encode("utf-8"), "text/html; charset=utf-8")