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
2 changes: 1 addition & 1 deletion codemagic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ workflows:
events:
- push
branch_patterns:
- pattern: '*'
- pattern: '*dev*'
include: true
source: true
scripts:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:meta/meta.dart';

part 'top_headlines_news_response_model.g.dart';

@JsonSerializable()
class TopHeadlinesNewsResponseModel extends Equatable {
final String status;
final int totalResults;
final List<ItemArticleTopHeadlinesNewsResponseModel> articles;

TopHeadlinesNewsResponseModel({
@required this.status,
@required this.totalResults,
@required this.articles,
});

factory TopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$TopHeadlinesNewsResponseModelFromJson(json);

Map<String, dynamic> toJson() => _$TopHeadlinesNewsResponseModelToJson(this);

@override
List<Object> get props => [status, totalResults, articles];

@override
String toString() {
return 'TopHeadlinesNewsResponseModel{status: $status, totalResults: $totalResults, articles: $articles}';
}
}

@JsonSerializable()
class ItemArticleTopHeadlinesNewsResponseModel extends Equatable {
final ItemSourceTopHeadlinesNewsResponseModel source;
final String author;
final String title;
final String description;
final String url;
final String urlToImage;
final String publishedAt;
final String content;

ItemArticleTopHeadlinesNewsResponseModel({
@required this.source,
@required this.author,
@required this.title,
@required this.description,
@required this.url,
@required this.urlToImage,
@required this.publishedAt,
@required this.content,
});

factory ItemArticleTopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$ItemArticleTopHeadlinesNewsFromJson(json);

Map<String, dynamic> toJson() => _$ItemArticleTopHeadlinesNewsToJson(this);

@override
List<Object> get props => [source, author, title, description, url, urlToImage, publishedAt, content];

@override
String toString() {
return 'ItemArticleTopHeadlinesNewsResponseModel{source: $source, author: $author, title: $title, description: $description, url: $url, urlToImage: $urlToImage, publishedAt: $publishedAt, content: $content}';
}
}

@JsonSerializable()
class ItemSourceTopHeadlinesNewsResponseModel extends Equatable {
final String name;

ItemSourceTopHeadlinesNewsResponseModel({@required this.name});

factory ItemSourceTopHeadlinesNewsResponseModel.fromJson(Map<String, dynamic> json) => _$ItemSourceTopHeadlinesNewsFromJson(json);

Map<String, dynamic> toJson() => _$ItemSourceTopHeadlinesNewsToJson(this);

@override
List<Object> get props => [name];

@override
String toString() {
return 'ItemSourceTopHeadlinesNewsResponseModel{name: $name}';
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ void main() {

group('toJson', () {
test(
'pastikan fungsi toJson mengembalikan nilai JSON dalam bentuk objek map yang valid ketika '
'melakukan konversi data model ke JSON',
'make sure the toJson function returns a JSON value in the form of a '
'valid map object when converting model data to JSON',
() async {
// arrange
final resultCategoryNewsModel = tCategoryNewsModel.toJson();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import 'dart:convert';

import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
import 'package:flutter_test/flutter_test.dart';

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

void main() {
final tItemSourceTopHeadlinesNewsResponseModel = ItemSourceTopHeadlinesNewsResponseModel(name: 'testName');
final tItemArticleTopHeadlinesNewsResponseModel = ItemArticleTopHeadlinesNewsResponseModel(
source: tItemSourceTopHeadlinesNewsResponseModel,
author: 'testAuthor',
title: 'testTitle',
description: 'testDescription',
url: 'testUrl',
urlToImage: 'testUrlToImage',
publishedAt: 'testPublishedAt',
content: 'testContent',
);
final tTopHeadlinesNewsResponseModel = TopHeadlinesNewsResponseModel(
status: 'testStatus',
totalResults: 1,
articles: [
tItemArticleTopHeadlinesNewsResponseModel,
],
);

test(
'make sure the props value',
() async {
// assert
expect(
tTopHeadlinesNewsResponseModel.props,
[
tTopHeadlinesNewsResponseModel.status,
tTopHeadlinesNewsResponseModel.totalResults,
tTopHeadlinesNewsResponseModel.articles,
],
);
expect(
tItemArticleTopHeadlinesNewsResponseModel.props,
[
tItemArticleTopHeadlinesNewsResponseModel.source,
tItemArticleTopHeadlinesNewsResponseModel.author,
tItemArticleTopHeadlinesNewsResponseModel.title,
tItemArticleTopHeadlinesNewsResponseModel.description,
tItemArticleTopHeadlinesNewsResponseModel.url,
tItemArticleTopHeadlinesNewsResponseModel.urlToImage,
tItemArticleTopHeadlinesNewsResponseModel.publishedAt,
tItemArticleTopHeadlinesNewsResponseModel.content,
],
);
expect(
tItemSourceTopHeadlinesNewsResponseModel.props,
[tItemSourceTopHeadlinesNewsResponseModel.name],
);
},
);

test(
'make sure the output of the toString function',
() async {
// assert
expect(
tItemSourceTopHeadlinesNewsResponseModel.toString(),
'ItemSourceTopHeadlinesNewsResponseModel{name: ${tItemSourceTopHeadlinesNewsResponseModel.name}}',
);
expect(
tItemArticleTopHeadlinesNewsResponseModel.toString(),
'ItemArticleTopHeadlinesNewsResponseModel{source: ${tItemArticleTopHeadlinesNewsResponseModel.source}, '
'author: ${tItemArticleTopHeadlinesNewsResponseModel.author}, '
'title: ${tItemArticleTopHeadlinesNewsResponseModel.title}, '
'description: ${tItemArticleTopHeadlinesNewsResponseModel.description}, '
'url: ${tItemArticleTopHeadlinesNewsResponseModel.url}, '
'urlToImage: ${tItemArticleTopHeadlinesNewsResponseModel.urlToImage}, '
'publishedAt: ${tItemArticleTopHeadlinesNewsResponseModel.publishedAt}, '
'content: ${tItemArticleTopHeadlinesNewsResponseModel.content}}',
);
expect(
tTopHeadlinesNewsResponseModel.toString(),
'TopHeadlinesNewsResponseModel{status: ${tTopHeadlinesNewsResponseModel.status}, '
'totalResults: ${tTopHeadlinesNewsResponseModel.totalResults}, '
'articles: ${tTopHeadlinesNewsResponseModel.articles}}',
);
},
);

group('fromJson', () {
test(
'make sure the fromJson function returns a valid model object when reading valid JSON',
() async {
// arrange
final Map<String, dynamic> jsonMap = json.decode(fixture('top_headlines_news_response_model.json'));

// act
final result = TopHeadlinesNewsResponseModel.fromJson(jsonMap);

// assert
expect(result, tTopHeadlinesNewsResponseModel);
},
);
});

group('toJson', () {
test(
'make sure the toJson function returns a JSON value in the form of a '
'valid map object when converting model data to JSON',
() async {
// arrange
final resultTopHeadlinesNewsResponseModel = tTopHeadlinesNewsResponseModel.toJson();
final resultItemArticleTopHeadlinesNewsResponseModel = tItemArticleTopHeadlinesNewsResponseModel.toJson();
final resultItemSourceTopHeadlinesNewsResponseModel = tItemSourceTopHeadlinesNewsResponseModel.toJson();

// act
final expectedMapItemSourceTopHeadlinesNewsResponseModel = {
'name': 'testName',
};
final expectedMapItemArticleTopHeadlinesResponseModel = {
'source': tItemSourceTopHeadlinesNewsResponseModel,
'author': 'testAuthor',
'title': 'testTitle',
'description': 'testDescription',
'url': 'testUrl',
'urlToImage': 'testUrlToImage',
'publishedAt': 'testPublishedAt',
'content': 'testContent',
};
final expectedMapTopHeadlinesNewsResponseModel = {
'status': 'testStatus',
'totalResults': 1,
'articles': [
tItemArticleTopHeadlinesNewsResponseModel,
],
};

// assert
expect(resultTopHeadlinesNewsResponseModel, expectedMapTopHeadlinesNewsResponseModel);
expect(resultItemArticleTopHeadlinesNewsResponseModel, expectedMapItemArticleTopHeadlinesResponseModel);
expect(resultItemSourceTopHeadlinesNewsResponseModel, expectedMapItemSourceTopHeadlinesNewsResponseModel);
},
);
});
}
18 changes: 18 additions & 0 deletions test/fixture/top_headlines_news_response_model.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"status": "testStatus",
"totalResults": 1,
"articles": [
{
"source": {
"name": "testName"
},
"author": "testAuthor",
"title": "testTitle",
"description": "testDescription",
"url": "testUrl",
"urlToImage": "testUrlToImage",
"publishedAt": "testPublishedAt",
"content": "testContent"
}
]
}