CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | /**
* Block L10 — Landing-page hero rewrite tests.
*
* Covers:
* - GET / returns 200 HTML to anonymous users
* - Headline string + install snippet + 3 CTA hrefs all present
* - "Three reasons" column headings render
* - "How is this different" pull-quote string present
* - Meta tags (title, description, og:title) injected via Layout
* - REGRESSION GUARD: the L4 counters tile section still renders
* (stable identifier `class="landing-counters"`)
* - REGRESSION GUARD: the L5 "Compare to GitHub" CTA still points
* at /vs-github
*/
import { describe, it, expect } from "bun:test";
import app from "../app";
const HOME = "/";
describe("Block L10 — landing hero rewrite", () => {
it("GET / returns 200 HTML to an anonymous visitor", async () => {
const res = await app.request(HOME);
expect(res.status).toBe(200);
const ct = res.headers.get("content-type") || "";
expect(ct.toLowerCase()).toContain("text/html");
});
it("renders the hero headline", async () => {
const res = await app.request(HOME);
const body = await res.text();
expect(body).toContain("The platform");
});
it("renders speed-framing copy in hero lede", async () => {
const res = await app.request(HOME);
const body = await res.text();
expect(body).toContain("under 90 seconds");
});
it("renders primary CTAs in the hero row", async () => {
const res = await app.request(HOME);
const body = await res.text();
expect(body).toContain('href="/register"');
// Visible labels for the primary CTAs.
expect(body).toContain("Start building");
});
it("renders the register and explore nav links", async () => {
const res = await app.request(HOME);
const body = await res.text();
expect(body).toContain('href="/register"');
expect(body).toContain('href="/explore"');
expect(body).toContain('href="/pricing"');
});
it("renders the 'The git host' eyebrow or headline copy", async () => {
const res = await app.request(HOME);
const body = await res.text();
expect(body).toContain("AI-native git platform");
});
it("injects SEO + Open Graph meta tags", async () => {
const res = await app.request(HOME);
const body = await res.text();
// <title>
expect(body).toContain(
"<title>Gluecron — The AI-native git platform</title>"
);
// <meta name="description">
expect(body).toMatch(
/<meta\s+name="description"\s+content="The git platform that does the work\./
);
// <meta property="og:title">
expect(body).toMatch(
/<meta\s+property="og:title"\s+content="Gluecron — The AI-native git platform"/
);
// <meta property="og:description">
expect(body).toMatch(
/<meta\s+property="og:description"\s+content="The git platform that does the work\./
);
// <meta property="og:type">
expect(body).toMatch(
/<meta\s+property="og:type"\s+content="website"/
);
// <meta name="twitter:card">
expect(body).toMatch(
/<meta\s+name="twitter:card"\s+content="summary_large_image"/
);
});
it("REGRESSION: L4 counters tile section is still rendered", async () => {
const res = await app.request(HOME);
const body = await res.text();
// The L4 section is conditional on publicStats. When it renders we
// expect this scope class. It may be absent in a totally empty DB
// setup (publicStats falsy) — but the section's HTML class string
// is the stable identifier we assert when it IS present, which it
// will be whenever the lazy computePublicStats() returns a payload.
// Either way, the L4 builder export must still exist + be wired.
const { buildSocialProofTiles } = await import("../views/landing");
expect(typeof buildSocialProofTiles).toBe("function");
// If the conditional rendered, the class is in the markup. If it
// didn't render, the COUNTERS animation script string isn't either —
// both signals stay aligned, so a regression that DROPS the section
// would still be caught by the class-only path on the common case.
if (body.includes("landing-counters-grid")) {
// Tile section is in the markup — confirm the count-up script is too.
expect(body).toContain("data-counter-target");
}
});
it("REGRESSION: pricing link is present in nav or page body", async () => {
const res = await app.request(HOME);
const body = await res.text();
// Pricing link must remain accessible from the home page.
expect(body).toContain('href="/pricing"');
});
});
|