import type { DoctorContext, TestResult } from './types.js'; /** * Result from running a CLI command. */ interface CommandResult { /** The full command that was run. */ command: string; /** Exit code (0 = success). */ exitCode: number; /** Standard output. */ stdout: string; /** Standard error. */ stderr: string; /** Combined output (stdout + stderr). */ output: string; /** Whether the command succeeded (exitCode === 0). */ success: boolean; } /** * Base class for doctor test suites. * * Write tests using the test() method. * * ```typescript * export default class MyTests extends DoctorSuite { * static description = 'My test suite' * * tests() { * this.test('basic case', async () => { * const result = await this.run('shopify theme init') * this.assertSuccess(result) * }) * * this.test('error case', async () => { * const result = await this.run('shopify theme init --invalid') * this.assertError(result, /unknown flag/) * }) * } * } * ``` */ export declare abstract class DoctorSuite { static description: string; protected context: TContext; private assertions; private registeredTests; /** * Run the entire test suite. * * @param context - The doctor context for this suite run. * @returns The list of test results. */ runSuite(context: TContext): Promise; /** * Register a test with a name and function. * * @param name - The test name. * @param fn - The async test function. */ protected test(name: string, fn: () => Promise): void; /** * Override this method to register tests using this.test(). */ protected tests(): void; /** * Run a CLI command and return the result. * * @param command - The CLI command to run. * @param options - Optional overrides. * @param options.cwd - Working directory for the command. * @param options.env - Environment variables for the command. * @example * const result = await this.run('shopify theme init my-theme') * const result = await this.run('shopify theme push --json') */ protected run(command: string, options?: { cwd?: string; env?: { [key: string]: string; }; }): Promise; /** * Run a command without capturing output (for interactive commands). * Returns only success/failure. * * @param command - The CLI command to run. * @param options - Optional overrides. * @param options.cwd - Working directory for the command. * @param options.env - Environment variables for the command. */ protected runInteractive(command: string, options?: { cwd?: string; env?: { [key: string]: string; }; }): Promise; /** * Assert that a command succeeded (exit code 0). * * @param result - The command result to check. * @param message - Optional custom assertion message. */ protected assertSuccess(result: CommandResult, message?: string): void; /** * Assert that a command failed with an error matching the pattern. * * @param result - The command result to check. * @param pattern - Optional regex or string pattern to match against output. * @param message - Optional custom assertion message. */ protected assertError(result: CommandResult, pattern?: RegExp | string, message?: string): void; /** * Assert that a file exists and optionally matches content. * * @param path - The file path to check. * @param contentPattern - Optional regex or string to match file content. * @param message - Optional custom assertion message. */ protected assertFile(path: string, contentPattern?: RegExp | string, message?: string): Promise; /** * Assert that a file does not exist. * * @param path - The file path to check. * @param message - Optional custom assertion message. */ protected assertNoFile(path: string, message?: string): Promise; /** * Assert that a directory exists. * * @param path - The directory path to check. * @param message - Optional custom assertion message. */ protected assertDirectory(path: string, message?: string): Promise; /** * Assert that output contains a pattern. * * @param result - The command result to check. * @param pattern - Regex or string pattern to match against output. * @param message - Optional custom assertion message. */ protected assertOutput(result: CommandResult, pattern: RegExp | string, message?: string): void; /** * Assert that output contains valid JSON and optionally validate it. * * @param result - The command result to parse. * @param validator - Optional function to validate the parsed JSON. * @param message - Optional custom assertion message. */ protected assertJson(result: CommandResult, validator?: (json: T) => boolean, message?: string): T | undefined; /** * Assert a boolean condition. * * @param condition - The boolean condition to assert. * @param message - The assertion description. */ protected assert(condition: boolean, message: string): void; /** * Assert two values are equal. * * @param actual - The actual value. * @param expected - The expected value. * @param message - The assertion description. */ protected assertEqual(actual: T, expected: T, message: string): void; private hasFailures; } export {};