@@ -5,6 +5,7 @@ import 'package:dartz/dartz.dart';
5
5
import 'package:flutter_news_app/core/error/failure.dart' ;
6
6
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart' ;
7
7
import 'package:flutter_news_app/feature/domain/usecase/gettopheadlinesnews/get_top_headlines_news.dart' ;
8
+ import 'package:flutter_news_app/feature/domain/usecase/searchtopheadlinesnews/search_top_headlines_news.dart' ;
8
9
import 'package:flutter_news_app/feature/presentation/bloc/topheadlinesnews/bloc.dart' ;
9
10
import 'package:flutter_test/flutter_test.dart' ;
10
11
import 'package:mockito/mockito.dart' ;
@@ -13,13 +14,20 @@ import '../../../../fixture/fixture_reader.dart';
13
14
14
15
class MockGetTopHeadlinesNews extends Mock implements GetTopHeadlinesNews {}
15
16
17
+ class MockSearchTopHeadlinesNews extends Mock implements SearchTopHeadlinesNews {}
18
+
16
19
void main () {
17
20
MockGetTopHeadlinesNews mockGetTopHeadlinesNews;
21
+ MockSearchTopHeadlinesNews mockSearchTopHeadlinesNews;
18
22
TopHeadlinesNewsBloc topHeadlinesNewsBloc;
19
23
20
24
setUp (() {
21
25
mockGetTopHeadlinesNews = MockGetTopHeadlinesNews ();
22
- topHeadlinesNewsBloc = TopHeadlinesNewsBloc (getTopHeadlinesNews: mockGetTopHeadlinesNews);
26
+ mockSearchTopHeadlinesNews = MockSearchTopHeadlinesNews ();
27
+ topHeadlinesNewsBloc = TopHeadlinesNewsBloc (
28
+ getTopHeadlinesNews: mockGetTopHeadlinesNews,
29
+ searchTopHeadlinesNews: mockSearchTopHeadlinesNews,
30
+ );
23
31
});
24
32
25
33
tearDown (() {
@@ -30,7 +38,20 @@ void main() {
30
38
'make sure that AssertionError will be called when accepting null arguments' ,
31
39
() async {
32
40
// assert
33
- expect (() => TopHeadlinesNewsBloc (getTopHeadlinesNews: null ), throwsAssertionError);
41
+ expect (
42
+ () => TopHeadlinesNewsBloc (
43
+ getTopHeadlinesNews: null ,
44
+ searchTopHeadlinesNews: mockSearchTopHeadlinesNews,
45
+ ),
46
+ throwsAssertionError,
47
+ );
48
+ expect (
49
+ () => TopHeadlinesNewsBloc (
50
+ getTopHeadlinesNews: mockGetTopHeadlinesNews,
51
+ searchTopHeadlinesNews: null ,
52
+ ),
53
+ throwsAssertionError,
54
+ );
34
55
},
35
56
);
36
57
@@ -156,4 +177,85 @@ void main() {
156
177
],
157
178
);
158
179
});
180
+
181
+ group ('SearchTopHeadlinesNews' , () {
182
+ final tKeyword = 'testKeyword' ;
183
+ final tTopHeadlinesNewsResponseModel = TopHeadlinesNewsResponseModel .fromJson (
184
+ json.decode (
185
+ fixture ('top_headlines_news_response_model.json' ),
186
+ ),
187
+ );
188
+
189
+ test (
190
+ 'make sure that the SearchTopHeadlinesNews use case is really called' ,
191
+ () async {
192
+ // arrange
193
+ when (mockSearchTopHeadlinesNews (any)).thenAnswer ((_) async => Right (tTopHeadlinesNewsResponseModel));
194
+
195
+ // act
196
+ topHeadlinesNewsBloc.add (SearchTopHeadlinesNewsEvent (keyword: tKeyword));
197
+ await untilCalled (mockSearchTopHeadlinesNews (any));
198
+
199
+ // assert
200
+ verify (mockSearchTopHeadlinesNews (ParamsSearchTopHeadlinesNews (keyword: tKeyword)));
201
+ },
202
+ );
203
+
204
+ blocTest (
205
+ 'make sure to emit [LoadingTopHeadlinesNewsState, SearchSuccessTopHeadlinesNewsState] when receive '
206
+ 'SearchTopHeadlinesNewsEvent with a successful process' ,
207
+ build: () async {
208
+ when (mockSearchTopHeadlinesNews (any)).thenAnswer ((_) async => Right (tTopHeadlinesNewsResponseModel));
209
+ return topHeadlinesNewsBloc;
210
+ },
211
+ act: (bloc) {
212
+ return bloc.add (SearchTopHeadlinesNewsEvent (keyword: tKeyword));
213
+ },
214
+ expect: [
215
+ LoadingTopHeadlinesNewsState (),
216
+ SearchSuccessTopHeadlinesNewsState (listArticles: tTopHeadlinesNewsResponseModel.articles),
217
+ ],
218
+ verify: (_) async {
219
+ verify (mockSearchTopHeadlinesNews (ParamsSearchTopHeadlinesNews (keyword: tKeyword)));
220
+ },
221
+ );
222
+
223
+ blocTest (
224
+ 'make sure to emit [LoadingTopHeadlinesNewsState, FailureTopHeadlinesNewsState] when receive '
225
+ 'SearchTopHeadlinesNewsEvent with a failed process from endpoint' ,
226
+ build: () async {
227
+ when (mockSearchTopHeadlinesNews (any)).thenAnswer ((_) async => Left (ServerFailure ('testErrorMessage' )));
228
+ return topHeadlinesNewsBloc;
229
+ },
230
+ act: (bloc) {
231
+ return bloc.add (SearchTopHeadlinesNewsEvent (keyword: tKeyword));
232
+ },
233
+ expect: [
234
+ LoadingTopHeadlinesNewsState (),
235
+ FailureTopHeadlinesNewsState (errorMessage: 'testErrorMessage' ),
236
+ ],
237
+ verify: (_) async {
238
+ verify (mockSearchTopHeadlinesNews (ParamsSearchTopHeadlinesNews (keyword: tKeyword)));
239
+ },
240
+ );
241
+
242
+ blocTest (
243
+ 'make sure to emit [LoadingTopHeadlinesNewsState, FailureTopHeadlinesNewsState] when the internet '
244
+ 'connection has a problem' ,
245
+ build: () async {
246
+ when (mockSearchTopHeadlinesNews (any)).thenAnswer ((_) async => Left (ConnectionFailure ()));
247
+ return topHeadlinesNewsBloc;
248
+ },
249
+ act: (bloc) {
250
+ return bloc.add (SearchTopHeadlinesNewsEvent (keyword: tKeyword));
251
+ },
252
+ expect: [
253
+ LoadingTopHeadlinesNewsState (),
254
+ FailureTopHeadlinesNewsState (errorMessage: messageConnectionFailure),
255
+ ],
256
+ verify: (_) async {
257
+ verify (mockSearchTopHeadlinesNews (ParamsSearchTopHeadlinesNews (keyword: tKeyword)));
258
+ },
259
+ );
260
+ });
159
261
}
0 commit comments