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 | /**
* Block G4 — VS Code extension pure-helper tests.
*
* The extension itself depends on the `vscode` module (only available inside
* the host), but the URL-building helpers are pure — we re-implement them
* locally here to lock the contract. If the contract drifts in extension.ts,
* update this file in lockstep.
*/
import { describe, it, expect } from "bun:test";
import { readFileSync } from "node:fs";
import { join } from "node:path";
// Mirror of src/extension.ts — keep in sync.
function buildWebUrl(
host: string,
owner: string,
repo: string,
relPath: string,
line?: number
): string {
const base = `${host.replace(/\/+$/, "")}/${owner}/${repo}/blob/main/${relPath}`;
return line ? `${base}#L${line + 1}` : base;
}
describe("vscode-extension — buildWebUrl", () => {
it("builds a basic web URL", () => {
expect(buildWebUrl("https://gluecron.com", "alice", "proj", "README.md")).toBe(
"https://gluecron.com/alice/proj/blob/main/README.md"
);
});
it("appends #L<n+1> when a line is supplied", () => {
expect(
buildWebUrl("https://gluecron.com", "alice", "proj", "src/x.ts", 41)
).toBe("https://gluecron.com/alice/proj/blob/main/src/x.ts#L42");
});
it("strips trailing slashes from the host", () => {
expect(buildWebUrl("https://g.com///", "a", "b", "c")).toBe(
"https://g.com/a/b/blob/main/c"
);
});
});
describe("vscode-extension — package.json contract", () => {
const pkg = JSON.parse(
readFileSync(
join(process.cwd(), "vscode-extension/package.json"),
"utf8"
)
);
it("declares the expected commands", () => {
const names = pkg.contributes.commands.map((c: any) => c.command);
expect(names).toContain("gluecron.explainFile");
expect(names).toContain("gluecron.openOnWeb");
expect(names).toContain("gluecron.searchSemantic");
expect(names).toContain("gluecron.generateTests");
});
it("declares configuration keys host + token", () => {
const keys = Object.keys(pkg.contributes.configuration.properties);
expect(keys).toContain("gluecron.host");
expect(keys).toContain("gluecron.token");
});
it("activates onStartupFinished", () => {
expect(pkg.activationEvents).toContain("onStartupFinished");
});
});
|