mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-13 13:38:01 +02:00
fix(github): qualify dedicated app setup and issue automation
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
322fd7de2f
commit
470e66db0d
25 files changed
+945
-93
No files matched your search
@@ -1,6 +1,7 @@
|
||||
import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { createServer } from "node:net";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import type { Agent, Company, InstanceExperimentalSettings } from "@paperclipai/shared";
|
||||
import {
|
||||
@@ -86,6 +87,32 @@ afterEach(() => {
|
||||
});
|
||||
|
||||
describe("test-drive data isolation", () => {
|
||||
it.each([false, true])("reuses the saved port, with occupied=%s", async (occupied) => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-test-drive-port-"));
|
||||
cleanupDirectories.push(root);
|
||||
const listener = createServer();
|
||||
await new Promise<void>((resolve) => listener.listen(0, "127.0.0.1", resolve));
|
||||
const savedPort = (listener.address() as { port: number }).port;
|
||||
const close = () => new Promise<void>((resolve, reject) => listener.close(error => error ? reject(error) : resolve()));
|
||||
if (!occupied) await close();
|
||||
const configPath = path.join(root, "instances", "default", "config.json");
|
||||
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
||||
fs.writeFileSync(configPath, JSON.stringify({
|
||||
$meta: { version: 1, updatedAt: new Date().toISOString(), source: "onboard" },
|
||||
database: {}, logging: { mode: "file" }, telemetry: { enabled: false },
|
||||
server: { port: savedPort },
|
||||
}));
|
||||
try {
|
||||
await prepareTestDriveEnvironment({ dataDir: root }, os.tmpdir());
|
||||
if (occupied) expect(Number(process.env.PORT)).toBeGreaterThan(savedPort);
|
||||
else expect(Number(process.env.PORT)).toBe(savedPort);
|
||||
expect(JSON.parse(fs.readFileSync(configPath, "utf8")).server.port).toBe(savedPort);
|
||||
expect(process.env.HOST).toBe("127.0.0.1");
|
||||
} finally {
|
||||
if (occupied) await close();
|
||||
}
|
||||
});
|
||||
|
||||
it("creates unique retained OS temporary directories and reports absolute paths", () => {
|
||||
const first = resolveTestDriveDataDir();
|
||||
const second = resolveTestDriveDataDir();
|
||||
|
||||
@@ -194,7 +194,15 @@ export async function prepareTestDriveEnvironment(
|
||||
process.env.PAPERCLIP_DEPLOYMENT_EXPOSURE = "private";
|
||||
process.env.PAPERCLIP_BIND = "loopback";
|
||||
process.env.HOST = "127.0.0.1";
|
||||
process.env.PORT = String(await resolveTestDriveServerPort());
|
||||
let preferredPort = 3100;
|
||||
try {
|
||||
preferredPort = readConfig(process.env.PAPERCLIP_CONFIG)?.server.port ?? preferredPort;
|
||||
} catch {
|
||||
// The normal startup doctor owns invalid-config diagnostics and repair.
|
||||
}
|
||||
// Reusing a test drive must preserve callback and enrollment origins when
|
||||
// its saved port is available. Only move forward if that port is occupied.
|
||||
process.env.PORT = String(await resolveTestDriveServerPort(preferredPort));
|
||||
|
||||
return { dataDir, linkedWorktree };
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user