дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-08 19:02:17 +02:00
149 рядки
5.7 KiB
TypeScript
149 рядки
5.7 KiB
TypeScript
import { expect, ipcCalls, stubDesktop, test } from "./fixtures";
|
|
|
|
test("shows GitHub check statuses for each commit's repository", async ({ workbench: page }) => {
|
|
await page.clock.install();
|
|
await stubDesktop(page);
|
|
await page.evaluate(async () => {
|
|
const primary = "/dev/acme-api";
|
|
const linked = "/dev/acme-web";
|
|
const tip = "1".repeat(40);
|
|
const pending = "2".repeat(40);
|
|
const missing = "3".repeat(40);
|
|
const h = window.__ipc.handlers;
|
|
h.vcs_roots = () =>
|
|
[
|
|
{ root: primary, head: "main" },
|
|
{ root: linked, head: "release" },
|
|
].map((repo) => ({ ...repo, operation: null, headCommit: tip }));
|
|
h.vcs_branch_info = ({ repo }) => ({
|
|
head: repo === linked ? "release" : "main",
|
|
headCommit: tip,
|
|
upstream: null,
|
|
ahead: 0,
|
|
behind: 0,
|
|
operation: null,
|
|
});
|
|
h.vcs_branches = ({ repo }) =>
|
|
[repo === linked ? "origin/dev" : "origin/other"].map((name) => ({
|
|
name,
|
|
commit: tip,
|
|
remote: true,
|
|
current: false,
|
|
upstream: null,
|
|
ahead: 0,
|
|
behind: 0,
|
|
lastCommitMs: 0,
|
|
}));
|
|
h.vcs_log = ({ repo }) => {
|
|
const rows: [string, string][] =
|
|
repo === linked
|
|
? [[tip, "Linked repository commit"]]
|
|
: [
|
|
[tip, "Primary repository commit"],
|
|
[pending, "Pending commit"],
|
|
[missing, "Local-only commit"],
|
|
];
|
|
return rows.map(([id, summary], i) => ({
|
|
id,
|
|
shortId: id.slice(0, 8),
|
|
parents: [],
|
|
refs: i === 0 ? [repo === linked ? "origin/dev" : "origin/other"] : [],
|
|
author: "A",
|
|
email: "[email protected]",
|
|
timeMs: 0,
|
|
summary,
|
|
message: summary,
|
|
}));
|
|
};
|
|
h.vcs_log_refs = () => ({});
|
|
h.vcs_log_details_batch = ({ revisions }) =>
|
|
(revisions as string[]).map(() => ({
|
|
message: "Linked repository commit",
|
|
containingBranches: [],
|
|
signature: "N",
|
|
signer: "",
|
|
key: "",
|
|
fingerprint: "",
|
|
}));
|
|
h.vcs_commit_files = () => [];
|
|
h.vcs_config_get = () => null;
|
|
h.vcs_tags = () => [];
|
|
h.vcs_status = () => [];
|
|
h.vcs_remotes = ({ repo }) => [
|
|
{ name: "origin", url: `[email protected]:example/${repo === linked ? "web" : "api"}.git` },
|
|
];
|
|
let pendingQueries = 0;
|
|
h.gh_api = ({ repo, request }) => {
|
|
const { variables } = JSON.parse((request as { body: string }).body) as { variables: Record<string, string> };
|
|
const linkedRepo = repo === linked;
|
|
const state = linkedRepo ? "FAILURE" : "SUCCESS";
|
|
if (variables.oid)
|
|
return JSON.stringify({
|
|
data: {
|
|
repository: {
|
|
object: {
|
|
statusCheckRollup: {
|
|
contexts: {
|
|
nodes: [{ __typename: "StatusContext", context: "Frontend", state, targetUrl: null }],
|
|
pageInfo: { hasNextPage: false, endCursor: null },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
const statuses = Object.entries(variables)
|
|
.filter(([key]) => /^oid\d+$/.test(key))
|
|
.map(([key, revision]) => [
|
|
key.replace("oid", "c"),
|
|
revision === missing
|
|
? null
|
|
: { statusCheckRollup: { state: revision === pending && ++pendingQueries === 1 ? "PENDING" : state } },
|
|
]);
|
|
return JSON.stringify({ data: { repository: Object.fromEntries(statuses) } });
|
|
};
|
|
const vcsModule = "/src/features/vcs/store.ts";
|
|
const { useVcs, refreshNow } = await import(/* @vite-ignore */ vcsModule);
|
|
useVcs.setState({ available: true, root: primary, repo: primary });
|
|
await refreshNow();
|
|
const contextModule = "/src/platform/context.ts";
|
|
const { setContext } = await import(/* @vite-ignore */ contextModule);
|
|
setContext("vcsAvailable", true);
|
|
const actionsModule = "/src/platform/actions.ts";
|
|
const { executeAction } = await import(/* @vite-ignore */ actionsModule);
|
|
await executeAction("vcs.showLog");
|
|
});
|
|
|
|
const primary = page.getByRole("option", { name: /Primary repository commit/ });
|
|
const linked = page.getByRole("option", { name: /Linked repository commit/ });
|
|
await expect(primary).toBeVisible();
|
|
expect(await ipcCalls(page, "gh_api")).toEqual([]);
|
|
await page.getByRole("button", { name: "View Options" }).first().click();
|
|
await page.getByRole("menuitem", { name: "Columns", exact: true }).hover();
|
|
await page.getByRole("menuitemcheckbox", { name: "GitHub Commit Checks" }).click({ timeout: 4000 });
|
|
await expect(primary.getByRole("button", { name: "Checks passed" })).toBeVisible();
|
|
await expect(linked.getByRole("button", { name: "Checks failed" })).toBeVisible();
|
|
await expect(
|
|
page.getByRole("option", { name: /Pending commit/ }).getByRole("button", { name: "Checks in progress…" }),
|
|
).toBeVisible();
|
|
await expect(
|
|
page.getByRole("option", { name: /Local-only commit/ }).getByRole("button", { name: /^Checks / }),
|
|
).toHaveCount(0);
|
|
|
|
const calls = await ipcCalls(page, "gh_api");
|
|
expect(calls.map((c) => c.repo).sort()).toEqual(["/dev/acme-api", "/dev/acme-web"]);
|
|
expect(calls.map((c) => JSON.parse((c.request as { body: string }).body).variables.repoName).sort()).toEqual([
|
|
"api",
|
|
"web",
|
|
]);
|
|
await linked.getByRole("button", { name: "Checks failed" }).click();
|
|
await expect(page.getByRole("option", { name: /Frontend/ })).toBeVisible();
|
|
expect((await ipcCalls(page, "gh_api")).at(-1)).toMatchObject({ repo: "/dev/acme-web" });
|
|
|
|
await page.keyboard.press("Escape");
|
|
await page.clock.fastForward(31_000);
|
|
await expect(
|
|
page.getByRole("option", { name: /Pending commit/ }).getByRole("button", { name: "Checks passed" }),
|
|
).toBeVisible();
|
|
});
|