Governed substrate for autonomous agents: scoped identity (passports), audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
176 lines
5.5 KiB
JavaScript
176 lines
5.5 KiB
JavaScript
// Projects & 3-Level Structure Tests
|
|
|
|
process.env.TEST_MODE = 'true';
|
|
process.env.MASTER_ENCRYPTION_KEY = 'test_master_key_32_characters_long!';
|
|
|
|
import { describe, test, expect, beforeEach, afterEach } from 'vitest';
|
|
import { setupTestDatabase, cleanupTestDatabase } from './helpers/test-db.js';
|
|
import { dbGet, dbAll } from '../database/connection.js';
|
|
import { registerUser } from '../services/AuthService.js';
|
|
import {
|
|
createProject,
|
|
getProjectsByUser,
|
|
autoCreateDefaultProjects
|
|
} from '../services/ProjectService.js';
|
|
|
|
describe.skip('Projects - 3-Level Structure', () => {
|
|
beforeEach(async () => {
|
|
process.env.SKIP_DEV_USER = 'true'; // Don't create dev user in tests
|
|
await setupTestDatabase();
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await cleanupTestDatabase();
|
|
});
|
|
|
|
// Test 3.1: First user (owner) gets Admin Owner's Space
|
|
test('should auto-create Admin Owner\'s Space for first user', async () => {
|
|
const user = await registerUser({
|
|
email: 'owner@test.com',
|
|
password: 'Pass123',
|
|
name: 'Owner'
|
|
});
|
|
|
|
// Check if Admin Owner's Space was created
|
|
const projects = await dbAll('SELECT * FROM projects WHERE owner_id = ? AND type = ?',
|
|
[user.id, 'admin_owner_space']);
|
|
|
|
expect(projects.length).toBe(1);
|
|
expect(projects[0].name).toContain('Admin');
|
|
expect(projects[0].type).toBe('admin_owner_space');
|
|
expect(projects[0].icon).toBeDefined();
|
|
});
|
|
|
|
// Test 3.2: Every user gets Personal Space
|
|
test('should auto-create Personal Space for each user', async () => {
|
|
const user1 = await registerUser({
|
|
email: 'user1@test.com',
|
|
password: 'Pass123',
|
|
name: 'User 1'
|
|
});
|
|
|
|
const user2 = await registerUser({
|
|
email: 'user2@test.com',
|
|
password: 'Pass123',
|
|
name: 'User 2'
|
|
});
|
|
|
|
// Each should have Personal Space
|
|
const projects1 = await dbAll('SELECT * FROM projects WHERE owner_id = ? AND type = ?',
|
|
[user1.id, 'personal_space']);
|
|
const projects2 = await dbAll('SELECT * FROM projects WHERE owner_id = ? AND type = ?',
|
|
[user2.id, 'personal_space']);
|
|
|
|
expect(projects1.length).toBe(1);
|
|
expect(projects2.length).toBe(1);
|
|
expect(projects1[0].name).toContain('Personal');
|
|
expect(projects2[0].name).toContain('Personal');
|
|
});
|
|
|
|
// Test 3.3: Create custom project
|
|
test('should create custom project with theme colors', async () => {
|
|
const user = await registerUser({
|
|
email: 'custom@test.com',
|
|
password: 'Pass123',
|
|
name: 'Custom User'
|
|
});
|
|
|
|
const project = await createProject({
|
|
name: 'My Custom Project',
|
|
description: 'Test project',
|
|
icon: '🚀',
|
|
owner_id: user.id,
|
|
theme_primary: '#ff0000',
|
|
theme_secondary: '#00ff00',
|
|
theme_tertiary: '#0000ff'
|
|
});
|
|
|
|
expect(project.id).toBeDefined();
|
|
expect(project.name).toBe('My Custom Project');
|
|
expect(project.type).toBe('custom');
|
|
expect(project.icon).toBe('🚀');
|
|
expect(project.theme_primary).toBe('#ff0000');
|
|
expect(project.theme_secondary).toBe('#00ff00');
|
|
expect(project.theme_tertiary).toBe('#0000ff');
|
|
});
|
|
|
|
// Test 3.4: Get all projects for user
|
|
test('should get all projects for user (system + custom)', async () => {
|
|
const user = await registerUser({
|
|
email: 'multi@test.com',
|
|
password: 'Pass123',
|
|
name: 'Multi User'
|
|
});
|
|
|
|
// Create 2 custom projects
|
|
await createProject({ name: 'Project A', owner_id: user.id });
|
|
await createProject({ name: 'Project B', owner_id: user.id });
|
|
|
|
const projects = await getProjectsByUser(user.id);
|
|
|
|
// Should have: Admin Space (if first) OR Personal Space + 2 custom
|
|
expect(projects.length).toBeGreaterThanOrEqual(2);
|
|
|
|
const customProjects = projects.filter(p => p.type === 'custom');
|
|
expect(customProjects.length).toBe(2);
|
|
});
|
|
|
|
// Test 3.5: Default theme colors
|
|
test('should use default theme colors if not specified', async () => {
|
|
const user = await registerUser({
|
|
email: 'default@test.com',
|
|
password: 'Pass123',
|
|
name: 'Default User'
|
|
});
|
|
|
|
const project = await createProject({
|
|
name: 'Default Theme Project',
|
|
owner_id: user.id
|
|
});
|
|
|
|
expect(project.theme_primary).toBe('#0ea5e9');
|
|
expect(project.theme_secondary).toBe('#8b5cf6');
|
|
expect(project.theme_tertiary).toBe('#10b981');
|
|
});
|
|
});
|
|
|
|
describe.skip('Auto-Create Default Projects', () => {
|
|
beforeEach(async () => {
|
|
await setupTestDatabase();
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await cleanupTestDatabase();
|
|
});
|
|
|
|
// Test 3.6: autoCreateDefaultProjects function
|
|
test('should create Admin Space for first user, Personal Space for others', async () => {
|
|
// First user
|
|
const user1 = await registerUser({
|
|
email: 'first@test.com',
|
|
password: 'Pass123',
|
|
name: 'First'
|
|
});
|
|
|
|
const user1Projects = await getProjectsByUser(user1.id);
|
|
const hasAdminSpace = user1Projects.some(p => p.type === 'admin_owner_space');
|
|
const hasPersonalSpace = user1Projects.some(p => p.type === 'personal_space');
|
|
|
|
expect(hasAdminSpace).toBe(true);
|
|
expect(hasPersonalSpace).toBe(true); // Both
|
|
|
|
// Second user
|
|
const user2 = await registerUser({
|
|
email: 'second@test.com',
|
|
password: 'Pass123',
|
|
name: 'Second'
|
|
});
|
|
|
|
const user2Projects = await getProjectsByUser(user2.id);
|
|
const hasAdminSpace2 = user2Projects.some(p => p.type === 'admin_owner_space');
|
|
const hasPersonalSpace2 = user2Projects.some(p => p.type === 'personal_space');
|
|
|
|
expect(hasAdminSpace2).toBe(false); // No admin space
|
|
expect(hasPersonalSpace2).toBe(true); // Only personal
|
|
});
|
|
});
|