Skip to content

Commit 59b917d

Browse files
committed
Tambahkan parameter baseUrl di endpoint ping
Tambahkan parameter `baseUrl` di endpoint, implement function endpoint, use case, dan business logic ping. Sekalian update unit testnya.
1 parent f5bbc6d commit 59b917d

File tree

13 files changed

+149
-41
lines changed

13 files changed

+149
-41
lines changed

lib/feature/data/datasource/general/general_remote_data_source.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ abstract class GeneralRemoteDataSource {
88
/// Throws [DioException] untuk semua error kode
99
late String pathPing;
1010

11-
Future<GeneralResponse> ping();
11+
Future<GeneralResponse> ping(String baseUrl);
1212
}
1313

1414
class GeneralRemoteDataSourceImpl implements GeneralRemoteDataSource {
@@ -24,7 +24,7 @@ class GeneralRemoteDataSourceImpl implements GeneralRemoteDataSource {
2424
String pathPing = '';
2525

2626
@override
27-
Future<GeneralResponse> ping() async {
27+
Future<GeneralResponse> ping(String baseUrl) async {
2828
pathPing = '$baseUrl/api/ping';
2929
final response = await dio.get(pathPing);
3030
if (response.statusCode.toString().startsWith('2')) {

lib/feature/data/repository/general/general_repository_impl.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ class GeneralRepositoryImpl implements GeneralRepository {
2525
}
2626

2727
@override
28-
Future<({Failure? failure, GeneralResponse? response})> ping() async {
28+
Future<({Failure? failure, GeneralResponse? response})> ping(String baseUrl) async {
2929
Failure? failure;
3030
GeneralResponse? response;
3131
final isConnected = await networkInfo.isConnected;
3232
if (isConnected) {
3333
try {
34-
response = await remoteDataSource.ping();
34+
response = await remoteDataSource.ping(baseUrl);
3535
} on DioException catch (error) {
3636
final message = error.message ?? error.toString();
3737
if (error.response == null) {

lib/feature/domain/repository/general/general_repository.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import 'package:dipantau_desktop_client/core/error/failure.dart';
22
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
33

44
abstract class GeneralRepository {
5-
Future<({Failure? failure, GeneralResponse? response})> ping();
5+
Future<({Failure? failure, GeneralResponse? response})> ping(String baseUrl);
66
}

lib/feature/domain/usecase/ping/ping.dart

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,33 @@ import 'package:dipantau_desktop_client/core/error/failure.dart';
22
import 'package:dipantau_desktop_client/core/usecase/usecase.dart';
33
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
44
import 'package:dipantau_desktop_client/feature/domain/repository/general/general_repository.dart';
5+
import 'package:equatable/equatable.dart';
56

6-
class Ping implements UseCaseRecords<GeneralResponse, NoParams> {
7+
class Ping implements UseCaseRecords<GeneralResponse, ParamsPing> {
78
final GeneralRepository repository;
89

910
Ping({required this.repository});
1011

1112
@override
12-
Future<({Failure? failure, GeneralResponse? response})> call(NoParams params) {
13-
return repository.ping();
13+
Future<({Failure? failure, GeneralResponse? response})> call(ParamsPing params) {
14+
return repository.ping(params.baseUrl);
1415
}
15-
}
16+
}
17+
18+
class ParamsPing extends Equatable {
19+
final String baseUrl;
20+
21+
ParamsPing({
22+
required this.baseUrl,
23+
});
24+
25+
@override
26+
List<Object?> get props => [
27+
baseUrl,
28+
];
29+
30+
@override
31+
String toString() {
32+
return 'ParamsPing{baseUrl: $baseUrl}';
33+
}
34+
}

lib/feature/presentation/bloc/setup_credential/setup_credential_bloc.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'dart:async';
22

33
import 'package:bloc/bloc.dart';
4-
import 'package:dipantau_desktop_client/core/usecase/usecase.dart';
54
import 'package:dipantau_desktop_client/core/util/helper.dart';
65
import 'package:dipantau_desktop_client/feature/domain/usecase/ping/ping.dart';
76

87
part 'setup_credential_event.dart';
8+
99
part 'setup_credential_state.dart';
1010

1111
class SetupCredentialBloc extends Bloc<SetupCredentialEvent, SetupCredentialState> {
@@ -23,12 +23,17 @@ class SetupCredentialBloc extends Bloc<SetupCredentialEvent, SetupCredentialStat
2323
PingSetupCredentialEvent event,
2424
Emitter<SetupCredentialState> emit,
2525
) async {
26+
final baseUrl = event.baseUrl;
2627
emit(LoadingSetupCredentialState());
27-
final result = await ping(NoParams());
28+
final result = await ping(
29+
ParamsPing(
30+
baseUrl: baseUrl,
31+
),
32+
);
2833
final response = result.response;
2934
final failure = result.failure;
3035
if (response != null) {
31-
emit(SuccessPingSetupCredentialState());
36+
emit(SuccessPingSetupCredentialState(baseUrl: baseUrl));
3237
return;
3338
}
3439

lib/feature/presentation/bloc/setup_credential/setup_credential_event.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,15 @@ part of 'setup_credential_bloc.dart';
22

33
abstract class SetupCredentialEvent {}
44

5-
class PingSetupCredentialEvent extends SetupCredentialEvent {}
5+
class PingSetupCredentialEvent extends SetupCredentialEvent {
6+
final String baseUrl;
7+
8+
PingSetupCredentialEvent({
9+
required this.baseUrl,
10+
});
11+
12+
@override
13+
String toString() {
14+
return 'PingSetupCredentialEvent{baseUrl: $baseUrl}';
15+
}
16+
}

lib/feature/presentation/bloc/setup_credential/setup_credential_state.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,15 @@ class FailureSetupCredentialState extends SetupCredentialState {
1919
}
2020
}
2121

22-
class SuccessPingSetupCredentialState extends SetupCredentialState {}
22+
class SuccessPingSetupCredentialState extends SetupCredentialState {
23+
final String baseUrl;
24+
25+
SuccessPingSetupCredentialState({
26+
required this.baseUrl,
27+
});
28+
29+
@override
30+
String toString() {
31+
return 'SuccessPingSetupCredentialState{baseUrl: $baseUrl}';
32+
}
33+
}

test/feature/data/datasource/general/general_remote_data_source_test.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ void main() {
3838

3939
group('ping', () {
4040
const tPathResponse = 'general_response.json';
41+
const hostname = baseUrl;
4142
final tResponse = GeneralResponse.fromJson(
4243
json.decode(
4344
fixture(tPathResponse),
@@ -64,10 +65,10 @@ void main() {
6465
setUpMockDioSuccess();
6566

6667
// act
67-
await remoteDataSource.ping();
68+
await remoteDataSource.ping(hostname);
6869

6970
// assert
70-
verify(mockDio.get('$baseUrl/api/ping'));
71+
verify(mockDio.get('$hostname/api/ping'));
7172
},
7273
);
7374

@@ -79,7 +80,7 @@ void main() {
7980
setUpMockDioSuccess();
8081

8182
// act
82-
final result = await remoteDataSource.ping();
83+
final result = await remoteDataSource.ping(hostname);
8384

8485
// assert
8586
expect(result, tResponse);
@@ -98,7 +99,7 @@ void main() {
9899
when(mockDio.get(any)).thenAnswer((_) async => response);
99100

100101
// act
101-
final call = remoteDataSource.ping();
102+
final call = remoteDataSource.ping(hostname);
102103

103104
// assert
104105
expect(() => call, throwsA(const TypeMatcher<DioException>()));

test/feature/data/repository/general/general_repository_impl_test.dart

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,21 @@ void main() {
105105
fixture('general_response.json'),
106106
),
107107
);
108+
const hostname = 'https://example.com';
108109

109110
test(
110111
'pastikan mengembalikan objek model GeneralResponse ketika RemoteDataSource berhasil menerima '
111112
'respon sukses dari endpoint',
112113
() async {
113114
// arrange
114115
setUpMockNetworkConnected();
115-
when(mockRemoteDataSource.ping()).thenAnswer((_) async => tResponse);
116+
when(mockRemoteDataSource.ping(any)).thenAnswer((_) async => tResponse);
116117

117118
// act
118-
final result = await repository.ping();
119+
final result = await repository.ping(hostname);
119120

120121
// assert
121-
verify(mockRemoteDataSource.ping());
122+
verify(mockRemoteDataSource.ping(hostname));
122123
expect(result.response, tResponse);
123124
},
124125
);
@@ -129,14 +130,14 @@ void main() {
129130
() async {
130131
// arrange
131132
setUpMockNetworkConnected();
132-
when(mockRemoteDataSource.ping())
133+
when(mockRemoteDataSource.ping(any))
133134
.thenThrow(DioException(requestOptions: tRequestOptions, message: 'testError'));
134135

135136
// act
136-
final result = await repository.ping();
137+
final result = await repository.ping(hostname);
137138

138139
// assert
139-
verify(mockRemoteDataSource.ping());
140+
verify(mockRemoteDataSource.ping(hostname));
140141
expect(result.failure, ServerFailure('testError'));
141142
},
142143
);
@@ -147,7 +148,7 @@ void main() {
147148
() async {
148149
// arrange
149150
setUpMockNetworkConnected();
150-
when(mockRemoteDataSource.ping()).thenThrow(
151+
when(mockRemoteDataSource.ping(any)).thenThrow(
151152
DioException(
152153
requestOptions: tRequestOptions,
153154
message: 'testError',
@@ -163,26 +164,26 @@ void main() {
163164
);
164165

165166
// act
166-
final result = await repository.ping();
167+
final result = await repository.ping(hostname);
167168

168169
// assert
169-
verify(mockRemoteDataSource.ping());
170+
verify(mockRemoteDataSource.ping(hostname));
170171
expect(result.failure, ServerFailure('400 testMessageError'));
171172
},
172173
);
173174

174175
testServerFailureString(
175-
() => mockRemoteDataSource.ping(),
176-
() => repository.ping(),
177-
() => mockRemoteDataSource.ping(),
176+
() => mockRemoteDataSource.ping(any),
177+
() => repository.ping(hostname),
178+
() => mockRemoteDataSource.ping(hostname),
178179
);
179180

180181
testParsingFailure(
181-
() => mockRemoteDataSource.ping(),
182-
() => repository.ping(),
183-
() => mockRemoteDataSource.ping(),
182+
() => mockRemoteDataSource.ping(any),
183+
() => repository.ping(hostname),
184+
() => mockRemoteDataSource.ping(hostname),
184185
);
185186

186-
testDisconnected(() => repository.ping());
187+
testDisconnected(() => repository.ping(hostname));
187188
});
188189
}

test/feature/domain/usecase/ping/ping_test.dart

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'dart:convert';
22

3-
import 'package:dipantau_desktop_client/core/usecase/usecase.dart';
43
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
54
import 'package:dipantau_desktop_client/feature/domain/usecase/ping/ping.dart';
65
import 'package:flutter_test/flutter_test.dart';
@@ -18,6 +17,9 @@ void main() {
1817
useCase = Ping(repository: mockRepository);
1918
});
2019

20+
const hostname = 'https://example.com';
21+
final tParams = ParamsPing(baseUrl: hostname);
22+
2123
test(
2224
'pastikan objek repository berhasil menerima respon sukses atau gagal dari endpoint',
2325
() async {
@@ -27,17 +29,40 @@ void main() {
2729
fixture('general_response.json'),
2830
),
2931
);
30-
final tParams = NoParams();
3132
final tResult = (failure: null, response: tResponse);
32-
when(mockRepository.ping()).thenAnswer((_) async => tResult);
33+
when(mockRepository.ping(any)).thenAnswer((_) async => tResult);
3334

3435
// act
3536
final result = await useCase(tParams);
3637

3738
// assert
3839
expect(result, tResult);
39-
verify(mockRepository.ping());
40+
verify(mockRepository.ping(hostname));
4041
verifyNoMoreInteractions(mockRepository);
4142
},
4243
);
44+
45+
test(
46+
'pastikan output dari nilai props',
47+
() async {
48+
// assert
49+
expect(
50+
tParams.props,
51+
[
52+
tParams.baseUrl,
53+
],
54+
);
55+
},
56+
);
57+
58+
test(
59+
'pastikan output dari fungsi toString',
60+
() async {
61+
// assert
62+
expect(
63+
tParams.toString(),
64+
'ParamsPing{baseUrl: ${tParams.baseUrl}}',
65+
);
66+
},
67+
);
4368
}

0 commit comments

Comments
 (0)