kaneo (minimalist kanban) fork to experiment adding a tangled integration github.com/usekaneo/kaneo
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 9a620ba2f31238f03cd28f1da5ef3838d67e4e8a 95 lines 3.2 kB view raw
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});