kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import { existsSync, readFileSync } from "node:fs";
2import { dirname, resolve } from "node:path";
3import { fileURLToPath } from "node:url";
4import { afterEach, vi } from "vitest";
5
6function stripEnvValueQuotes(value: string) {
7 const trimmed = value.trim();
8 if (
9 (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
10 (trimmed.startsWith("'") && trimmed.endsWith("'"))
11 ) {
12 return trimmed.slice(1, -1);
13 }
14 return trimmed;
15}
16
17function deriveTestDatabaseUrl(connectionString: string) {
18 const url = new URL(connectionString);
19 const databaseName = url.pathname.replace(/^\//, "");
20
21 if (!databaseName || databaseName.endsWith("_test")) {
22 return connectionString;
23 }
24
25 url.pathname = `/${databaseName}_test`;
26 return url.toString();
27}
28
29function assertTestDatabaseUrl(connectionString: string) {
30 const url = new URL(connectionString);
31 const databaseName = url.pathname.replace(/^\//, "");
32 if (!databaseName.endsWith("_test")) {
33 throw new Error(
34 `Integration tests require DATABASE_URL to use a database name ending in _test (got "${databaseName}")`,
35 );
36 }
37}
38
39function readDatabaseUrlFromEnvFile() {
40 const currentDir = dirname(fileURLToPath(import.meta.url));
41 const envPath = resolve(currentDir, "../../.env");
42
43 if (!existsSync(envPath)) {
44 return null;
45 }
46
47 const envFile = readFileSync(envPath, "utf8");
48 const match = envFile.match(/^DATABASE_URL=(.+)$/m);
49 const raw = match?.[1]?.trim();
50 return raw ? stripEnvValueQuotes(raw) : null;
51}
52
53const defaultTestDatabaseUrl =
54 "postgresql://postgres:postgres@localhost:5432/kaneo_test";
55const envDatabaseUrl = process.env.DATABASE_URL?.trim();
56const fromEnv = envDatabaseUrl ? stripEnvValueQuotes(envDatabaseUrl) : "";
57const rawDatabaseUrl =
58 fromEnv || readDatabaseUrlFromEnvFile() || defaultTestDatabaseUrl;
59process.env.DATABASE_URL = deriveTestDatabaseUrl(rawDatabaseUrl);
60assertTestDatabaseUrl(process.env.DATABASE_URL);
61
62process.env.NODE_ENV = "test";
63process.env.AUTH_SECRET = "test-secret-with-at-least-32-chars";
64process.env.KANEO_API_URL = "http://localhost:1337";
65process.env.KANEO_CLIENT_URL = "http://localhost:5173";
66process.env.DISABLE_GUEST_ACCESS = "false";
67process.env.DISABLE_REGISTRATION = "false";
68process.env.DISABLE_PASSWORD_REGISTRATION = "false";
69process.env.DEMO_MODE = "false";
70process.env.SMTP_HOST = "";
71process.env.SMTP_PORT = "";
72process.env.SMTP_SECURE = "";
73process.env.SMTP_USER = "";
74process.env.SMTP_PASSWORD = "";
75process.env.GITHUB_OAUTH_CLIENT_ID = "";
76process.env.GITHUB_OAUTH_CLIENT_SECRET = "";
77process.env.GITHUB_CLIENT_ID = "";
78process.env.GITHUB_CLIENT_SECRET = "";
79process.env.GOOGLE_CLIENT_ID = "";
80process.env.GOOGLE_CLIENT_SECRET = "";
81process.env.DISCORD_CLIENT_ID = "";
82process.env.DISCORD_CLIENT_SECRET = "";
83process.env.CUSTOM_OAUTH_CLIENT_ID = "";
84process.env.CUSTOM_OAUTH_CLIENT_SECRET = "";
85process.env.CUSTOM_OAUTH_AUTHORIZATION_URL = "";
86process.env.CUSTOM_OAUTH_TOKEN_URL = "";
87process.env.CUSTOM_OAUTH_USER_INFO_URL = "";
88process.env.CUSTOM_OAUTH_SCOPES = "";
89process.env.CUSTOM_OAUTH_RESPONSE_TYPE = "";
90process.env.CUSTOM_OAUTH_DISCOVERY_URL = "";
91process.env.DEVICE_AUTH_CLIENT_IDS = "kaneo-cli";
92
93afterEach(() => {
94 vi.restoreAllMocks();
95});