Skip to content

Commit 48210f8

Browse files
committed
test: cover SSH blog locale availability
1 parent 1c671e5 commit 48210f8

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

web/tests/agent-page-variants.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,13 @@ describe("agent page variants", () => {
405405
}
406406
});
407407

408+
test("limits partially translated blog variants to authored locales", () => {
409+
const path = "/blog/cmux-ssh";
410+
expect(resolveAgentPageVariant(`${path}.md`)).not.toBeNull();
411+
expect(resolveAgentPageVariant(`/ja${path}.md`)).not.toBeNull();
412+
expect(resolveAgentPageVariant(`/de${path}.txt`)).toBeNull();
413+
});
414+
408415
test("limits en-ja docs alternate links to live localized routes", () => {
409416
const path = featureWorkflowDocPathForRequest("/de/docs/vault");
410417
expect(path).toBe("/docs/vault");

web/tests/seo.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@ describe("SEO metadata helpers", () => {
3939
test("omits English-only posts from localized blog navigation", () => {
4040
const englishSlugs = blogPostsForLocale("en").map((post) => post.slug);
4141
const japaneseSlugs = blogPostsForLocale("ja").map((post) => post.slug);
42+
const germanSlugs = blogPostsForLocale("de").map((post) => post.slug);
4243

4344
expect(englishSlugs).toContain("cmux-omo");
4445
expect(englishSlugs).toContain("gpl");
4546
expect(englishSlugs).toContain("cmux-claude-teams");
4647
expect(japaneseSlugs).not.toContain("cmux-omo");
4748
expect(japaneseSlugs).not.toContain("gpl");
4849
expect(japaneseSlugs).not.toContain("cmux-claude-teams");
50+
expect(japaneseSlugs).toContain("cmux-ssh");
51+
expect(germanSlugs).not.toContain("cmux-ssh");
4952
});
5053

5154
test("keeps canonical URLs locale-aware", () => {
@@ -794,11 +797,14 @@ describe("SEO middleware", () => {
794797
.filter(
795798
(url) =>
796799
url.endsWith("/pricing") ||
800+
url.endsWith("/blog/cmux-ssh") ||
797801
url.endsWith("/docs/agent-integrations/oh-my-pi"),
798802
);
799803
expect(urls).toEqual([
800804
"https://cmux.com/pricing",
801805
"https://cmux.com/ja/pricing",
806+
"https://cmux.com/blog/cmux-ssh",
807+
"https://cmux.com/ja/blog/cmux-ssh",
802808
"https://cmux.com/docs/agent-integrations/oh-my-pi",
803809
"https://cmux.com/ja/docs/agent-integrations/oh-my-pi",
804810
]);
@@ -843,6 +849,25 @@ describe("SEO middleware", () => {
843849
"https://cmux.com/blog/gpl",
844850
]);
845851
});
852+
853+
test("limits partially translated blog posts to authored locales", () => {
854+
const german = middleware(
855+
requestFor("/de/blog/cmux-ssh", { "accept-language": "de" }),
856+
);
857+
expect(german.status).toBe(301);
858+
expect(german.headers.get("location")).toBe(
859+
"https://cmux.com/blog/cmux-ssh",
860+
);
861+
862+
const japanese = middleware(
863+
requestFor("/ja/blog/cmux-ssh", { "accept-language": "ja" }),
864+
);
865+
expect(japanese.status).toBe(200);
866+
expect(japanese.headers.get("location")).toBeNull();
867+
expect(japanese.headers.get("Link")).toContain('hreflang="en"');
868+
expect(japanese.headers.get("Link")).toContain('hreflang="ja"');
869+
expect(japanese.headers.get("Link")).not.toContain('hreflang="de"');
870+
});
846871
});
847872

848873
const wideSearchBaseCodePoint =

0 commit comments

Comments
 (0)