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', '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> 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); }); }); }