Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion lib/core/init/network/ICoreDio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ abstract class ICoreDio {
{@required HttpTypes type,
@required T parseModel,
dynamic data,
Map<String, dynamic> queryParameters,
Map<String, Object> queryParameters,
void Function(int, int) onReceiveProgress});
}

abstract class ICoreDioFull extends ICoreDio {
Future<IResponseModel<R>> fetchNoNetwork<R, T extends BaseModel>(String path,
{@required HttpTypes type,
@required T parseModel,
dynamic data,
Map<String, Object> queryParameters,
void Function(int, int) onReceiveProgress});
}
2 changes: 1 addition & 1 deletion lib/core/init/network/core_dio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class CoreDio with DioMixin implements Dio, ICoreDio {
switch (response.statusCode) {
case HttpStatus.ok:
case HttpStatus.accepted:
final model = _responseParser<R>(parseModel, _responseParser);
final model = _responseParser<R, T>(parseModel, response.data);
return ResponseModel<R>(data: model);
default:
return ResponseModel(error: BaseError("message"));
Expand Down
4 changes: 2 additions & 2 deletions lib/core/init/network/network_core/core_operations.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
part of "../core_dio.dart";

extension _CoreDioOperations on CoreDio {
R _responseParser<R>(BaseModel model, dynamic data) {
R _responseParser<R, T>(BaseModel model, dynamic data) {
if (data is List) {
return data.map((e) => model.fromJson(e)).toList() as R;
return data.map((e) => model.fromJson(e)).toList().cast<T>() as R;
} else if (data is Map) {
return model.fromJson(data) as R;
}
Expand Down
10 changes: 10 additions & 0 deletions test/core/extension/string_extension_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:fluttermvvmtemplate/core/extension/string_extension.dart';

main() {
setUp(() {});
test("Email Regexp", () {
String email = "joedoe@gmail.com";
expect(email.isValidEmail, null);
});
}
76 changes: 76 additions & 0 deletions test/core/network/core_dio_mock.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import 'dart:convert';
import 'dart:io';

import 'package:dio/adapter.dart';
import 'package:dio/dio.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fluttermvvmtemplate/core/base/model/base_error.dart';
import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart';
import 'package:fluttermvvmtemplate/core/base/model/base_model.dart';
import 'package:fluttermvvmtemplate/core/extension/network_exntension.dart';
import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart';
import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart';

class CoreDioMock with DioMixin implements ICoreDioFull, Dio {
final BaseOptions options;

CoreDioMock(this.options) {
this.options = options;
this.interceptors.add(InterceptorsWrapper());
this.httpClientAdapter = DefaultHttpClientAdapter();
}
@override
Future<IResponseModel<R>> fetch<R, T extends BaseModel>(String path,
{HttpTypes type,
T parseModel,
data,
Map<String, Object> queryParameters,
void Function(int p1, int p2) onReceiveProgress}) async {
final response = await request(path, data: data, options: Options(method: type.rawValue));

switch (response.statusCode) {
case HttpStatus.ok:
case HttpStatus.accepted:
final model = _responseParser<R, T>(parseModel, response.data);
return ResponseModel<R>(data: model);
default:
return ResponseModel(error: BaseError("message"));
}
}

Future<IResponseModel<R>> fetchNoNetwork<R, T extends BaseModel>(String path,
{HttpTypes type,
T parseModel,
data,
Map<String, Object> queryParameters,
void Function(int p1, int p2) onReceiveProgress}) async {
String dumyJson = """[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit suscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitaensequi sint nihil reprehenderit dolor beatae ea dolores nequenfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendisnqui aperiam non debitis possimus qui neque nisi nulla"
}]""";
final response = jsonDecode(dumyJson);
final model = _responseParser<R, T>(parseModel, response);
return ResponseModel<R>(data: model);
}

R _responseParser<R, T>(BaseModel model, dynamic data) {
if (data is List) {
return data.map((e) => model.fromJson(e)).toList().cast<T>() as R;
} else if (data is Map) {
return model.fromJson(data) as R;
}
return data as R;
}
}

class Dio {}
47 changes: 47 additions & 0 deletions test/core/network/core_dio_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import 'package:dio/dio.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart';
import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart';
import 'core_dio_mock.dart';
import 'dio_mock_model.dart';

main() {
ICoreDioFull service;
setUp(() {
service = CoreDioMock(BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com"));
});
test("CoreDio List", () async {
final data =
await service.fetch<List<PostModel>, PostModel>("/posts", type: HttpTypes.GET, parseModel: PostModel());

expect(data.data, isList);
});

test("CoreDio List No Network", () async {
final data = await service.fetchNoNetwork<List<PostModel>, PostModel>("/posts",
type: HttpTypes.GET, parseModel: PostModel());

expect(data.data, isList);
});

test("CoreDio Object", () async {
final data =
await service.fetch<List<PostModel>, PostModel>("/posts", type: HttpTypes.GET, parseModel: PostModel());

expect(data.data, isList);
});

test("CoreDio Primitive", () async {
final data =
await service.fetch<List<PostModel>, PostModel>("/posts", type: HttpTypes.GET, parseModel: PostModel());

expect(data.data, isList);
});

test("CoreDio Error", () async {
final data = await service.fetchNoNetwork<List<PostModel>, PostModel>("/posts",
type: HttpTypes.GET, parseModel: PostModel());

expect(data.data, isList);
});
}
31 changes: 31 additions & 0 deletions test/core/network/dio_mock_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:fluttermvvmtemplate/core/base/model/base_model.dart';

class PostModel extends BaseModel<PostModel> {
int userId;
int id;
String title;
String body;

PostModel({this.userId, this.id, this.title, this.body});

PostModel.fromJson(Map<String, dynamic> json) {
userId = json['userId'];
id = json['id'];
title = json['title'];
body = json['body'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userId'] = this.userId;
data['id'] = this.id;
data['title'] = this.title;
data['body'] = this.body;
return data;
}

@override
PostModel fromJson(Map<String, Object> json) {
return PostModel.fromJson(json);
}
}
2 changes: 0 additions & 2 deletions test/feature/login/login_test.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:fluttermvvmtemplate/core/base/model/base_error.dart';
import 'package:fluttermvvmtemplate/core/base/model/base_model.dart';
import 'package:fluttermvvmtemplate/view/authenticate/test/model/test_model.dart';

main() {
setUp(() {
Expand Down
67 changes: 67 additions & 0 deletions test/feature/onboard/onboard_mock_view_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import 'package:dio/dio.dart';
import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart';
import 'package:fluttermvvmtemplate/core/init/network/core_dio.dart';
import 'package:fluttermvvmtemplate/view/authenticate/onboard/model/on_board_model.dart';
import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:fluttermvvmtemplate/view/authenticate/onboard/view-model/on_board_view_model.dart';

import '../../core/network/dio_mock_model.dart';

class OnBoardMockViewModel implements OnBoardViewModel {
@override
BuildContext context;

@override
ICoreDio coreDio;

IStringHelper stringHelper;

@override
int currentPageIndex;

bool isLoading = false;

@override
List<OnBoardModel> onBoarModel;

@override
void init() {
coreDio = CoreDio(BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com"));
stringHelper = MockStringHelper();
}

@override
void onPageChanged(int value) {
currentPageIndex = value;
}

Future<void> onBoardGetModels() async {
final response =
await coreDio.fetch<List<PostModel>, PostModel>("/posts", type: HttpTypes.GET, parseModel: PostModel());

if (response.data is List) {
onBoarModel = response.data.map((e) => OnBoardModel(stringHelper.toUpper(e.title))).toList().cast<OnBoardModel>();
}
}

Future<void> getServiceRequest() async {
isLoading = true;
await onBoardGetModels();
isLoading = false;
}

@override
void setContext(BuildContext context) {}
}

abstract class IStringHelper {
String toUpper(String data);
}

class MockStringHelper extends IStringHelper {
@override
String toUpper(String data) {
return data.toUpperCase();
}
}
50 changes: 50 additions & 0 deletions test/feature/onboard/onboard_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'onboard_mock_view_model.dart';

main() {
OnBoardMockViewModel mockViewModel;
IStringHelper stringHelper;
setUp(() {
SharedPreferences.setMockInitialValues({"token": "asdasd"}); //set values here
mockViewModel = OnBoardMockViewModel();
stringHelper = MockStringHelper();
mockViewModel.init();
});
test("String Helper Upper Case", () {
String text = " Helelo";
text = stringHelper.toUpper(text);
expect(text.contains(RegExp("[A-Z\s]+")), true);
});

test("OnBoard Get Models", () async {
await mockViewModel.onBoardGetModels();
expect(mockViewModel.onBoarModel, isNotEmpty);
});

test("OnBoard Get Service Request", () async {
expect(mockViewModel.isLoading, false);
mockViewModel.getServiceRequest();
expect(mockViewModel.isLoading, true);
});

test("OnBoard On Page Changed", () {
mockViewModel.onPageChanged(5);
expect(5, mockViewModel.currentPageIndex);
});

group("Test All", () {
int index = 0;
test("OnBoard Get Models", () async {
await mockViewModel.onBoardGetModels();
index = mockViewModel.onBoarModel.length;
expect(mockViewModel.onBoarModel, isNotEmpty);
});

test("OnBoard On Page Changed", () {
mockViewModel.onPageChanged(index);
expect(index, mockViewModel.currentPageIndex);
});
});
}
11 changes: 11 additions & 0 deletions test/feature/test/sample_view_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart';
import 'package:fluttermvvmtemplate/core/init/network/network_manager.dart';

main() {
ICoreDio coreDio;
setUp(() {
coreDio = NetworkManager.instance.coreDio;
});
test("Sample", () {});
}