Skip to content

Commit

Permalink
Merge pull request #13 from CoderJava/news-repository
Browse files Browse the repository at this point in the history
Create News Repository for call top headlines news API
  • Loading branch information
CoderJava committed Apr 15, 2020
2 parents 82b060a + 73bf0f9 commit e62fbe3
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 0 deletions.
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()));
},
);
});
}

0 comments on commit e62fbe3

Please sign in to comment.