Skip to content

Commit 6fb89f8

Browse files
committed
feat: Buat business logic fitur delete track user
Sekalian dengan unit test-nya.
1 parent 40fd49c commit 6fb89f8

File tree

6 files changed

+184
-1
lines changed

6 files changed

+184
-1
lines changed

lib/feature/presentation/bloc/tracking/tracking_bloc.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:bloc_concurrency/bloc_concurrency.dart';
55
import 'package:dipantau_desktop_client/core/util/helper.dart';
66
import 'package:dipantau_desktop_client/feature/data/model/create_track/create_track_body.dart';
77
import 'package:dipantau_desktop_client/feature/domain/usecase/create_track/create_track.dart';
8+
import 'package:dipantau_desktop_client/feature/domain/usecase/delete_track_user/delete_track_user.dart';
89

910
part 'tracking_event.dart';
1011

@@ -13,12 +14,16 @@ part 'tracking_state.dart';
1314
class TrackingBloc extends Bloc<TrackingEvent, TrackingState> {
1415
final CreateTrack createTrack;
1516
final Helper helper;
17+
final DeleteTrackUser deleteTrackUser;
1618

1719
TrackingBloc({
1820
required this.createTrack,
1921
required this.helper,
22+
required this.deleteTrackUser,
2023
}) : super(InitialTrackingState()) {
2124
on<CreateTimeTrackingEvent>(_onCreateTimeTrackingEvent, transformer: sequential());
25+
26+
on<DeleteTrackUserTrackingEvent>(_onDeleteTrackUserTrackingEvent);
2227
}
2328

2429
FutureOr<void> _onCreateTimeTrackingEvent(
@@ -42,4 +47,31 @@ class TrackingBloc extends Bloc<TrackingEvent, TrackingState> {
4247
final errorMessage = helper.getErrorMessageFromFailure(failure);
4348
emit(FailureTrackingState(errorMessage: errorMessage));
4449
}
50+
51+
FutureOr<void> _onDeleteTrackUserTrackingEvent(
52+
DeleteTrackUserTrackingEvent event,
53+
Emitter<TrackingState> emit,
54+
) async {
55+
emit(LoadingTrackingState());
56+
await Future.delayed(const Duration(seconds: 3));
57+
final trackId = event.trackId;
58+
final result = await deleteTrackUser(
59+
ParamsDeleteTrackUser(
60+
trackId: event.trackId,
61+
),
62+
);
63+
final response = result.response;
64+
final failure = result.failure;
65+
if (response != null) {
66+
emit(
67+
SuccessDeleteTrackUserTrackingState(
68+
trackId: trackId,
69+
),
70+
);
71+
return;
72+
}
73+
74+
final errorMessage = helper.getErrorMessageFromFailure(failure);
75+
emit(FailureTrackingState(errorMessage: errorMessage));
76+
}
4577
}

lib/feature/presentation/bloc/tracking/tracking_event.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,15 @@ class CreateTimeTrackingEvent extends TrackingEvent {
1717
String toString() {
1818
return 'CreateTimeTrackingEvent{body: $body, trackEntityId: $trackEntityId}';
1919
}
20+
}
21+
22+
class DeleteTrackUserTrackingEvent extends TrackingEvent {
23+
final int trackId;
24+
25+
DeleteTrackUserTrackingEvent({required this.trackId});
26+
27+
@override
28+
String toString() {
29+
return 'DeleteTrackUserTrackingEvent{trackId: $trackId}';
30+
}
2031
}

lib/feature/presentation/bloc/tracking/tracking_state.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,15 @@ class SuccessCreateTimeTrackingState extends TrackingState {
3232
String toString() {
3333
return 'SuccessCreateTimeTrackingState{files: $files, trackEntityId: $trackEntityId}';
3434
}
35-
}
35+
}
36+
37+
class SuccessDeleteTrackUserTrackingState extends TrackingState {
38+
final int trackId;
39+
40+
SuccessDeleteTrackUserTrackingState({required this.trackId});
41+
42+
@override
43+
String toString() {
44+
return 'SuccessDeleteTrackUserTrackingState{trackId: $trackId}';
45+
}
46+
}

test/feature/presentation/bloc/tracking/tracking_bloc_test.dart

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:dipantau_desktop_client/core/error/failure.dart';
55
import 'package:dipantau_desktop_client/feature/data/model/create_track/create_track_body.dart';
66
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
77
import 'package:dipantau_desktop_client/feature/domain/usecase/create_track/create_track.dart';
8+
import 'package:dipantau_desktop_client/feature/domain/usecase/delete_track_user/delete_track_user.dart';
89
import 'package:dipantau_desktop_client/feature/presentation/bloc/tracking/tracking_bloc.dart';
910
import 'package:flutter_test/flutter_test.dart';
1011
import 'package:mockito/mockito.dart';
@@ -16,13 +17,16 @@ void main() {
1617
late TrackingBloc bloc;
1718
late MockCreateTrack mockCreateTrack;
1819
late MockHelper mockHelper;
20+
late MockDeleteTrackUser mockDeleteTrackUser;
1921

2022
setUp(() {
2123
mockCreateTrack = MockCreateTrack();
2224
mockHelper = MockHelper();
25+
mockDeleteTrackUser = MockDeleteTrackUser();
2326
bloc = TrackingBloc(
2427
createTrack: mockCreateTrack,
2528
helper: mockHelper,
29+
deleteTrackUser: mockDeleteTrackUser,
2630
);
2731
});
2832

@@ -134,4 +138,99 @@ void main() {
134138
},
135139
);
136140
});
141+
142+
group('delete track user', () {
143+
const trackId = 1;
144+
final params = ParamsDeleteTrackUser(trackId: trackId);
145+
final response = GeneralResponse.fromJson(
146+
json.decode(
147+
fixture('general_response.json'),
148+
),
149+
);
150+
final event = DeleteTrackUserTrackingEvent(trackId: trackId);
151+
152+
blocTest(
153+
'pastikan emit [LoadingTrackingState, SuccessDeleteTrackingUserTrackingState] ketika terima event '
154+
'DeleteTrackUserTrackingEvent dengan proses berhasil',
155+
build: () {
156+
final result = (failure: null, response: response);
157+
when(mockDeleteTrackUser(any)).thenAnswer((_) async => result);
158+
return bloc;
159+
},
160+
act: (TrackingBloc bloc) {
161+
return bloc.add(event);
162+
},
163+
wait: const Duration(seconds: 3),
164+
expect: () => [
165+
isA<LoadingTrackingState>(),
166+
isA<SuccessDeleteTrackUserTrackingState>(),
167+
],
168+
verify: (_) {
169+
verify(mockDeleteTrackUser(params));
170+
},
171+
);
172+
173+
blocTest(
174+
'pastikan emit [LoadingTrackingState, FailureTrackingState] ketika terima event '
175+
'DeleteTrackUserTrackingEvent dengan proses gagal dari API',
176+
build: () {
177+
final result = (failure: ServerFailure(tErrorMessage), response: null);
178+
when(mockDeleteTrackUser(any)).thenAnswer((_) async => result);
179+
return bloc;
180+
},
181+
act: (TrackingBloc bloc) {
182+
return bloc.add(event);
183+
},
184+
wait: const Duration(seconds: 3),
185+
expect: () => [
186+
isA<LoadingTrackingState>(),
187+
isA<FailureTrackingState>(),
188+
],
189+
verify: (_) {
190+
verify(mockDeleteTrackUser(params));
191+
},
192+
);
193+
194+
blocTest(
195+
'pastikan emit [LoadingTrackingState, FailureTrackingState] ketika terima event '
196+
'DeleteTrackUserTrackingEvent dengan kondisi internet tidak terhubung',
197+
build: () {
198+
final result = (failure: ConnectionFailure(), response: null);
199+
when(mockDeleteTrackUser(any)).thenAnswer((_) async => result);
200+
return bloc;
201+
},
202+
act: (TrackingBloc bloc) {
203+
return bloc.add(event);
204+
},
205+
wait: const Duration(seconds: 3),
206+
expect: () => [
207+
isA<LoadingTrackingState>(),
208+
isA<FailureTrackingState>(),
209+
],
210+
verify: (_) {
211+
verify(mockDeleteTrackUser(params));
212+
},
213+
);
214+
215+
blocTest(
216+
'pastikan emit [LoadingTrackingState, FailureTrackingState] ketika terima event '
217+
'DeleteTrackUserTrackingEvent dengan proses gagal parsing respon JSON dari API',
218+
build: () {
219+
final result = (failure: ParsingFailure(tErrorMessage), response: null);
220+
when(mockDeleteTrackUser(any)).thenAnswer((_) async => result);
221+
return bloc;
222+
},
223+
act: (TrackingBloc bloc) {
224+
return bloc.add(event);
225+
},
226+
wait: const Duration(seconds: 3),
227+
expect: () => [
228+
isA<LoadingTrackingState>(),
229+
isA<FailureTrackingState>(),
230+
],
231+
verify: (_) {
232+
verify(mockDeleteTrackUser(params));
233+
},
234+
);
235+
});
137236
}

test/feature/presentation/bloc/tracking/tracking_event_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,19 @@ void main() {
2626
},
2727
);
2828
});
29+
30+
group('DeleteTrackUserTrackingEvent', () {
31+
final tEvent = DeleteTrackUserTrackingEvent(trackId: 1);
32+
33+
test(
34+
'pastikan output dari fungsi toString',
35+
() async {
36+
// assert
37+
expect(
38+
tEvent.toString(),
39+
'DeleteTrackUserTrackingEvent{trackId: ${tEvent.trackId}}',
40+
);
41+
},
42+
);
43+
});
2944
}

test/feature/presentation/bloc/tracking/tracking_state_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,19 @@ void main() {
3434
},
3535
);
3636
});
37+
38+
group('SuccessDeleteTrackUserTrackingState', () {
39+
final tState = SuccessDeleteTrackUserTrackingState(trackId: 1);
40+
41+
test(
42+
'pastikan output dari fungsi toString',
43+
() async {
44+
// assert
45+
expect(
46+
tState.toString(),
47+
'SuccessDeleteTrackUserTrackingState{trackId: ${tState.trackId}}',
48+
);
49+
},
50+
);
51+
});
3752
}

0 commit comments

Comments
 (0)