Complete OpenAPI 3.0/3.1 generation, diagnostics, lifecycle safety, enum and naming mappings, bilingual documentation, examples, and pub.dev release validation.
199 lines
5.4 KiB
Dart
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'),
|
|
),
|
|
),
|
|
);
|
|
});
|
|
});
|
|
}
|