Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e62fbe3

Browse files
Merge pull request #13 from CoderJava/news-repository
Create News Repository for call top headlines news API
2 parents 82b060a + 73bf0f9 commit e62fbe3

File tree

3 files changed

+154
-0
lines changed

3 files changed

+154
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:dartz/dartz.dart';
2+
import 'package:dio/dio.dart';
3+
import 'package:flutter_news_app/core/error/failure.dart';
4+
import 'package:flutter_news_app/core/network/network_info.dart';
5+
import 'package:flutter_news_app/feature/data/datasource/news/news_remote_data_source.dart';
6+
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
7+
import 'package:flutter_news_app/feature/domain/repository/news/news_repository.dart';
8+
import 'package:meta/meta.dart';
9+
10+
class NewsRepositoryImpl implements NewsRepository {
11+
final NewsRemoteDataSource newsRemoteDataSource;
12+
final NetworkInfo networkInfo;
13+
14+
NewsRepositoryImpl({
15+
@required this.newsRemoteDataSource,
16+
@required this.networkInfo,
17+
});
18+
19+
@override
20+
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews() async {
21+
var isConnected = await networkInfo.isConnected;
22+
if (isConnected) {
23+
try {
24+
var response = await newsRemoteDataSource.getTopHeadlinesNews();
25+
return Right(response);
26+
} on DioError catch (error) {
27+
return Left(ServerFailure(error.message));
28+
}
29+
} else {
30+
return Left(ConnectionFailure());
31+
}
32+
}
33+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'package:dartz/dartz.dart';
2+
import 'package:flutter_news_app/core/error/failure.dart';
3+
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
4+
5+
abstract class NewsRepository {
6+
7+
Future<Either<Failure, TopHeadlinesNewsResponseModel>> getTopHeadlinesNews();
8+
9+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import 'dart:convert';
2+
3+
import 'package:dartz/dartz.dart';
4+
import 'package:dio/dio.dart';
5+
import 'package:flutter_news_app/core/error/failure.dart';
6+
import 'package:flutter_news_app/core/network/network_info.dart';
7+
import 'package:flutter_news_app/feature/data/datasource/news/news_remote_data_source.dart';
8+
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
9+
import 'package:flutter_news_app/feature/data/repository/news/news_repository_impl.dart';
10+
import 'package:flutter_test/flutter_test.dart';
11+
import 'package:mockito/mockito.dart';
12+
13+
import '../../../../fixture/fixture_reader.dart';
14+
15+
class MockNewsRemoteDataSource extends Mock implements NewsRemoteDataSource {}
16+
17+
class MockNetworkInfo extends Mock implements NetworkInfo {}
18+
19+
void main() {
20+
NewsRepositoryImpl newsRepositoryImpl;
21+
MockNewsRemoteDataSource mockNewsRemoteDataSource;
22+
MockNetworkInfo mockNetworkInfo;
23+
24+
setUp(() {
25+
mockNewsRemoteDataSource = MockNewsRemoteDataSource();
26+
mockNetworkInfo = MockNetworkInfo();
27+
newsRepositoryImpl = NewsRepositoryImpl(
28+
newsRemoteDataSource: mockNewsRemoteDataSource,
29+
networkInfo: mockNetworkInfo,
30+
);
31+
});
32+
33+
void setUpMockNetworkConnected() {
34+
when(mockNetworkInfo.isConnected).thenAnswer((_) async => true);
35+
}
36+
37+
void setUpMockNetworkDisconnected() {
38+
when(mockNetworkInfo.isConnected).thenAnswer((_) async => false);
39+
}
40+
41+
group('getTopHeadlinesNews', () {
42+
final tTopHeadlinesNewsResponseModel = TopHeadlinesNewsResponseModel.fromJson(
43+
json.decode(
44+
fixture('top_headlines_news_response_model.json'),
45+
),
46+
);
47+
48+
test(
49+
'make sure that the device is connected to the internet when making a request to the endpoint',
50+
() async {
51+
// arrange
52+
setUpMockNetworkConnected();
53+
54+
// act
55+
await newsRepositoryImpl.getTopHeadlinesNews();
56+
57+
// assert
58+
verify(mockNetworkInfo.isConnected);
59+
},
60+
);
61+
62+
test(
63+
'make sure to return the value of the TopHeadlinesNewsResponseModel object when '
64+
'NewsRemoteDataSource successfully receives a successful data response from the endpoint',
65+
() async {
66+
// arrange
67+
setUpMockNetworkConnected();
68+
when(mockNewsRemoteDataSource.getTopHeadlinesNews()).thenAnswer((_) async => tTopHeadlinesNewsResponseModel);
69+
70+
// act
71+
final result = await newsRepositoryImpl.getTopHeadlinesNews();
72+
73+
// assert
74+
verify(mockNewsRemoteDataSource.getTopHeadlinesNews());
75+
expect(result, Right(tTopHeadlinesNewsResponseModel));
76+
},
77+
);
78+
79+
test(
80+
'make sure to return the ServerFailure object when NewsRemoteDataSource receives a failure '
81+
'data response from the endpoint',
82+
() async {
83+
// arrange
84+
setUpMockNetworkConnected();
85+
when(mockNewsRemoteDataSource.getTopHeadlinesNews()).thenThrow(DioError(error: 'testError'));
86+
87+
// act
88+
final result = await newsRepositoryImpl.getTopHeadlinesNews();
89+
90+
// assert
91+
verify(mockNewsRemoteDataSource.getTopHeadlinesNews());
92+
expect(result, Left(ServerFailure('testError')));
93+
},
94+
);
95+
96+
test(
97+
'make sure to return the ConnectionFailure object when the device connection is not connected '
98+
'to the internet',
99+
() async {
100+
// arrange
101+
setUpMockNetworkDisconnected();
102+
103+
// act
104+
final result = await newsRepositoryImpl.getTopHeadlinesNews();
105+
106+
// assert
107+
verify(mockNetworkInfo.isConnected);
108+
expect(result, Left(ConnectionFailure()));
109+
},
110+
);
111+
});
112+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /