swagger_generator_flutter/test/template_renderer_test.dart

136 lines
4.1 KiB
Dart

import 'dart:io';
import 'package:swagger_generator_flutter/core/template_renderer.dart';
import 'package:test/test.dart';
void main() {
group('TemplateRenderer', () {
late TemplateRenderer renderer;
setUp(() {
renderer = TemplateRenderer();
});
test('renders file header template', () {
final result = renderer.render('common/file_header', {
'description': 'Test API',
'apiUrl': 'https://api.example.com',
});
expect(result, contains('Test API'));
expect(result, contains('https://api.example.com'));
expect(result, contains('xy_swagger_generator'));
});
test('renders imports template', () {
final result = renderer.render('common/imports', {
'imports': [
'package:dio/dio.dart',
'package:retrofit/retrofit.dart',
],
});
expect(result, contains("import 'package:dio/dio.dart';"));
expect(result, contains("import 'package:retrofit/retrofit.dart';"));
});
test('renders API class template', () {
final result = renderer.render('api/api_class', {
'description': 'User API',
'imports': ['package:dio/dio.dart'],
'className': 'UserApi',
'hasRestApi': true,
'baseUrl': 'https://api.example.com',
'hasRetrofit': true,
'docLines': ['User API 接口', '管理用户相关操作'],
'methods': [
{
'methodName': 'getUser',
'returnType': 'BaseResult<User>',
'docLines': ['获取用户信息'],
'annotations': ["@GET('/users/{id}')"],
'params': [
{'annotation': "@Path('id')", 'type': 'String', 'name': 'id'},
],
},
],
});
expect(result, contains('abstract class UserApi'));
expect(result, contains('@RestApi'));
expect(result, contains('factory UserApi'));
expect(result, contains('Future<BaseResult<User>> getUser'));
expect(result, contains("@GET('/users/{id}')"));
});
test('renders freezed model template', () {
final result = renderer.render('models/freezed_model', {
'description': 'User Model',
'className': 'User',
'partFile': 'user',
'docLines': ['用户模型'],
'properties': [
{
'name': 'id',
'type': 'String',
'required': true,
},
{
'name': 'name',
'type': 'String',
'required': true,
},
{
'name': 'email',
'type': 'String',
'nullable': true,
},
],
});
expect(result, contains('class User'));
expect(result, contains('@freezed'));
expect(result, contains('required String id'));
expect(result, contains('required String name'));
expect(result, contains('String? email'));
});
test('renders enum model template', () {
final result = renderer.render('models/enum_model', {
'description': 'User Status',
'className': 'UserStatus',
'docLines': ['用户状态枚举'],
'valueType': 'String',
'values': [
{'name': 'active', 'value': "'active'"},
{'name': 'inactive', 'value': "'inactive'"},
],
});
expect(result, contains('enum UserStatus'));
expect(result, contains('@JsonEnum()'));
expect(result, contains('active'));
expect(result, contains('inactive'));
});
test('prefers file template over embedded templates', () async {
final tempDir = await Directory.systemTemp.createTemp('tmpl_test');
final customHeader = File(
'${tempDir.path}/common/file_header.mustache',
);
await customHeader.create(recursive: true);
await customHeader.writeAsString('// from file {{description}}');
final fileRenderer = TemplateRenderer(templateRoot: tempDir.path);
final result = fileRenderer.render('common/file_header', {
'description': 'Custom',
'apiUrl': 'https://api.example.com',
});
expect(result, contains('from file Custom'));
await tempDir.delete(recursive: true);
});
});
}