repositoryTestTemplate function
Implementation
String repositoryTestTemplate(String name, String className, bool useFreezed) =>
'''
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import '../../../../../lib/features/$name/data/datasources/${name}_remote_datasource.dart';
import '../../../../../lib/features/$name/data/datasources/${name}_local_datasource.dart';
import '../../../../../lib/features/$name/data/repositories/${name}_repository_impl.dart';
import '../../../../../lib/features/$name/data/models/${name}_model.dart';
import '../../../../../lib/features/$name/domain/entities/${name}_entity.dart';
class Mock${className}RemoteDataSource extends Mock implements ${className}RemoteDataSource {}
class Mock${className}LocalDataSource extends Mock implements ${className}LocalDataSource {}
void main() {
late ${className}RepositoryImpl repository;
late Mock${className}RemoteDataSource mockRemoteDataSource;
late Mock${className}LocalDataSource mockLocalDataSource;
setUp(() {
mockRemoteDataSource = Mock${className}RemoteDataSource();
mockLocalDataSource = Mock${className}LocalDataSource();
repository = ${className}RepositoryImpl(
mockRemoteDataSource,
mockLocalDataSource,
);
});
group('${className}Repository', () {
${useFreezed ? '''
const t${className}Model = ${className}Model(
id: '123',
name: 'Test Name',
description: 'Test Description',
);
''' : '''
const t${className}Model = ${className}Model(id: '123');
'''}
test('should return entity from remote data source when call is successful', () async {
when(() => mockRemoteDataSource.fetchData())
.thenAnswer((_) async => t${className}Model);
when(() => mockLocalDataSource.cacheData(any()))
.thenAnswer((_) async {});
final result = await repository.fetchData();
expect(result, isA<${className}Entity>());
expect(result.id, '123');
${useFreezed ? '''
expect(result.name, 'Test Name');
expect(result.description, 'Test Description');
''' : ''}
verify(() => mockRemoteDataSource.fetchData()).called(1);
verify(() => mockLocalDataSource.cacheData(t${className}Model)).called(1);
});
test('should return cached data when remote call fails', () async {
when(() => mockRemoteDataSource.fetchData()).thenThrow(Exception());
when(() => mockLocalDataSource.fetchCachedData())
.thenAnswer((_) async => t${className}Model);
final result = await repository.fetchData();
expect(result, isA<${className}Entity>());
expect(result.id, '123');
verify(() => mockRemoteDataSource.fetchData()).called(1);
verify(() => mockLocalDataSource.fetchCachedData()).called(1);
});
test('should throw exception when both remote and local calls fail', () async {
when(() => mockRemoteDataSource.fetchData()).thenThrow(Exception());
when(() => mockLocalDataSource.fetchCachedData())
.thenAnswer((_) async => null);
expect(() => repository.fetchData(), throwsA(isA<Exception>()));
verify(() => mockRemoteDataSource.fetchData()).called(1);
verify(() => mockLocalDataSource.fetchCachedData()).called(1);
});
});
}
''';