Migrate database from SQLite to PostgreSQL

- Replace SQLite with PostgreSQL using Neon as provider
- Add environment-based database URL configuration
- Create separate test database setup with DATABASE_URL_TEST
- Reset migration history and generate fresh PostgreSQL schema
- Add comprehensive migration documentation
- Include database unit tests for connection validation
This commit is contained in:
Max Kowalski
2025-06-27 21:25:48 +02:00
parent 6f9ac219c2
commit 185bb6da58
7 changed files with 442 additions and 186 deletions

View File

@ -0,0 +1,77 @@
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import { PrismaClient } from '@prisma/client';
describe('Database Configuration', () => {
let prisma: PrismaClient;
beforeAll(() => {
prisma = new PrismaClient();
});
afterAll(async () => {
await prisma.$disconnect();
});
it('should connect to the test database', async () => {
// Verify we can connect to the database
const result = await prisma.$queryRaw`SELECT 1 as test`;
expect(result).toBeDefined();
});
it('should use PostgreSQL as the database provider', async () => {
// Query the database to verify it's PostgreSQL
const result = await prisma.$queryRaw`SELECT version()` as any[];
expect(result[0].version).toContain('PostgreSQL');
});
it('should be using the test database URL', () => {
// Verify that DATABASE_URL is set to the test database
expect(process.env.DATABASE_URL).toBeDefined();
expect(process.env.DATABASE_URL).toContain('postgresql://');
// If DATABASE_URL_TEST is set, DATABASE_URL should match it (from our test setup)
if (process.env.DATABASE_URL_TEST) {
expect(process.env.DATABASE_URL).toBe(process.env.DATABASE_URL_TEST);
}
});
it('should have all required tables', async () => {
// Verify all our tables exist
const tables = await prisma.$queryRaw`
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_type = 'BASE TABLE'
ORDER BY table_name
` as any[];
const tableNames = tables.map(t => t.table_name);
expect(tableNames).toContain('Company');
expect(tableNames).toContain('User');
expect(tableNames).toContain('Session');
expect(tableNames).toContain('SessionImport');
expect(tableNames).toContain('Message');
expect(tableNames).toContain('Question');
expect(tableNames).toContain('SessionQuestion');
expect(tableNames).toContain('AIProcessingRequest');
});
it('should be able to create and query data', async () => {
// Test basic CRUD operations
const company = await prisma.company.create({
data: {
name: 'Test Company',
csvUrl: 'https://example.com/test.csv',
},
});
expect(company.id).toBeDefined();
expect(company.name).toBe('Test Company');
// Clean up
await prisma.company.delete({
where: { id: company.id },
});
});
});