agent-orchestrator/ui-electrobun/tests/e2e/fixtures.ts
Hibryda 4826b9dffa feat(electrobun): auto-updater + E2E tests + splash screen — ALL GAPS CLOSED
Auto-updater:
- updater.ts: GitHub Releases API check, semver comparison, timestamp tracking
- AdvancedSettings wired to real updater.check/getVersion RPC

E2E testing (45 tests):
- wdio.conf.js: WebDriverIO config for Electrobun (port 9761)
- fixtures.ts: isolated temp dirs, demo data, git repo init
- 4 spec files: smoke (13), settings (13), terminal (10), agent (9)

Splash screen:
- SplashScreen.svelte: animated gradient AGOR logo, version, loading dots
- App.svelte: shows splash until all init promises resolve, 300ms fade-out
2026-03-22 01:49:30 +01:00

105 lines
3.1 KiB
TypeScript

/**
* E2E test fixture generator for the Electrobun prototype.
*
* Creates isolated temp directories with demo groups.json, settings.db,
* and a scratch git repo. Cleanup happens automatically on test end.
*/
import { mkdirSync, writeFileSync, rmSync } from "node:fs";
import { execSync } from "node:child_process";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { randomUUID } from "node:crypto";
export interface TestFixture {
/** Root temp directory for this test run. */
rootDir: string;
/** ~/.config/agor equivalent for test isolation. */
configDir: string;
/** ~/.local/share/agor equivalent for test isolation. */
dataDir: string;
/** A scratch git repo with an initial commit. */
repoDir: string;
/** Environment variables to pass to the app process. */
env: Record<string, string>;
/** Remove all fixture files (best-effort). */
cleanup: () => void;
}
/** Default groups matching the app's seed data. */
const DEMO_GROUPS = [
{ id: "dev", name: "Development", icon: "\uD83D\uDD27", position: 0 },
{ id: "test", name: "Testing", icon: "\uD83E\uddEA", position: 1 },
{ id: "ops", name: "DevOps", icon: "\uD83D\uDE80", position: 2 },
{ id: "research", name: "Research", icon: "\uD83D\uDD2C", position: 3 },
];
/** Demo project config for test assertions. */
const DEMO_PROJECTS = [
{
id: "test-project-1",
name: "test-project",
cwd: "", // filled in with repoDir
accent: "var(--ctp-mauve)",
provider: "claude",
groupId: "dev",
},
];
/**
* Create an isolated test fixture with config/data dirs, groups.json,
* and a git repo with one commit.
*/
export function createTestFixture(prefix = "agor-ebun-e2e"): TestFixture {
const rootDir = join(tmpdir(), `${prefix}-${randomUUID().slice(0, 8)}`);
const configDir = join(rootDir, "config", "agor");
const dataDir = join(rootDir, "data", "agor");
const repoDir = join(rootDir, "repo");
// Create directory tree
mkdirSync(configDir, { recursive: true });
mkdirSync(dataDir, { recursive: true });
mkdirSync(repoDir, { recursive: true });
// Write demo groups.json
writeFileSync(
join(configDir, "groups.json"),
JSON.stringify({ groups: DEMO_GROUPS }, null, 2),
);
// Update demo project CWD to point at the scratch repo
const projects = DEMO_PROJECTS.map((p) => ({ ...p, cwd: repoDir }));
writeFileSync(
join(configDir, "projects.json"),
JSON.stringify(projects, null, 2),
);
// Initialise a scratch git repo with one commit
execSync("git init && git commit --allow-empty -m 'init'", {
cwd: repoDir,
stdio: "ignore",
env: {
...process.env,
GIT_AUTHOR_NAME: "test",
GIT_AUTHOR_EMAIL: "test@test",
GIT_COMMITTER_NAME: "test",
GIT_COMMITTER_EMAIL: "test@test",
},
});
const env: Record<string, string> = {
AGOR_TEST: "1",
AGOR_TEST_CONFIG_DIR: configDir,
AGOR_TEST_DATA_DIR: dataDir,
};
function cleanup() {
try {
rmSync(rootDir, { recursive: true, force: true });
} catch {
/* best-effort */
}
}
return { rootDir, configDir, dataDir, repoDir, env, cleanup };
}