Skip to content

Commit 8a6369f

Browse files
committed
Buat endpoint ping
Sekalian buat unit testnya.
1 parent ce03a64 commit 8a6369f

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:dipantau_desktop_client/config/flavor_config.dart';
3+
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
4+
5+
abstract class GeneralRemoteDataSource {
6+
/// Panggil endpoint [host]/api/ping
7+
///
8+
/// Throws [DioException] untuk semua error kode
9+
late String pathPing;
10+
11+
Future<GeneralResponse> ping();
12+
}
13+
14+
class GeneralRemoteDataSourceImpl implements GeneralRemoteDataSource {
15+
final Dio dio;
16+
17+
GeneralRemoteDataSourceImpl({
18+
required this.dio,
19+
});
20+
21+
final baseUrl = FlavorConfig.instance.values.baseUrl;
22+
23+
@override
24+
String pathPing = '';
25+
26+
@override
27+
Future<GeneralResponse> ping() async {
28+
pathPing = '$baseUrl/api/ping';
29+
final response = await dio.get(pathPing);
30+
if (response.statusCode.toString().startsWith('2')) {
31+
return GeneralResponse.fromJson(response.data);
32+
} else {
33+
throw DioException(requestOptions: RequestOptions(path: pathPing));
34+
}
35+
}
36+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import 'dart:convert';
2+
3+
import 'package:dio/dio.dart';
4+
import 'package:dipantau_desktop_client/config/flavor_config.dart';
5+
import 'package:dipantau_desktop_client/feature/data/datasource/general/general_remote_data_source.dart';
6+
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
7+
import 'package:flutter_test/flutter_test.dart';
8+
import 'package:mockito/mockito.dart';
9+
10+
import '../../../../fixture/fixture_reader.dart';
11+
import '../../../../helper/mock_helper.mocks.dart';
12+
13+
void main() {
14+
late GeneralRemoteDataSource remoteDataSource;
15+
late MockDio mockDio;
16+
late MockHttpClientAdapter mockDioAdapter;
17+
18+
const baseUrl = 'https://example.com';
19+
20+
setUp(() {
21+
FlavorConfig(
22+
values: FlavorValues(
23+
baseUrl: baseUrl,
24+
baseUrlAuth: '',
25+
baseUrlUser: '',
26+
baseUrlTrack: '',
27+
baseUrlProject: '',
28+
baseUrlSetting: '',
29+
),
30+
);
31+
mockDio = MockDio();
32+
mockDioAdapter = MockHttpClientAdapter();
33+
mockDio.httpClientAdapter = mockDioAdapter;
34+
remoteDataSource = GeneralRemoteDataSourceImpl(dio: mockDio);
35+
});
36+
37+
final tRequestOptions = RequestOptions(path: '');
38+
39+
group('ping', () {
40+
const tPathResponse = 'general_response.json';
41+
final tResponse = GeneralResponse.fromJson(
42+
json.decode(
43+
fixture(tPathResponse),
44+
),
45+
);
46+
47+
void setUpMockDioSuccess() {
48+
final responsePayload = json.decode(fixture(tPathResponse));
49+
final response = Response(
50+
requestOptions: tRequestOptions,
51+
data: responsePayload,
52+
statusCode: 200,
53+
headers: Headers.fromMap({
54+
Headers.contentTypeHeader: [Headers.jsonContentType],
55+
}),
56+
);
57+
when(mockDio.get(any)).thenAnswer((_) async => response);
58+
}
59+
60+
test(
61+
'pastikan endpoint ping benar-benar terpanggil dengan method GET',
62+
() async {
63+
// arrange
64+
setUpMockDioSuccess();
65+
66+
// act
67+
await remoteDataSource.ping();
68+
69+
// assert
70+
verify(mockDio.get('$baseUrl/api/ping'));
71+
},
72+
);
73+
74+
test(
75+
'pastikan mengembalikan objek class model GeneralResponse ketika menerima respon sukses '
76+
'dari endpoint',
77+
() async {
78+
// arrange
79+
setUpMockDioSuccess();
80+
81+
// act
82+
final result = await remoteDataSource.ping();
83+
84+
// assert
85+
expect(result, tResponse);
86+
},
87+
);
88+
89+
test(
90+
'pastikan akan menerima exception DioError ketika menerima respon kegagalan dari endpoint',
91+
() async {
92+
// arrange
93+
final response = Response(
94+
requestOptions: tRequestOptions,
95+
data: 'Bad Request',
96+
statusCode: 400,
97+
);
98+
when(mockDio.get(any)).thenAnswer((_) async => response);
99+
100+
// act
101+
final call = remoteDataSource.ping();
102+
103+
// assert
104+
expect(() => call, throwsA(const TypeMatcher<DioException>()));
105+
},
106+
);
107+
});
108+
}

0 commit comments

Comments
 (0)