amaran-light-cli
Version:
Command line tool for controlling Aputure Amaran lights via WebSocket to a local Amaran desktop app.
65 lines • 2.82 kB
JavaScript
import { spawnSync } from 'node:child_process';
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { CONFIG_DIR_ENV } from '../config.js';
function runCli(args, configDir) {
return spawnSync('npx', ['tsx', 'src/cli.ts', ...args], {
encoding: 'utf8',
env: {
...process.env,
[CONFIG_DIR_ENV]: configDir,
FORCE_COLOR: '0',
NODE_ENV: 'test',
},
});
}
describe('CLI config integration', () => {
let configDir;
let configPath;
beforeEach(() => {
mkdirSync('.test-storage', { recursive: true });
configDir = mkdtempSync(join(process.cwd(), '.test-storage', 'cli-config-'));
configPath = join(configDir, 'config.json');
});
afterEach(() => {
rmSync(configDir, { recursive: true, force: true });
});
it('shows help output', () => {
const proc = runCli(['--help'], configDir);
expect(proc.status).toBe(0);
expect(proc.stdout).toContain('Amaran Light Control CLI - v');
expect(proc.stdout).toContain('(dev)');
expect(proc.stdout).toContain('Usage: amaran-cli');
});
it('shows version output', () => {
const proc = runCli(['--version'], configDir);
expect(proc.status).toBe(0);
expect(proc.stdout.trim()).toMatch(/^\d+\.\d+\.\d+$/);
});
it('saves configuration to an isolated platform config file', () => {
const proc = runCli(['config', '--lat', '37.7749', '--lon', '-122.4194', '--debug', 'true'], configDir);
expect(proc.status).toBe(0);
expect(proc.stdout).toContain('Configuration saved successfully');
expect(existsSync(configPath)).toBe(true);
const config = JSON.parse(readFileSync(configPath, 'utf8'));
expect(config.latitude).toBe(37.7749);
expect(config.longitude).toBe(-122.4194);
expect(config.debug).toBe(true);
});
it('fails fast on invalid persisted configuration', () => {
mkdirSync(configDir, { recursive: true });
writeFileSync(configPath, JSON.stringify({ latitude: 200 }));
const proc = runCli(['config', '--show'], configDir);
expect(proc.status).toBe(1);
expect(proc.stderr).toContain('Failed to load config');
});
it('exits non-zero when config save fails', () => {
rmSync(configDir, { recursive: true, force: true });
writeFileSync(configDir, 'not a directory');
const proc = runCli(['config', '--debug', 'true'], configDir);
expect(proc.status).toBe(1);
expect(proc.stderr).toContain('Error saving configuration');
});
});
//# sourceMappingURL=cli.config.test.js.map