aboutsummaryrefslogtreecommitdiff
path: root/src/app.test.ts
diff options
context:
space:
mode:
authorJoe Mou <dev@mou.fo>2026-08-27 14:08:06 -0400
committerJoe Mou <dev@mou.fo>2026-08-27 14:53:38 -0400
commit4797a627f461204b289f95f61b64e3dab8bc00ff (patch)
treea044ef3d0419c95aad9fa98a093e0c39bdce5459 /src/app.test.ts
parent7c928d30b16b37624841c4615c0d4bda426e4159 (diff)
Display PDF blobs
GitHub renders a PDF with a viewer of its own and so ships no content for one, leaving the blob view with nothing to show. Its raw bytes come as application/octet-stream, which browsers download rather than display, so serve them from a new embed route that retypes them and point an <object> at that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BErPR92xppzGFXkPqXPYj2
Diffstat (limited to 'src/app.test.ts')
-rw-r--r--src/app.test.ts68
1 files changed, 66 insertions, 2 deletions
diff --git a/src/app.test.ts b/src/app.test.ts
index 94bf205..e28c375 100644
--- a/src/app.test.ts
+++ b/src/app.test.ts
@@ -1,6 +1,6 @@
import assert from "node:assert";
import path from "node:path";
-import { describe, it } from "node:test";
+import { describe, it, type TestContext } from "node:test";
import { Eta } from "eta";
import { createApp } from "./app.ts";
@@ -100,12 +100,30 @@ describe("blob view", () => {
language: null,
size: "815 KB",
image: false,
+ renderFileType: null,
textLines: null,
htmlLines: null,
htmlContent: null,
};
- // GitHub previews neither the text nor the bytes of most binary files.
+ it("should embed a PDF", () => {
+ const html = eta.render("blob.eta", {
+ ...blob,
+ path: "test/pdfs/basicapi.pdf",
+ renderFileType: "pdf",
+ });
+
+ assert.match(html, /<object[^>]*type="application\/pdf"/);
+ assert.match(html, /data="\/justrajdeep\/fonts\/embed\/pdf\/master\/test\/pdfs\/basicapi.pdf"/);
+ });
+
+ it("should not embed a file type it has no viewer for", () => {
+ const html = eta.render("blob.eta", { ...blob, renderFileType: "stl" });
+
+ assert.doesNotMatch(html, /<object/);
+ assert.match(html, /This file cannot be displayed\./);
+ });
+
it("should offer the raw file when there is nothing to display", () => {
const html = eta.render("blob.eta", blob);
@@ -114,6 +132,52 @@ describe("blob view", () => {
});
});
+describe("embedded files", () => {
+ function stubGitHub(t: TestContext, body: string, contentType: string, status = 200) {
+ t.mock.method(
+ globalThis,
+ "fetch",
+ async () => new Response(body, { status, headers: { "Content-Type": contentType } }),
+ );
+ }
+
+ it("should retype a PDF GitHub sends as a download", async (t) => {
+ stubGitHub(t, "%PDF-1.6", "application/octet-stream");
+
+ const res = await app.request("http://cgithub.example/mozilla/pdf.js/embed/pdf/master/doc.pdf");
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(res.headers.get("Content-Type"), "application/pdf");
+ assert.strictEqual(await res.text(), "%PDF-1.6");
+ });
+
+ it("should pass on a type GitHub already got right", async (t) => {
+ stubGitHub(t, "%PDF-1.6", "application/pdf");
+
+ const res = await app.request("http://cgithub.example/mozilla/pdf.js/embed/pdf/master/doc.pdf");
+
+ assert.strictEqual(res.headers.get("Content-Type"), "application/pdf");
+ });
+
+ it("should not serve a file type it has no viewer for", async (t) => {
+ stubGitHub(t, "<script>", "text/html");
+
+ const res = await app.request("http://cgithub.example/mozilla/pdf.js/embed/html/master/x.html");
+
+ assert.strictEqual(res.status, 404);
+ });
+
+ it("should pass on the status of a file GitHub does not have", async (t) => {
+ stubGitHub(t, "404: Not Found", "text/plain", 404);
+
+ const res = await app.request(
+ "http://cgithub.example/mozilla/pdf.js/embed/pdf/master/nope.pdf",
+ );
+
+ assert.strictEqual(res.status, 404);
+ });
+});
+
describe("redirects to GitHub", () => {
// An HTTP redirect would be caught by the extension's declarativeNetRequest
// rules and bounced straight back here.