godcrm/backend/tests/projects.test.js
GOD CRM Release f89e074dd1
Some checks failed
CI / Lint / Typecheck / Test / Build (push) Has been cancelled
CI / PostgreSQL Integration Tests (push) Has been cancelled
GOD CRM — public scrubbed snapshot
Governed substrate for autonomous agents: scoped identity (passports),
audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
2026-08-10 04:01:45 +03:00

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
});
});