LCOV - code coverage report
Current view: top level - data/repositories - movies_repository_imp.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 38 38 100.0 %
Date: 2026-03-02 18:37:46 Functions: 0 0 -

          Line data    Source code
       1             : import 'package:tech_proof/core/error/failure.dart';
       2             : import 'package:tech_proof/core/error/logger_service.dart';
       3             : import 'package:tech_proof/core/network/safe_call.dart';
       4             : import 'package:tech_proof/data/mappers/movie_mapper.dart';
       5             : import 'package:tech_proof/data/mappers/popular_movies_mapper.dart';
       6             : import 'package:tech_proof/data/mappers/search_response_mapper.dart';
       7             : import 'package:tech_proof/data/models/movie_detail_model.dart';
       8             : import 'package:tech_proof/data/models/popular_movies_model.dart';
       9             : import 'package:tech_proof/data/models/search_response_model.dart';
      10             : import 'package:tech_proof/domain/entities/movie_entity.dart';
      11             : import 'package:tech_proof/domain/entities/popular_movies_entity.dart';
      12             : import 'package:tech_proof/domain/entities/search_response_entity.dart';
      13             : import 'package:tech_proof/domain/repositories/movies_repository.dart';
      14             : import 'package:dartz/dartz.dart';
      15             : import 'package:dio/dio.dart';
      16             : 
      17             : class MovieRepositoryImpl implements MovieRepository {
      18             :   final Dio dio;
      19             : 
      20           1 :   MovieRepositoryImpl(this.dio);
      21             : 
      22           1 :   @override
      23             :   Future<Either<Failure, PopularMoviesResponseEntity>> getPopularMovies({
      24             :     int page = 1,
      25             :   }) async {
      26           2 :     final response = await safeCall(() async {
      27           2 :       final response = await dio.get(
      28             :         "/movie/popular",
      29           1 :         queryParameters: {"page": page},
      30             :       );
      31           1 :       return response.data;
      32             :     });
      33             :     PopularMoviesResponseModel? model;
      34           2 :     response.fold((l) {
      35           1 :       LoggerService.error("Repository", 'Failed to parse popular movies');
      36           1 :       return UnexpectedFailure('message');
      37           2 :     }, (r) => model = PopularMoviesResponseModel.fromJson(r));
      38             :     if (model == null) {
      39           1 :       LoggerService.error("Repository", 'Failed to parse popular movies');
      40             : 
      41           2 :       return Left(UnexpectedFailure("Failed to parse popular movies"));
      42             :     } else {
      43           1 :       final modelEntity = model!.toEntity();
      44           1 :       return Right(modelEntity);
      45             :     }
      46             :   }
      47             : 
      48           1 :   @override
      49             :   Future<Either<Failure, SearchResponseEntity>> searchMovies({
      50             :     required String query,
      51             :     int page = 1,
      52             :   }) async {
      53           2 :     final response = await safeCall(() async {
      54           2 :       final response = await dio.get(
      55             :         "/search/movie",
      56           1 :         queryParameters: {"query": query, "page": page},
      57             :       );
      58           1 :       return response.data;
      59             :     });
      60             :     SearchResponseModel? model;
      61             : 
      62           2 :     response.fold((l) {
      63           1 :       LoggerService.error("Repository", 'Failed to parse search results');
      64           1 :       return UnexpectedFailure('message');
      65           2 :     }, (r) => model = SearchResponseModel.fromJson(r));
      66             : 
      67             :     if (model == null) {
      68           1 :       LoggerService.error("Repository", 'Failed to parse search results');
      69           2 :       return Left(UnexpectedFailure("Failed to parse search results"));
      70             :     } else {
      71           1 :       final modelEntity = model!.toEntity();
      72           1 :       return Right(modelEntity);
      73             :     }
      74             :   }
      75             : 
      76           1 :   @override
      77             :   Future<Either<Failure, MovieEntity>> getMovie({required int id}) async {
      78           2 :     final response = await safeCall(() async {
      79           3 :       final response = await dio.get("/movie/$id");
      80           1 :       return response.data;
      81             :     });
      82             :     MovieDetail? model;
      83           2 :     response.fold((l) {
      84           1 :       LoggerService.error("Repository", 'Failed to parse movie details');
      85           1 :       return UnexpectedFailure('message');
      86           2 :     }, (r) => model = MovieDetail.fromJson(r));
      87             :     if (model != null) {
      88           2 :       return Right(model!.toEntity());
      89             :     } else {
      90           1 :       LoggerService.error("Repository", 'Failed to parse movie details');
      91           2 :       return Left(UnexpectedFailure("Failed to parse movie details"));
      92             :     }
      93             :   }
      94             : }

Generated by: LCOV version 1.14