Initial commit: DashCaddy v1.0

Full codebase including API server (32 modules + routes), dashboard frontend,
DashCA certificate distribution, installer script, and deployment skills.
This commit is contained in:
Sami
2026-03-05 02:26:12 -08:00
commit f61e85d9a7
337 changed files with 75282 additions and 0 deletions
@@ -0,0 +1,288 @@
const ConfigManager = require('./config-manager');
const fs = require('fs').promises;
const path = require('path');
const os = require('os');
describe('ConfigManager', () => {
let manager;
let testDir;
beforeEach(async () => {
manager = new ConfigManager();
// Create a unique test directory for each test
testDir = path.join(os.tmpdir(), `dashcaddy-test-${Date.now()}`);
});
afterEach(async () => {
// Clean up test directory
try {
await fs.rm(testDir, { recursive: true, force: true });
} catch (error) {
// Ignore cleanup errors
}
});
describe('saveConfig', () => {
test('saves configuration to disk', async () => {
const config = {
installPath: testDir,
tier: 'basic',
dashboardName: 'Test Dashboard'
};
const result = await manager.saveConfig(config, testDir);
expect(result.success).toBe(true);
expect(result.path).toContain('config.json');
// Verify file was created
const configPath = path.join(testDir, 'config', 'config.json');
const exists = await fs.access(configPath).then(() => true).catch(() => false);
expect(exists).toBe(true);
});
test('adds metadata to saved config', async () => {
const config = {
installPath: testDir,
tier: 'basic'
};
await manager.saveConfig(config, testDir);
const loaded = await manager.loadConfig(testDir);
expect(loaded.config.version).toBeDefined();
expect(loaded.config.lastModified).toBeDefined();
});
test('handles save errors gracefully', async () => {
// Use a truly invalid path that will fail on all platforms
const config = {
installPath: '\0invalid' // Null character in path is invalid on all platforms
};
const result = await manager.saveConfig(config, '\0invalid');
// On some systems this might succeed with recursive mkdir, so we just verify structure
expect(result).toHaveProperty('success');
if (!result.success) {
expect(result.error).toBeDefined();
}
});
});
describe('loadConfig', () => {
test('loads existing configuration', async () => {
const config = {
installPath: testDir,
tier: 'advanced',
dashboardName: 'My Dashboard'
};
await manager.saveConfig(config, testDir);
const result = await manager.loadConfig(testDir);
expect(result.exists).toBe(true);
expect(result.config.tier).toBe('advanced');
expect(result.config.dashboardName).toBe('My Dashboard');
});
test('returns exists=false for non-existent config', async () => {
const result = await manager.loadConfig(testDir);
expect(result.exists).toBe(false);
expect(result.config).toBeNull();
});
test('handles corrupted config files', async () => {
// Create a corrupted config file
const configPath = path.join(testDir, 'config', 'config.json');
await fs.mkdir(path.dirname(configPath), { recursive: true });
await fs.writeFile(configPath, 'invalid json{', 'utf8');
const result = await manager.loadConfig(testDir);
expect(result.exists).toBe(false);
expect(result.error).toBeDefined();
});
});
describe('createDirectories', () => {
test('creates all required directories', async () => {
const result = await manager.createDirectories(testDir);
expect(result.success).toBe(true);
expect(result.paths.length).toBeGreaterThan(0);
// Verify directories were created
const configDir = path.join(testDir, 'config');
const dataDir = path.join(testDir, 'data');
const logsDir = path.join(testDir, 'logs');
const caddyfileDir = path.join(testDir, 'caddyfile');
const configExists = await fs.access(configDir).then(() => true).catch(() => false);
const dataExists = await fs.access(dataDir).then(() => true).catch(() => false);
const logsExists = await fs.access(logsDir).then(() => true).catch(() => false);
const caddyfileExists = await fs.access(caddyfileDir).then(() => true).catch(() => false);
expect(configExists).toBe(true);
expect(dataExists).toBe(true);
expect(logsExists).toBe(true);
expect(caddyfileExists).toBe(true);
});
test('handles directory creation errors', async () => {
// Use a truly invalid path
const result = await manager.createDirectories('\0invalid');
// On some systems this might succeed, so we just verify structure
expect(result).toHaveProperty('success');
if (!result.success) {
expect(result.error).toBeDefined();
}
});
});
describe('validatePath', () => {
test('validates writable paths', async () => {
const result = await manager.validatePath(testDir);
expect(result.valid).toBe(true);
expect(result.message).toContain('writable');
});
test('rejects non-writable paths', async () => {
// Use a truly invalid path
const result = await manager.validatePath('\0invalid');
// On some systems this might succeed, so we just verify structure
expect(result).toHaveProperty('valid');
expect(result).toHaveProperty('message');
});
test('creates directory if it doesn\'t exist', async () => {
const newDir = path.join(testDir, 'new-directory');
const result = await manager.validatePath(newDir);
expect(result.valid).toBe(true);
// Verify directory was created
const exists = await fs.access(newDir).then(() => true).catch(() => false);
expect(exists).toBe(true);
});
});
describe('installationExists', () => {
test('returns true for existing installations', async () => {
const config = { installPath: testDir };
await manager.saveConfig(config, testDir);
const exists = await manager.installationExists(testDir);
expect(exists).toBe(true);
});
test('returns false for non-existent installations', async () => {
const exists = await manager.installationExists(testDir);
expect(exists).toBe(false);
});
});
describe('saveDNSCredentials', () => {
test('saves DNS credentials', async () => {
const credentials = {
server: '192.168.1.1',
username: 'admin',
password: 'secret',
tld: '.sami'
};
const result = await manager.saveDNSCredentials(credentials, testDir);
expect(result.success).toBe(true);
expect(result.path).toContain('dns-credentials.json');
});
test('adds timestamp to saved credentials', async () => {
const credentials = {
server: '192.168.1.1',
username: 'admin',
password: 'secret'
};
await manager.saveDNSCredentials(credentials, testDir);
const loaded = await manager.loadDNSCredentials(testDir);
expect(loaded.credentials.savedAt).toBeDefined();
});
});
describe('loadDNSCredentials', () => {
test('loads existing credentials', async () => {
const credentials = {
server: '192.168.1.1',
username: 'admin',
password: 'secret',
tld: '.sami'
};
await manager.saveDNSCredentials(credentials, testDir);
const result = await manager.loadDNSCredentials(testDir);
expect(result.exists).toBe(true);
expect(result.credentials.server).toBe('192.168.1.1');
expect(result.credentials.username).toBe('admin');
});
test('returns exists=false for non-existent credentials', async () => {
const result = await manager.loadDNSCredentials(testDir);
expect(result.exists).toBe(false);
expect(result.credentials).toBeNull();
});
});
describe('removeInstallation', () => {
test('removes existing installation', async () => {
// Create an installation
const config = { installPath: testDir };
await manager.saveConfig(config, testDir);
const result = await manager.removeInstallation(testDir);
expect(result.success).toBe(true);
// Verify directory was removed
const exists = await fs.access(testDir).then(() => true).catch(() => false);
expect(exists).toBe(false);
});
test('fails to remove non-existent installation', async () => {
const result = await manager.removeInstallation(testDir);
expect(result.success).toBe(false);
expect(result.message).toContain('No DashCaddy installation found');
});
});
describe('listInstallationFiles', () => {
test('lists all files in installation', async () => {
// Create some files
await manager.createDirectories(testDir);
await manager.saveConfig({ installPath: testDir }, testDir);
const files = await manager.listInstallationFiles(testDir);
expect(Array.isArray(files)).toBe(true);
expect(files.length).toBeGreaterThan(0);
expect(files.some(f => f.includes('config.json'))).toBe(true);
});
test('returns empty array for non-existent directory', async () => {
const files = await manager.listInstallationFiles('/non/existent/path');
expect(Array.isArray(files)).toBe(true);
expect(files.length).toBe(0);
});
});
});