controllerTestTemplate function
Implementation
String controllerTestTemplate(String feature, String pascal, String camel) =>
'''
import 'package:flutter_test/flutter_test.dart';
import 'package:karna_mvc/core/errors/app_exception.dart';
import 'package:karna_mvc/core/result/result.dart';
import 'package:karna_mvc/features/$feature/controller/${feature}_controller.dart';
import 'package:karna_mvc/features/$feature/model/${feature}_model.dart';
import 'package:karna_mvc/features/$feature/repository/${feature}_repository.dart';
class Mock${pascal}Repository implements ${pascal}Repository {
Result<${pascal}Model>? modelResult;
Result<List<${pascal}Model>>? listResult;
Result<${pascal}Model>? cacheResult;
Result<${pascal}Model>? remoteResult;
@override
Future<Result<${pascal}Model>> getById(String id) async => modelResult!;
@override
Future<Result<List<${pascal}Model>>> getAll() async => listResult!;
@override
Future<Result<${pascal}Model>> getFromCache(String id) async => cacheResult!;
@override
Future<Result<${pascal}Model>> getFromRemote(String id) async => remoteResult!;
}
void main() {
late Mock${pascal}Repository mockRepo;
late ${pascal}Controller controller;
setUp(() {
mockRepo = Mock${pascal}Repository();
controller = ${pascal}Controller(repository: mockRepo);
});
test('loadAll sets list on success', () async {
mockRepo.listResult = Success([${pascal}Model(id: '1'), ${pascal}Model(id: '2')]);
await controller.loadAll();
expect(controller.${camel}List.length, equals(2));
expect(controller.isLoading, isFalse);
});
test('loadById sets data on cache hit', () async {
mockRepo.cacheResult = Success(${pascal}Model(id: '1'));
await controller.loadById('1');
expect(controller.$camel?.id, equals('1'));
});
test('loadById sets error on failure', () async {
mockRepo.cacheResult = const Failure(CacheException(message: 'miss', code: 'CACHE_MISS'));
mockRepo.remoteResult = const Failure(NetworkException(message: 'No connection', code: 'NO_CONNECTION'));
await controller.loadById('1');
expect(controller.hasError, isTrue);
});
}
''';