/** * Fixture Test Utilities * * Provides functions for loading test fixtures and test data. * Centralizes fixture path resolution and test data loading. */ import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { parse as parseYaml } from 'yaml'; /** * Get fixture path * * Resolves path to fixture directory or file. * All fixtures are in ./test-fixtures/ directory. * * @param fixtureName - Fixture name (e.g., 'modules/artifact-test') * @returns Absolute path to fixture * * @example * ```typescript * const modulePath = getFixturePath('modules/artifact-test'); * // Returns: /absolute/path/to/celilo/backend/test-fixtures/modules/artifact-test * ``` */ export function getFixturePath(fixtureName: string): string { return join(process.cwd(), 'test-fixtures', fixtureName); } /** * Test values structure * * Mirrors test-values.yml structure. * Top-level keys: system, system_secrets, modules * Module values can include config and secrets */ export interface TestValues { system?: Record; system_secrets?: Record; modules?: Record>; } /** * Load test values from test-values.yml * * Loads test configuration and secrets from centralized test data file. * Use for integration tests that need realistic test data. * * @returns Test values object * * @example * ```typescript * const testValues = await loadTestValues(); * const caddy = testValues.modules?.caddy; * expect(caddy.config?.hostname).toBe('www'); * ``` */ export async function loadTestValues(): Promise { const testValuesPath = getFixturePath('test-values.yml'); const content = await readFile(testValuesPath, 'utf-8'); return parseYaml(content) as TestValues; } /** * Get module test configuration * * Retrieves configuration for specific module from test-values.yml. * Returns empty object if module not found. * Excludes 'secrets' key from returned config. * * @param moduleId - Module ID * @returns Module configuration * * @example * ```typescript * const config = await getModuleTestConfig('homebridge'); * expect(config.vmid).toBe(2110); * ``` */ export async function getModuleTestConfig(moduleId: string): Promise> { const testValues = await loadTestValues(); const moduleData = testValues.modules?.[moduleId]; if (!moduleData) { return {}; } // Return all data except 'secrets' const { secrets, ...config } = moduleData as Record & { secrets?: unknown; }; return config; } /** * Get module test secrets * * Retrieves secrets for specific module from test-values.yml. * Returns empty object if module not found or has no secrets. * * @param moduleId - Module ID * @returns Module secrets * * @example * ```typescript * const secrets = await getModuleTestSecrets('dns-external'); * expect(secrets.knot_ddns_tsig_secret).toBeTruthy(); * ``` */ export async function getModuleTestSecrets(moduleId: string): Promise> { const testValues = await loadTestValues(); const moduleData = testValues.modules?.[moduleId]; if (!moduleData) { return {}; } const secrets = (moduleData as Record).secrets; if (!secrets || typeof secrets !== 'object') { return {}; } return secrets as Record; } /** * Get system test configuration * * Retrieves system-wide configuration from test-values.yml. * * @returns System configuration * * @example * ```typescript * const config = await getSystemTestConfig(); * expect(config.dns).toBeDefined(); * ``` */ export async function getSystemTestConfig(): Promise> { const testValues = await loadTestValues(); return testValues.system ?? {}; } /** * Get system test secrets * * Retrieves system-wide secrets from test-values.yml. * * @returns System secrets * * @example * ```typescript * const secrets = await getSystemTestSecrets(); * // Note: Provider credentials are now per-service, not system-wide * expect(secrets).toBeDefined(); * ``` */ export async function getSystemTestSecrets(): Promise> { const testValues = await loadTestValues(); return testValues.system_secrets ?? {}; }