Skip to content

Commit fe00358

Browse files
committed
feat: Buat implement function endpoint getUserSetting dan updateUserSetting
Sekalian dengan unit test-nya.
1 parent 88867ab commit fe00358

File tree

3 files changed

+243
-0
lines changed

3 files changed

+243
-0
lines changed

lib/feature/data/repository/setting/setting_repository_impl.dart

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:dipantau_desktop_client/feature/data/datasource/setting/setting_
55
import 'package:dipantau_desktop_client/feature/data/model/all_user_setting/all_user_setting_response.dart';
66
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_body.dart';
77
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_response.dart';
8+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_body.dart';
9+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_response.dart';
810
import 'package:dipantau_desktop_client/feature/domain/repository/setting/setting_repository.dart';
911

1012
class SettingRepositoryImpl implements SettingRepository {
@@ -115,4 +117,64 @@ class SettingRepositoryImpl implements SettingRepository {
115117
}
116118
return (failure: failure, response: response);
117119
}
120+
121+
@override
122+
Future<({Failure? failure, UserSettingResponse? response})> getUserSetting() async {
123+
Failure? failure;
124+
UserSettingResponse? response;
125+
final isConnected = await networkInfo.isConnected;
126+
if (isConnected) {
127+
try {
128+
response = await remoteDataSource.getUserSetting();
129+
} on DioException catch (error) {
130+
final message = error.message ?? error.toString();
131+
if (error.response == null) {
132+
failure = ServerFailure(message);
133+
} else {
134+
final errorMessage = getErrorMessageFromEndpoint(
135+
error.response?.data,
136+
message,
137+
error.response?.statusCode,
138+
);
139+
failure = ServerFailure(errorMessage);
140+
}
141+
} on TypeError catch (error) {
142+
final errorMessage = error.toString();
143+
failure = ParsingFailure(errorMessage);
144+
}
145+
} else {
146+
failure = ConnectionFailure();
147+
}
148+
return (failure: failure, response: response);
149+
}
150+
151+
@override
152+
Future<({Failure? failure, bool? response})> updateUserSetting(UserSettingBody body) async {
153+
Failure? failure;
154+
bool? response;
155+
final isConnected = await networkInfo.isConnected;
156+
if (isConnected) {
157+
try {
158+
response = await remoteDataSource.updateUserSetting(body);
159+
} on DioException catch (error) {
160+
final message = error.message ?? error.toString();
161+
if (error.response == null) {
162+
failure = ServerFailure(message);
163+
} else {
164+
final errorMessage = getErrorMessageFromEndpoint(
165+
error.response?.data,
166+
message,
167+
error.response?.statusCode,
168+
);
169+
failure = ServerFailure(errorMessage);
170+
}
171+
} on TypeError catch (error) {
172+
final errorMessage = error.toString();
173+
failure = ParsingFailure(errorMessage);
174+
}
175+
} else {
176+
failure = ConnectionFailure();
177+
}
178+
return (failure: failure, response: response);
179+
}
118180
}

lib/feature/domain/repository/setting/setting_repository.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ import 'package:dipantau_desktop_client/core/error/failure.dart';
22
import 'package:dipantau_desktop_client/feature/data/model/all_user_setting/all_user_setting_response.dart';
33
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_body.dart';
44
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_response.dart';
5+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_body.dart';
6+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_response.dart';
57

68
abstract class SettingRepository {
79
Future<({Failure? failure, KvSettingResponse? response})> getKvSetting();
810

911
Future<({Failure? failure, bool? response})> setKvSetting(KvSettingBody body);
1012

1113
Future<({Failure? failure, AllUserSettingResponse? response})> getAllUserSetting();
14+
15+
Future<({Failure? failure, UserSettingResponse? response})> getUserSetting();
16+
17+
Future<({Failure? failure, bool? response})> updateUserSetting(UserSettingBody body);
1218
}

test/feature/data/repository/setting/setting_repository_impl_test.dart

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:dipantau_desktop_client/core/error/failure.dart';
55
import 'package:dipantau_desktop_client/feature/data/model/all_user_setting/all_user_setting_response.dart';
66
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_body.dart';
77
import 'package:dipantau_desktop_client/feature/data/model/kv_setting/kv_setting_response.dart';
8+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_body.dart';
9+
import 'package:dipantau_desktop_client/feature/data/model/user_setting/user_setting_response.dart';
810
import 'package:dipantau_desktop_client/feature/data/repository/setting/setting_repository_impl.dart';
911
import 'package:flutter_test/flutter_test.dart';
1012
import 'package:mockito/mockito.dart';
@@ -359,4 +361,177 @@ void main() {
359361

360362
testDisconnected(() => repository.getAllUserSetting());
361363
});
364+
365+
group('getUserSetting', () {
366+
final tResponse = UserSettingResponse.fromJson(
367+
json.decode(
368+
fixture('user_setting_response.json'),
369+
),
370+
);
371+
372+
test(
373+
'pastikan mengembalikan objek model UserSettingResponse ketika remote data source berhasil menerima '
374+
'respon sukses dari endpoint',
375+
() async {
376+
// arrange
377+
setUpMockNetworkConnected();
378+
when(mockRemoteDataSource.getUserSetting()).thenAnswer((_) async => tResponse);
379+
380+
// act
381+
final result = await repository.getUserSetting();
382+
383+
// assert
384+
verify(mockRemoteDataSource.getUserSetting());
385+
expect(result.response, tResponse);
386+
},
387+
);
388+
389+
test(
390+
'pastikan mengembalikan objek ServerFailure ketika remote data source berhasil menerima respon timeout dari endpoint',
391+
() async {
392+
// arrange
393+
setUpMockNetworkConnected();
394+
when(mockRemoteDataSource.getUserSetting())
395+
.thenThrow(DioException(requestOptions: tRequestOptions, message: 'testError'));
396+
397+
// act
398+
final result = await repository.getUserSetting();
399+
400+
// assert
401+
verify(mockRemoteDataSource.getUserSetting());
402+
expect(result.failure, ServerFailure('testError'));
403+
},
404+
);
405+
406+
test(
407+
'pastikan mengembalikan objek ServerFailure ketika remote data source menerima respon kegagalan '
408+
'dari endpoint',
409+
() async {
410+
// arrange
411+
setUpMockNetworkConnected();
412+
when(mockRemoteDataSource.getUserSetting()).thenThrow(
413+
DioException(
414+
requestOptions: tRequestOptions,
415+
message: 'testError',
416+
response: Response(
417+
requestOptions: tRequestOptions,
418+
data: {
419+
'title': 'testTitleError',
420+
'message': 'testMessageError',
421+
},
422+
statusCode: 400,
423+
),
424+
),
425+
);
426+
427+
// act
428+
final result = await repository.getUserSetting();
429+
430+
// assert
431+
verify(mockRemoteDataSource.getUserSetting());
432+
expect(result.failure, ServerFailure('400 testMessageError'));
433+
},
434+
);
435+
436+
testServerFailureString(
437+
() => mockRemoteDataSource.getUserSetting(),
438+
() => repository.getUserSetting(),
439+
() => mockRemoteDataSource.getUserSetting(),
440+
);
441+
442+
testParsingFailure(
443+
() => mockRemoteDataSource.getUserSetting(),
444+
() => repository.getUserSetting(),
445+
() => mockRemoteDataSource.getUserSetting(),
446+
);
447+
448+
testDisconnected(() => repository.getUserSetting());
449+
});
450+
451+
group('updateUserSetting', () {
452+
final body = UserSettingBody.fromJson(
453+
json.decode(
454+
fixture('user_setting_body.json'),
455+
),
456+
);
457+
const tResponse = true;
458+
459+
test(
460+
'pastikan mengembalikan nilai boolean true ketika remote data source berhasil menerima '
461+
'respon sukses dari endpoint',
462+
() async {
463+
// arrange
464+
setUpMockNetworkConnected();
465+
when(mockRemoteDataSource.updateUserSetting(any)).thenAnswer((_) async => tResponse);
466+
467+
// act
468+
final result = await repository.updateUserSetting(body);
469+
470+
// assert
471+
verify(mockRemoteDataSource.updateUserSetting(body));
472+
expect(result.response, tResponse);
473+
},
474+
);
475+
476+
test(
477+
'pastikan mengembalikan objek ServerFailure ketika remote data source berhasil menerima respon timeout dari endpoint',
478+
() async {
479+
// arrange
480+
setUpMockNetworkConnected();
481+
when(mockRemoteDataSource.updateUserSetting(any))
482+
.thenThrow(DioException(requestOptions: tRequestOptions, message: 'testError'));
483+
484+
// act
485+
final result = await repository.updateUserSetting(body);
486+
487+
// assert
488+
verify(mockRemoteDataSource.updateUserSetting(body));
489+
expect(result.failure, ServerFailure('testError'));
490+
},
491+
);
492+
493+
test(
494+
'pastikan mengembalikan objek ServerFailure ketika remote data source menerima respon kegagalan '
495+
'dari endpoint',
496+
() async {
497+
// arrange
498+
setUpMockNetworkConnected();
499+
when(mockRemoteDataSource.updateUserSetting(any)).thenThrow(
500+
DioException(
501+
requestOptions: tRequestOptions,
502+
message: 'testError',
503+
response: Response(
504+
requestOptions: tRequestOptions,
505+
data: {
506+
'title': 'testTitleError',
507+
'message': 'testMessageError',
508+
},
509+
statusCode: 400,
510+
),
511+
),
512+
);
513+
514+
// act
515+
final result = await repository.updateUserSetting(body);
516+
517+
// assert
518+
verify(mockRemoteDataSource.updateUserSetting(body));
519+
expect(result.failure, ServerFailure('400 testMessageError'));
520+
},
521+
);
522+
523+
testServerFailureString(
524+
() => mockRemoteDataSource.updateUserSetting(any),
525+
() => repository.updateUserSetting(body),
526+
() => mockRemoteDataSource.updateUserSetting(body),
527+
);
528+
529+
testParsingFailure(
530+
() => mockRemoteDataSource.updateUserSetting(any),
531+
() => repository.updateUserSetting(body),
532+
() => mockRemoteDataSource.updateUserSetting(body),
533+
);
534+
535+
testDisconnected(() => repository.updateUserSetting(body));
536+
});
362537
}

0 commit comments

Comments
 (0)