Skip to content

Commit 69db696

Browse files
authored
Merge pull request #9 from CoderJava/feature-top-headlines-news-model
Create Class Model Top Headlines News Response
2 parents 61c7dfa + 4e9da26 commit 69db696

File tree

6 files changed

+319
-3
lines changed

6 files changed

+319
-3
lines changed

codemagic.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ workflows:
1414
events:
1515
- push
1616
branch_patterns:
17-
- pattern: '*'
17+
- pattern: '*dev*'
1818
include: true
1919
source: true
2020
scripts:
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:json_annotation/json_annotation.dart';
3+
import 'package:meta/meta.dart';
4+
5+
part 'top_headlines_news_response_model.g.dart';
6+
7+
@JsonSerializable()
8+
class TopHeadlinesNewsResponseModel extends Equatable {
9+
final String status;
10+
final int totalResults;
11+
final List<ItemArticleTopHeadlinesNewsResponseModel> articles;
12+
13+
TopHeadlinesNewsResponseModel({
14+
@required this.status,
15+
@required this.totalResults,
16+
@required this.articles,
17+
});
18+
19+
factory TopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$TopHeadlinesNewsResponseModelFromJson(json);
20+
21+
Map<String, dynamic> toJson() => _$TopHeadlinesNewsResponseModelToJson(this);
22+
23+
@override
24+
List<Object> get props => [status, totalResults, articles];
25+
26+
@override
27+
String toString() {
28+
return 'TopHeadlinesNewsResponseModel{status: $status, totalResults: $totalResults, articles: $articles}';
29+
}
30+
}
31+
32+
@JsonSerializable()
33+
class ItemArticleTopHeadlinesNewsResponseModel extends Equatable {
34+
final ItemSourceTopHeadlinesNewsResponseModel source;
35+
final String author;
36+
final String title;
37+
final String description;
38+
final String url;
39+
final String urlToImage;
40+
final String publishedAt;
41+
final String content;
42+
43+
ItemArticleTopHeadlinesNewsResponseModel({
44+
@required this.source,
45+
@required this.author,
46+
@required this.title,
47+
@required this.description,
48+
@required this.url,
49+
@required this.urlToImage,
50+
@required this.publishedAt,
51+
@required this.content,
52+
});
53+
54+
factory ItemArticleTopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$ItemArticleTopHeadlinesNewsFromJson(json);
55+
56+
Map<String, dynamic> toJson() => _$ItemArticleTopHeadlinesNewsToJson(this);
57+
58+
@override
59+
List<Object> get props => [source, author, title, description, url, urlToImage, publishedAt, content];
60+
61+
@override
62+
String toString() {
63+
return 'ItemArticleTopHeadlinesNewsResponseModel{source: $source, author: $author, title: $title, description: $description, url: $url, urlToImage: $urlToImage, publishedAt: $publishedAt, content: $content}';
64+
}
65+
}
66+
67+
@JsonSerializable()
68+
class ItemSourceTopHeadlinesNewsResponseModel extends Equatable {
69+
final String name;
70+
71+
ItemSourceTopHeadlinesNewsResponseModel({@required this.name});
72+
73+
factory ItemSourceTopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$ItemSourceTopHeadlinesNewsFromJson(json);
74+
75+
Map<String, dynamic> toJson() => _$ItemSourceTopHeadlinesNewsToJson(this);
76+
77+
@override
78+
List<Object> get props => [name];
79+
80+
@override
81+
String toString() {
82+
return 'ItemSourceTopHeadlinesNewsResponseModel{name: $name}';
83+
}
84+
}

lib/feature/data/model/topheadlinesnews/top_headlines_news_response_model.g.dart

Lines changed: 71 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/feature/data/model/categorynews/category_news_model_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ void main() {
4848

4949
group('toJson', () {
5050
test(
51-
'pastikan fungsi toJson mengembalikan nilai JSON dalam bentuk objek map yang valid ketika '
52-
'melakukan konversi data model ke JSON',
51+
'make sure the toJson function returns a JSON value in the form of a '
52+
'valid map object when converting model data to JSON',
5353
() async {
5454
// arrange
5555
final resultCategoryNewsModel = tCategoryNewsModel.toJson();
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import 'dart:convert';
2+
3+
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
4+
import 'package:flutter_test/flutter_test.dart';
5+
6+
import '../../../../fixture/fixture_reader.dart';
7+
8+
void main() {
9+
final tItemSourceTopHeadlinesNewsResponseModel = ItemSourceTopHeadlinesNewsResponseModel(name: 'testName');
10+
final tItemArticleTopHeadlinesNewsResponseModel = ItemArticleTopHeadlinesNewsResponseModel(
11+
source: tItemSourceTopHeadlinesNewsResponseModel,
12+
author: 'testAuthor',
13+
title: 'testTitle',
14+
description: 'testDescription',
15+
url: 'testUrl',
16+
urlToImage: 'testUrlToImage',
17+
publishedAt: 'testPublishedAt',
18+
content: 'testContent',
19+
);
20+
final tTopHeadlinesNewsResponseModel = TopHeadlinesNewsResponseModel(
21+
status: 'testStatus',
22+
totalResults: 1,
23+
articles: [
24+
tItemArticleTopHeadlinesNewsResponseModel,
25+
],
26+
);
27+
28+
test(
29+
'make sure the props value',
30+
() async {
31+
// assert
32+
expect(
33+
tTopHeadlinesNewsResponseModel.props,
34+
[
35+
tTopHeadlinesNewsResponseModel.status,
36+
tTopHeadlinesNewsResponseModel.totalResults,
37+
tTopHeadlinesNewsResponseModel.articles,
38+
],
39+
);
40+
expect(
41+
tItemArticleTopHeadlinesNewsResponseModel.props,
42+
[
43+
tItemArticleTopHeadlinesNewsResponseModel.source,
44+
tItemArticleTopHeadlinesNewsResponseModel.author,
45+
tItemArticleTopHeadlinesNewsResponseModel.title,
46+
tItemArticleTopHeadlinesNewsResponseModel.description,
47+
tItemArticleTopHeadlinesNewsResponseModel.url,
48+
tItemArticleTopHeadlinesNewsResponseModel.urlToImage,
49+
tItemArticleTopHeadlinesNewsResponseModel.publishedAt,
50+
tItemArticleTopHeadlinesNewsResponseModel.content,
51+
],
52+
);
53+
expect(
54+
tItemSourceTopHeadlinesNewsResponseModel.props,
55+
[tItemSourceTopHeadlinesNewsResponseModel.name],
56+
);
57+
},
58+
);
59+
60+
test(
61+
'make sure the output of the toString function',
62+
() async {
63+
// assert
64+
expect(
65+
tItemSourceTopHeadlinesNewsResponseModel.toString(),
66+
'ItemSourceTopHeadlinesNewsResponseModel{name: ${tItemSourceTopHeadlinesNewsResponseModel.name}}',
67+
);
68+
expect(
69+
tItemArticleTopHeadlinesNewsResponseModel.toString(),
70+
'ItemArticleTopHeadlinesNewsResponseModel{source: ${tItemArticleTopHeadlinesNewsResponseModel.source}, '
71+
'author: ${tItemArticleTopHeadlinesNewsResponseModel.author}, '
72+
'title: ${tItemArticleTopHeadlinesNewsResponseModel.title}, '
73+
'description: ${tItemArticleTopHeadlinesNewsResponseModel.description}, '
74+
'url: ${tItemArticleTopHeadlinesNewsResponseModel.url}, '
75+
'urlToImage: ${tItemArticleTopHeadlinesNewsResponseModel.urlToImage}, '
76+
'publishedAt: ${tItemArticleTopHeadlinesNewsResponseModel.publishedAt}, '
77+
'content: ${tItemArticleTopHeadlinesNewsResponseModel.content}}',
78+
);
79+
expect(
80+
tTopHeadlinesNewsResponseModel.toString(),
81+
'TopHeadlinesNewsResponseModel{status: ${tTopHeadlinesNewsResponseModel.status}, '
82+
'totalResults: ${tTopHeadlinesNewsResponseModel.totalResults}, '
83+
'articles: ${tTopHeadlinesNewsResponseModel.articles}}',
84+
);
85+
},
86+
);
87+
88+
group('fromJson', () {
89+
test(
90+
'make sure the fromJson function returns a valid model object when reading valid JSON',
91+
() async {
92+
// arrange
93+
final Map<String, dynamic> jsonMap = json.decode(fixture('top_headlines_news_response_model.json'));
94+
95+
// act
96+
final result = TopHeadlinesNewsResponseModel.fromJson(jsonMap);
97+
98+
// assert
99+
expect(result, tTopHeadlinesNewsResponseModel);
100+
},
101+
);
102+
});
103+
104+
group('toJson', () {
105+
test(
106+
'make sure the toJson function returns a JSON value in the form of a '
107+
'valid map object when converting model data to JSON',
108+
() async {
109+
// arrange
110+
final resultTopHeadlinesNewsResponseModel = tTopHeadlinesNewsResponseModel.toJson();
111+
final resultItemArticleTopHeadlinesNewsResponseModel = tItemArticleTopHeadlinesNewsResponseModel.toJson();
112+
final resultItemSourceTopHeadlinesNewsResponseModel = tItemSourceTopHeadlinesNewsResponseModel.toJson();
113+
114+
// act
115+
final expectedMapItemSourceTopHeadlinesNewsResponseModel = {
116+
'name': 'testName',
117+
};
118+
final expectedMapItemArticleTopHeadlinesResponseModel = {
119+
'source': tItemSourceTopHeadlinesNewsResponseModel,
120+
'author': 'testAuthor',
121+
'title': 'testTitle',
122+
'description': 'testDescription',
123+
'url': 'testUrl',
124+
'urlToImage': 'testUrlToImage',
125+
'publishedAt': 'testPublishedAt',
126+
'content': 'testContent',
127+
};
128+
final expectedMapTopHeadlinesNewsResponseModel = {
129+
'status': 'testStatus',
130+
'totalResults': 1,
131+
'articles': [
132+
tItemArticleTopHeadlinesNewsResponseModel,
133+
],
134+
};
135+
136+
// assert
137+
expect(resultTopHeadlinesNewsResponseModel, expectedMapTopHeadlinesNewsResponseModel);
138+
expect(resultItemArticleTopHeadlinesNewsResponseModel, expectedMapItemArticleTopHeadlinesResponseModel);
139+
expect(resultItemSourceTopHeadlinesNewsResponseModel, expectedMapItemSourceTopHeadlinesNewsResponseModel);
140+
},
141+
);
142+
});
143+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"status": "testStatus",
3+
"totalResults": 1,
4+
"articles": [
5+
{
6+
"source": {
7+
"name": "testName"
8+
},
9+
"author": "testAuthor",
10+
"title": "testTitle",
11+
"description": "testDescription",
12+
"url": "testUrl",
13+
"urlToImage": "testUrlToImage",
14+
"publishedAt": "testPublishedAt",
15+
"content": "testContent"
16+
}
17+
]
18+
}

0 commit comments

Comments
 (0)