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
105 lines
3.1 KiB
TypeScript
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 };
|
|
}
|