-- WHOOSH Test Database Initialization Script -- Create test database extensions CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- Create basic test tables for integration testing -- Note: These are simplified versions for testing purposes -- Users table CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), username VARCHAR(100) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, hashed_password VARCHAR(255) NOT NULL, is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Projects table CREATE TABLE IF NOT EXISTS projects ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(255) NOT NULL, description TEXT, owner_id UUID REFERENCES users(id) ON DELETE CASCADE, gitea_repo_url VARCHAR(500), gitea_repo_id INTEGER, age_public_key TEXT, template_id VARCHAR(100), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Project members table CREATE TABLE IF NOT EXISTS project_members ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), project_id UUID REFERENCES projects(id) ON DELETE CASCADE, user_id UUID REFERENCES users(id) ON DELETE CASCADE, role VARCHAR(50) NOT NULL CHECK (role IN ('owner', 'maintainer', 'developer', 'viewer')), invited_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), accepted_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Templates table (for tracking template usage) CREATE TABLE IF NOT EXISTS template_usage ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), template_id VARCHAR(100) NOT NULL, project_id UUID REFERENCES projects(id) ON DELETE CASCADE, files_created INTEGER DEFAULT 0, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Insert test data INSERT INTO users (username, email, hashed_password) VALUES ('testuser', 'test@whoosh.dev', crypt('testpass123', gen_salt('bf'))), ('admin', 'admin@whoosh.dev', crypt('admin123', gen_salt('bf'))) ON CONFLICT (email) DO NOTHING; INSERT INTO projects (name, description, owner_id, template_id) VALUES ('Test Project 1', 'Integration test project', (SELECT id FROM users WHERE username = 'testuser'), 'fullstack-web-app'), ('Test Project 2', 'Template test project', (SELECT id FROM users WHERE username = 'admin'), 'react-fastapi') ON CONFLICT DO NOTHING; -- Create indexes for better performance CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id); CREATE INDEX IF NOT EXISTS idx_project_members_project_id ON project_members(project_id); CREATE INDEX IF NOT EXISTS idx_project_members_user_id ON project_members(user_id); CREATE INDEX IF NOT EXISTS idx_template_usage_project_id ON template_usage(project_id); -- Create test database functions CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ language 'plpgsql'; -- Create triggers for automatic timestamp updates CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_projects_updated_at BEFORE UPDATE ON projects FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Grant permissions GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO whoosh; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO whoosh; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO whoosh; -- Test data verification SELECT 'Database initialization completed successfully' as status; SELECT COUNT(*) as user_count FROM users; SELECT COUNT(*) as project_count FROM projects;