Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions lib/feature/data/repository/news/news_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:flutter_news_app/core/error/failure.dart';
import 'package:flutter_news_app/core/network/network_info.dart';
import 'package:flutter_news_app/feature/data/datasource/news/news_remote_data_source.dart';
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
import 'package:flutter_news_app/feature/domain/repository/news/news_repository.dart';
import 'package:meta/meta.dart';

class NewsRepositoryImpl implements NewsRepository {
final NewsRemoteDataSource newsRemoteDataSource;
final NetworkInfo networkInfo;

NewsRepositoryImpl({
@required this.newsRemoteDataSource,
@required this.networkInfo,
});

@override
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews() async {
var isConnected = await networkInfo.isConnected;
if (isConnected) {
try {
var response = await newsRemoteDataSource.getTopHeadlinesNews();
return Right(response);
} on DioError catch (error) {
return Left(ServerFailure(error.message));
}
} else {
return Left(ConnectionFailure());
}
}
}
9 changes: 9 additions & 0 deletions lib/feature/domain/repository/news/news_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_news_app/core/error/failure.dart';
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';

abstract class NewsRepository {

Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews();

}
112 changes: 112 additions & 0 deletions test/feature/data/repository/news/news_repository_impl_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import 'dart:convert';

import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:flutter_news_app/core/error/failure.dart';
import 'package:flutter_news_app/core/network/network_info.dart';
import 'package:flutter_news_app/feature/data/datasource/news/news_remote_data_source.dart';
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
import 'package:flutter_news_app/feature/data/repository/news/news_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

import '../../../../fixture/fixture_reader.dart';

class MockNewsRemoteDataSource extends Mock implements NewsRemoteDataSource {}

class MockNetworkInfo extends Mock implements NetworkInfo {}

void main() {
NewsRepositoryImpl newsRepositoryImpl;
MockNewsRemoteDataSource mockNewsRemoteDataSource;
MockNetworkInfo mockNetworkInfo;

setUp(() {
mockNewsRemoteDataSource = MockNewsRemoteDataSource();
mockNetworkInfo = MockNetworkInfo();
newsRepositoryImpl = NewsRepositoryImpl(
newsRemoteDataSource: mockNewsRemoteDataSource,
networkInfo: mockNetworkInfo,
);
});

void setUpMockNetworkConnected() {
when(mockNetworkInfo.isConnected).thenAnswer((_) async => true);
}

void setUpMockNetworkDisconnected() {
when(mockNetworkInfo.isConnected).thenAnswer((_) async => false);
}

group('getTopHeadlinesNews', () {
final tTopHeadlinesNewsResponseModel = TopHeadlinesNewsResponseModel.fromJson(
json.decode(
fixture('top_headlines_news_response_model.json'),
),
);

test(
'make sure that the device is connected to the internet when making a request to the endpoint',
() async {
// arrange
setUpMockNetworkConnected();

// act
await newsRepositoryImpl.getTopHeadlinesNews();

// assert
verify(mockNetworkInfo.isConnected);
},
);

test(
'make sure to return the value of the TopHeadlinesNewsResponseModel object when '
'NewsRemoteDataSource successfully receives a successful data response from the endpoint',
() async {
// arrange
setUpMockNetworkConnected();
when(mockNewsRemoteDataSource.getTopHeadlinesNews()).thenAnswer((_) async => tTopHeadlinesNewsResponseModel);

// act
final result = await newsRepositoryImpl.getTopHeadlinesNews();

// assert
verify(mockNewsRemoteDataSource.getTopHeadlinesNews());
expect(result, Right(tTopHeadlinesNewsResponseModel));
},
);

test(
'make sure to return the ServerFailure object when NewsRemoteDataSource receives a failure '
'data response from the endpoint',
() async {
// arrange
setUpMockNetworkConnected();
when(mockNewsRemoteDataSource.getTopHeadlinesNews()).thenThrow(DioError(error: 'testError'));

// act
final result = await newsRepositoryImpl.getTopHeadlinesNews();

// assert
verify(mockNewsRemoteDataSource.getTopHeadlinesNews());
expect(result, Left(ServerFailure('testError')));
},
);

test(
'make sure to return the ConnectionFailure object when the device connection is not connected '
'to the internet',
() async {
// arrange
setUpMockNetworkDisconnected();

// act
final result = await newsRepositoryImpl.getTopHeadlinesNews();

// assert
verify(mockNetworkInfo.isConnected);
expect(result, Left(ConnectionFailure()));
},
);
});
}