diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index 784a37c..fa2fff7 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -4,61 +4,68 @@ import fs from "fs"; import path from "path"; import { migrate } from "drizzle-orm/bun-sqlite/migrator"; -// Define the database URL - for development we'll use a local SQLite file -const dataDir = path.join(process.cwd(), "data"); -// Ensure data directory exists -if (!fs.existsSync(dataDir)) { - fs.mkdirSync(dataDir, { recursive: true }); -} +// Skip database initialization in test environment +let db: ReturnType; -const dbPath = path.join(dataDir, "gitea-mirror.db"); +if (process.env.NODE_ENV !== "test") { + // Define the database URL - for development we'll use a local SQLite file + const dataDir = path.join(process.cwd(), "data"); + // Ensure data directory exists + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); + } -// Create an empty database file if it doesn't exist -if (!fs.existsSync(dbPath)) { - fs.writeFileSync(dbPath, ""); -} + const dbPath = path.join(dataDir, "gitea-mirror.db"); -// Create SQLite database instance using Bun's native driver -let sqlite: Database; -try { - sqlite = new Database(dbPath); - console.log("Successfully connected to SQLite database using Bun's native driver"); -} catch (error) { - console.error("Error opening database:", error); - throw error; -} + // Create an empty database file if it doesn't exist + if (!fs.existsSync(dbPath)) { + fs.writeFileSync(dbPath, ""); + } -// Create drizzle instance with the SQLite client -export const db = drizzle({ client: sqlite }); - -/** - * Run Drizzle migrations - */ -function runDrizzleMigrations() { + // Create SQLite database instance using Bun's native driver + let sqlite: Database; try { - console.log("🔄 Checking for pending migrations..."); - - // Check if migrations table exists - const migrationsTableExists = sqlite - .query("SELECT name FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'") - .get(); - - if (!migrationsTableExists) { - console.log("📦 First time setup - running initial migrations..."); - } - - // Run migrations using Drizzle migrate function - migrate(db, { migrationsFolder: "./drizzle" }); - - console.log("✅ Database migrations completed successfully"); + sqlite = new Database(dbPath); + console.log("Successfully connected to SQLite database using Bun's native driver"); } catch (error) { - console.error("❌ Error running migrations:", error); + console.error("Error opening database:", error); throw error; } + + // Create drizzle instance with the SQLite client + db = drizzle({ client: sqlite }); + + /** + * Run Drizzle migrations + */ + function runDrizzleMigrations() { + try { + console.log("🔄 Checking for pending migrations..."); + + // Check if migrations table exists + const migrationsTableExists = sqlite + .query("SELECT name FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'") + .get(); + + if (!migrationsTableExists) { + console.log("📦 First time setup - running initial migrations..."); + } + + // Run migrations using Drizzle migrate function + migrate(db, { migrationsFolder: "./drizzle" }); + + console.log("✅ Database migrations completed successfully"); + } catch (error) { + console.error("❌ Error running migrations:", error); + throw error; + } + } + + // Run Drizzle migrations after db is initialized + runDrizzleMigrations(); } -// Run Drizzle migrations after db is initialized -runDrizzleMigrations(); +export { db }; // Export all table definitions from schema export { diff --git a/src/lib/gitea.ts b/src/lib/gitea.ts index fb4aedf..d10a195 100644 --- a/src/lib/gitea.ts +++ b/src/lib/gitea.ts @@ -480,6 +480,9 @@ export async function getOrCreateGiteaOrg({ try { console.log(`Attempting to get or create Gitea organization: ${orgName}`); + // Decrypt config tokens for API usage + const decryptedConfig = decryptConfigTokens(config as Config); + const orgRes = await fetch( `${config.giteaConfig.url}/api/v1/orgs/${orgName}`, { diff --git a/src/tests/setup.bun.ts b/src/tests/setup.bun.ts index 1de560d..7050445 100644 --- a/src/tests/setup.bun.ts +++ b/src/tests/setup.bun.ts @@ -3,16 +3,71 @@ * This file is automatically loaded before running tests */ -import { afterEach, beforeEach } from "bun:test"; +import { mock } from "bun:test"; -// Clean up after each test -afterEach(() => { - // Add any cleanup logic here +// Set NODE_ENV to test +process.env.NODE_ENV = "test"; + +// Mock the database module to prevent real database access during tests +mock.module("@/lib/db", () => { + const mockDb = { + select: () => ({ + from: () => ({ + where: () => ({ + limit: () => Promise.resolve([]) + }) + }) + }), + insert: () => ({ + values: () => Promise.resolve() + }), + update: () => ({ + set: () => ({ + where: () => Promise.resolve() + }) + }), + delete: () => ({ + where: () => Promise.resolve() + }) + }; + + return { + db: mockDb, + users: {}, + events: {}, + configs: {}, + repositories: {}, + mirrorJobs: {}, + organizations: {}, + sessions: {}, + accounts: {}, + verificationTokens: {}, + oauthApplications: {}, + oauthAccessTokens: {}, + oauthConsent: {}, + ssoProviders: {} + }; }); -// Setup before each test -beforeEach(() => { - // Add any setup logic here +// Mock drizzle-orm to prevent database migrations from running +mock.module("drizzle-orm/bun-sqlite/migrator", () => { + return { + migrate: () => {} + }; +}); + +// Mock config encryption utilities +mock.module("@/lib/utils/config-encryption", () => { + return { + decryptConfigTokens: (config: any) => { + // Return the config as-is for tests + return config; + }, + encryptConfigTokens: (config: any) => { + // Return the config as-is for tests + return config; + } + }; }); // Add DOM testing support if needed