Files
koi_swagger_parser/test/config_loader_test.dart
mr.koi 454e6c51d7 Release 0.2.0
Complete OpenAPI 3.0/3.1 generation, diagnostics, lifecycle safety, enum and naming mappings, bilingual documentation, examples, and pub.dev release validation.
2026-07-31 16:47:39 +08:00

199 lines
5.4 KiB
Dart

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, <String>[
p.join(tempDir.path, 'openapi.json'),
]);
expect(config.output.includedTags, <String>['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, <String>['/api/**']);
expect(config.output.excludedOperations, <String>[r'regex:^DELETE\s']);
expect(config.output.includedModels, <String>['*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<KoiDiagnosticException>().having(
(error) => error.diagnostics.map((item) => item.code),
'diagnostic codes',
containsAll(<String>[
'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<KoiDiagnosticException>().having(
(error) => error.diagnostics.map((item) => item.code),
'diagnostic codes',
contains('config.unsupported_api_renderer'),
),
),
);
});
});
}