Skip to content

Commit 983ddb1

Browse files
committed
feat: Buat endpoint deleteTrackUser
Sekalian dengan unit test-nya.
1 parent 3408a67 commit 983ddb1

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

lib/feature/data/datasource/track/track_remote_data_source.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ abstract class TrackRemoteDataSource {
4343
late String pathGetTrackUser;
4444

4545
Future<TrackUserResponse> getTrackUser(String userId, String date);
46+
47+
/// Panggil endpoint [host]/track/:id
48+
///
49+
/// Throws [DioException] untuk semua error kode
50+
late String pathDeleteTrack;
51+
52+
Future<GeneralResponse> deleteTrackUser(int trackId);
4653
}
4754

4855
class TrackRemoteDataSourceImpl implements TrackRemoteDataSource {
@@ -194,4 +201,25 @@ class TrackRemoteDataSourceImpl implements TrackRemoteDataSource {
194201
throw DioException(requestOptions: RequestOptions(path: pathGetTrackUser));
195202
}
196203
}
204+
205+
@override
206+
String pathDeleteTrack = '';
207+
208+
@override
209+
Future<GeneralResponse> deleteTrackUser(int trackId) async {
210+
pathDeleteTrack = '$baseUrl/$trackId';
211+
final response = await dio.delete(
212+
pathDeleteTrack,
213+
options: Options(
214+
headers: {
215+
baseUrlConfig.requiredToken: true,
216+
},
217+
),
218+
);
219+
if (response.statusCode.toString().startsWith('2')) {
220+
return GeneralResponse.fromJson(response.data);
221+
} else {
222+
throw DioException(requestOptions: RequestOptions(path: pathDeleteTrack));
223+
}
224+
}
197225
}

test/feature/data/datasource/track/track_remote_data_source_test.dart

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,4 +428,75 @@ void main() {
428428
},
429429
);
430430
});
431+
432+
group('deleteTrackUser', () {
433+
const trackId = 1;
434+
const tPathResponse = 'general_response.json';
435+
final tResponse = GeneralResponse.fromJson(
436+
json.decode(
437+
fixture(tPathResponse),
438+
),
439+
);
440+
441+
void setUpMockDioSuccess() {
442+
final responsePayload = json.decode(fixture(tPathResponse));
443+
final response = Response(
444+
requestOptions: tRequestOptions,
445+
data: responsePayload,
446+
statusCode: 200,
447+
headers: Headers.fromMap({
448+
Headers.contentTypeHeader: [Headers.jsonContentType],
449+
}),
450+
);
451+
when(mockDio.delete(any, options: anyNamed('options'))).thenAnswer((_) async => response);
452+
}
453+
454+
test(
455+
'pastikan endpoint deleteTrackUser benar-benar terpanggil dengan method DELETE',
456+
() async {
457+
// arrange
458+
setUpMockDioSuccess();
459+
460+
// act
461+
await remoteDataSource.deleteTrackUser(trackId);
462+
463+
// assert
464+
verify(mockDio.delete('$baseUrl/$trackId', options: anyNamed('options')));
465+
},
466+
);
467+
468+
test(
469+
'pastikan mengembalikan objek class model GeneralResponse ketika menerima respon sukses '
470+
'dari endpoint',
471+
() async {
472+
// arrange
473+
setUpMockDioSuccess();
474+
475+
// act
476+
final result = await remoteDataSource.deleteTrackUser(trackId);
477+
478+
// assert
479+
expect(result, tResponse);
480+
},
481+
);
482+
483+
test(
484+
'pastikan akan menerima exception DioException ketika menerima respon kegagalan dari endpoint',
485+
() async {
486+
// arrange
487+
final response = Response(
488+
requestOptions: tRequestOptions,
489+
data: 'Bad Request',
490+
statusCode: 400,
491+
);
492+
when(mockDio.delete(any, options: anyNamed('options'))).thenAnswer((_) async => response);
493+
494+
// act
495+
final call = remoteDataSource.deleteTrackUser(trackId);
496+
497+
// assert
498+
expect(() => call, throwsA(const TypeMatcher<DioException>()));
499+
},
500+
);
501+
});
431502
}

0 commit comments

Comments
 (0)