import 'dart:convert'; import 'dart:io'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; void main() { test('top-level help is in English', () async { final result = await _runCli(['--help']); expect(result.exitCode, 0, reason: result.stderr.toString()); expect(result.stdout.toString(), contains('Usage:')); expect(result.stdout.toString(), contains('Available commands:')); expect(result.stdout.toString(), contains('generate')); expect(result.stdout.toString(), isNot(contains('用法'))); }); test('generate help documents command options in English', () async { final result = await _runCli(['generate', '--help']); expect(result.exitCode, 0, reason: result.stderr.toString()); expect( result.stdout.toString(), contains('Generate API clients and models.'), ); expect(result.stdout.toString(), contains('--config')); expect(result.stdout.toString(), contains('--dry-run')); expect(result.stdout.toString(), contains('--watch')); expect(result.stdout.toString(), isNot(contains('显示帮助'))); }); test('invalid arguments report an English usage error', () async { final result = await _runCli(['--unknown']); expect(result.exitCode, 64); expect(result.stderr.toString(), startsWith('Error:')); expect(result.stderr.toString(), contains('Usage:')); }); test('generation failures are in English by default', () async { final directory = await Directory.systemTemp.createTemp( 'koi_swagger_parser_cli_missing_', ); addTearDown(() => directory.delete(recursive: true)); final missingConfig = p.join(directory.path, 'missing.yaml'); final result = await _runCli([ 'generate', '--config', missingConfig, ]); expect(result.exitCode, 1); expect(result.stderr.toString(), contains('Generation failed.')); expect( result.stderr.toString(), contains('Run with --verbose to see the underlying error.'), ); expect(result.stderr.toString(), isNot(contains('生成失败'))); }); test( 'generate --dry-run reports planned writes without touching output', () async { final directory = await Directory.systemTemp.createTemp( 'koi_swagger_parser_cli_', ); addTearDown(() => directory.delete(recursive: true)); final source = File(p.join(directory.path, 'openapi.json')); await source.writeAsString( jsonEncode({ 'openapi': '3.1.0', 'info': {'title': 'CLI', 'version': '1'}, 'paths': { '/health': { 'get': { 'operationId': 'health', 'responses': { '204': {'description': 'healthy'}, }, }, }, }, }), ); final output = p.join(directory.path, 'lib', 'src'); final config = File(p.join(directory.path, 'koi_swagger_parser.yaml')); await config.writeAsString(''' input: swagger_urls: - ${source.path} output: base_dir: $output api_dir: ${p.join(output, 'api')} models_dir: ${p.join(output, 'models')} formatting: run_dart_format: false '''); final result = await _runCli([ 'generate', '--config', config.path, '--dry-run', ]); expect(result.exitCode, 0, reason: result.stderr.toString()); expect(result.stdout.toString(), contains('dry-run:')); expect(result.stdout.toString(), contains('would be written')); expect(Directory(output).existsSync(), isFalse); }, ); } Future _runCli(List arguments) { return Process.run(Platform.resolvedExecutable, [ 'run', 'koi_swagger_parser', ...arguments, ], workingDirectory: Directory.current.path); }