repositoryTestTemplate function

String repositoryTestTemplate(
  1. String name,
  2. String className,
  3. bool useFreezed
)

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