import 'dart:io'; import 'package:koi_swagger_parser/koi_swagger_parser.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; void main() { group('KoiSwaggerConfigLoader', () { test('兼容旧版 generator_config.yaml 字段', () async { final tempDir = await Directory.systemTemp.createTemp( 'koi_swagger_parser_config_', ); addTearDown(() => tempDir.delete(recursive: true)); final configFile = File(p.join(tempDir.path, 'generator_config.yaml')); await configFile.writeAsString(''' input: swagger_urls: - url: ./openapi.json enabled: true output: base_dir: ./lib/src api_dir: ./lib/src/api models_dir: ./lib/src/api_models included_tags: - stores generation: api: enabled: true use_retrofit: true cancel_token_support: true base_result_import: package:dba_network/dba_network.dart client: class_name: DbaApiClient file_name: dba_api_client models: enabled: true class_prefix: Koi default_non_nullable_list_to_empty: true json_serializable: checked: true explicit_to_json: true include_if_null: false formatting: run_dart_format: false '''); final config = await KoiSwaggerConfig.load( workingDirectory: tempDir.path, ); expect(config.input.swaggerUrls, [ p.join(tempDir.path, 'openapi.json'), ]); expect(config.output.includedTags, ['stores']); expect( config.generation.api.responseWrapper.mode, ResponseWrapperMode.externalGeneric, ); expect( config.generation.api.responseWrapper.externalImport, 'package:dba_network/dba_network.dart', ); expect( config.generation.api.responseWrapper.externalClassName, 'BaseResult', ); expect(config.generation.api.cancelTokenSupport, isTrue); expect(config.generation.preset.name, 'koi_flutter'); expect(config.generation.models.classPrefix, 'Koi'); expect(config.generation.formatting.runDartFormat, isFalse); }); test('解析生命周期、过滤与 build_runner 配置', () async { final tempDir = await Directory.systemTemp.createTemp( 'koi_swagger_parser_config_lifecycle_', ); addTearDown(() => tempDir.delete(recursive: true)); await File(p.join(tempDir.path, 'koi_swagger_parser.yaml')).writeAsString( ''' input: swagger_urls: - ./openapi.json output: included_paths: - /api/** excluded_operations: - regex:^DELETE\\s included_models: - '*Response' clean_stale_files: false skip_if_unchanged: false manifest_path: ./.generated/koi.json generation: api: enabled: true models: enabled: true formatting: run_dart_format: false run_build_runner: true build_runner_mode: watch delete_conflicting_outputs: false ''', ); final config = await KoiSwaggerConfig.load( workingDirectory: tempDir.path, ); expect(config.output.includedPaths, ['/api/**']); expect(config.output.excludedOperations, [r'regex:^DELETE\s']); expect(config.output.includedModels, ['*Response']); expect(config.output.cleanStaleFiles, isFalse); expect(config.output.skipIfUnchanged, isFalse); expect( config.output.manifestPath, p.join(tempDir.path, '.generated', 'koi.json'), ); expect(config.generation.formatting.runBuildRunner, isTrue); expect( config.generation.formatting.buildRunnerMode, BuildRunnerMode.watch, ); expect(config.generation.formatting.deleteConflictingOutputs, isFalse); }); test('错误标量类型和无效 regex 产生结构化诊断', () async { final tempDir = await Directory.systemTemp.createTemp( 'koi_swagger_parser_config_invalid_', ); addTearDown(() => tempDir.delete(recursive: true)); final configFile = File(p.join(tempDir.path, 'koi_swagger_parser.yaml')); await configFile.writeAsString(''' input: swagger_urls: - url: ./openapi.json enabled: yes output: split_by_tags: wrong included_paths: - regex:[ generation: api: enabled: true models: enabled: true '''); await expectLater( KoiSwaggerConfig.load(workingDirectory: tempDir.path), throwsA( isA().having( (error) => error.diagnostics.map((item) => item.code), 'diagnostic codes', containsAll([ 'config.invalid_boolean', 'config.invalid_filter_regex', ]), ), ), ); }); test('API enabled 时明确拒绝未实现的非 Retrofit renderer', () async { final tempDir = await Directory.systemTemp.createTemp( 'koi_swagger_parser_config_renderer_', ); addTearDown(() => tempDir.delete(recursive: true)); await File(p.join(tempDir.path, 'koi_swagger_parser.yaml')).writeAsString( ''' input: swagger_urls: - ./openapi.json generation: api: enabled: true use_retrofit: false models: enabled: true ''', ); await expectLater( KoiSwaggerConfig.load(workingDirectory: tempDir.path), throwsA( isA().having( (error) => error.diagnostics.map((item) => item.code), 'diagnostic codes', contains('config.unsupported_api_renderer'), ), ), ); }); }); }