Skip to content

Commit 39a1ea9

Browse files
committed
feat: Buat business logic sync manual didalam sync manual bloc
Sekalian dengan unit test-nya.
1 parent be55547 commit 39a1ea9

6 files changed

Lines changed: 265 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'dart:async';
2+
3+
import 'package:bloc/bloc.dart';
4+
import 'package:bloc_concurrency/bloc_concurrency.dart';
5+
import 'package:dipantau_desktop_client/core/util/helper.dart';
6+
import 'package:dipantau_desktop_client/feature/data/model/create_track/bulk_create_track_data_body.dart';
7+
import 'package:dipantau_desktop_client/feature/domain/usecase/bulk_create_track_data/bulk_create_track_data.dart';
8+
9+
part 'sync_manual_event.dart';
10+
11+
part 'sync_manual_state.dart';
12+
13+
class SyncManualBloc extends Bloc<SyncManualEvent, SyncManualState> {
14+
final Helper helper;
15+
final BulkCreateTrackData bulkCreateTrackData;
16+
17+
SyncManualBloc({
18+
required this.helper,
19+
required this.bulkCreateTrackData,
20+
}) : super(InitialSyncManualState()) {
21+
on<RunSyncManualEvent>(_onRunSyncManualEvent, transformer: restartable());
22+
}
23+
24+
FutureOr<void> _onRunSyncManualEvent(
25+
RunSyncManualEvent event,
26+
Emitter<SyncManualState> emit,
27+
) async {
28+
emit(LoadingSyncManualState());
29+
await Future.delayed(const Duration(milliseconds: 2500));
30+
final (:response, :failure) = await bulkCreateTrackData(
31+
ParamsBulkCreateTrackData(
32+
body: event.body,
33+
),
34+
);
35+
if (response != null) {
36+
emit(SuccessRunSyncManualState());
37+
return;
38+
}
39+
40+
final errorMessage = helper.getErrorMessageFromFailure(failure);
41+
emit(FailureSyncManualState(errorMessage: errorMessage));
42+
}
43+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
part of 'sync_manual_bloc.dart';
2+
3+
abstract class SyncManualEvent {}
4+
5+
class RunSyncManualEvent extends SyncManualEvent {
6+
final BulkCreateTrackDataBody body;
7+
8+
RunSyncManualEvent({required this.body});
9+
10+
@override
11+
String toString() {
12+
return 'RunSyncManualEvent{body: $body}';
13+
}
14+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
part of 'sync_manual_bloc.dart';
2+
3+
abstract class SyncManualState {}
4+
5+
class InitialSyncManualState extends SyncManualState {}
6+
7+
class LoadingSyncManualState extends SyncManualState {}
8+
9+
class FailureSyncManualState extends SyncManualState {
10+
final String errorMessage;
11+
12+
FailureSyncManualState({required this.errorMessage});
13+
14+
@override
15+
String toString() {
16+
return 'FailureSyncManualState{errorMessage: $errorMessage}';
17+
}
18+
}
19+
20+
class SuccessRunSyncManualState extends SyncManualState {}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
import 'dart:convert';
2+
3+
import 'package:bloc_test/bloc_test.dart';
4+
import 'package:dipantau_desktop_client/core/error/failure.dart';
5+
import 'package:dipantau_desktop_client/feature/data/model/create_track/bulk_create_track_data_body.dart';
6+
import 'package:dipantau_desktop_client/feature/data/model/general/general_response.dart';
7+
import 'package:dipantau_desktop_client/feature/domain/usecase/bulk_create_track_data/bulk_create_track_data.dart';
8+
import 'package:dipantau_desktop_client/feature/presentation/bloc/sync_manual/sync_manual_bloc.dart';
9+
import 'package:flutter_test/flutter_test.dart';
10+
import 'package:mockito/mockito.dart';
11+
12+
import '../../../../fixture/fixture_reader.dart';
13+
import '../../../../helper/mock_helper.mocks.dart';
14+
15+
void main() {
16+
late SyncManualBloc bloc;
17+
late MockHelper mockHelper;
18+
late MockBulkCreateTrackData mockBulkCreateTrackData;
19+
20+
setUp(() {
21+
mockHelper = MockHelper();
22+
mockBulkCreateTrackData = MockBulkCreateTrackData();
23+
bloc = SyncManualBloc(
24+
helper: mockHelper,
25+
bulkCreateTrackData: mockBulkCreateTrackData,
26+
);
27+
});
28+
29+
const tErrorMessage = 'testErrorMessage';
30+
31+
test(
32+
'pastikan output dari initialState',
33+
() async {
34+
// assert
35+
expect(
36+
bloc.state,
37+
isA<InitialSyncManualState>(),
38+
);
39+
},
40+
);
41+
42+
group('run sync manual', () {
43+
final tBody = BulkCreateTrackDataBody.fromJson(
44+
json.decode(
45+
fixture('bulk_create_track_data_body.json'),
46+
),
47+
);
48+
final tEvent = RunSyncManualEvent(body: tBody);
49+
final tParams = ParamsBulkCreateTrackData(body: tBody);
50+
51+
blocTest(
52+
'pastikan emit [LoadingSyncManualState, SuccessRunSyncManualState] ketika terima event '
53+
'RunSyncManualEvent dengan proses berhasil',
54+
build: () {
55+
final tResponse = GeneralResponse.fromJson(
56+
json.decode(
57+
fixture('general_response.json'),
58+
),
59+
);
60+
final result = (failure: null, response: tResponse);
61+
when(mockBulkCreateTrackData(any)).thenAnswer((_) async => result);
62+
return bloc;
63+
},
64+
act: (SyncManualBloc bloc) {
65+
return bloc.add(tEvent);
66+
},
67+
wait: const Duration(milliseconds: 2500),
68+
expect: () => [
69+
isA<LoadingSyncManualState>(),
70+
isA<SuccessRunSyncManualState>(),
71+
],
72+
verify: (_) {
73+
verify(mockBulkCreateTrackData(tParams));
74+
},
75+
);
76+
77+
blocTest(
78+
'pastikan emit [LoadingSyncManualState, FailureSyncManualState] ketika terima event '
79+
'RunSyncManualEvent dengan proses gagal dari endpoint',
80+
build: () {
81+
final result = (failure: ServerFailure(tErrorMessage), response: null);
82+
when(mockBulkCreateTrackData(any)).thenAnswer((_) async => result);
83+
return bloc;
84+
},
85+
act: (SyncManualBloc bloc) {
86+
return bloc.add(tEvent);
87+
},
88+
wait: const Duration(milliseconds: 2500),
89+
expect: () => [
90+
isA<LoadingSyncManualState>(),
91+
isA<FailureSyncManualState>(),
92+
],
93+
verify: (_) {
94+
verify(mockBulkCreateTrackData(tParams));
95+
},
96+
);
97+
98+
blocTest(
99+
'pastikan emit [LoadingSyncManualState, FailureSyncManualState] ketika terima event '
100+
'RunSyncManualEvent dengan kondisi gagal terhubung ke internet ketika hit endpoint',
101+
build: () {
102+
final result = (failure: ConnectionFailure(), response: null);
103+
when(mockBulkCreateTrackData(any)).thenAnswer((_) async => result);
104+
return bloc;
105+
},
106+
act: (SyncManualBloc bloc) {
107+
return bloc.add(tEvent);
108+
},
109+
wait: const Duration(milliseconds: 2500),
110+
expect: () => [
111+
isA<LoadingSyncManualState>(),
112+
isA<FailureSyncManualState>(),
113+
],
114+
verify: (_) {
115+
verify(mockBulkCreateTrackData(tParams));
116+
},
117+
);
118+
119+
blocTest(
120+
'pastikan emit [LoadingSyncManualState, FailureSyncManualState] ketika terima event '
121+
'RunSyncManualEvent dengan proses gagal parsing respon JSON dari endpoint',
122+
build: () {
123+
final result = (failure: ParsingFailure(tErrorMessage), response: null);
124+
when(mockBulkCreateTrackData(any)).thenAnswer((_) async => result);
125+
return bloc;
126+
},
127+
act: (SyncManualBloc bloc) {
128+
return bloc.add(tEvent);
129+
},
130+
wait: const Duration(milliseconds: 2500),
131+
expect: () => [
132+
isA<LoadingSyncManualState>(),
133+
isA<FailureSyncManualState>(),
134+
],
135+
verify: (_) {
136+
verify(mockBulkCreateTrackData(tParams));
137+
},
138+
);
139+
});
140+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'dart:convert';
2+
3+
import 'package:dipantau_desktop_client/feature/data/model/create_track/bulk_create_track_data_body.dart';
4+
import 'package:dipantau_desktop_client/feature/presentation/bloc/sync_manual/sync_manual_bloc.dart';
5+
import 'package:flutter_test/flutter_test.dart';
6+
7+
import '../../../../fixture/fixture_reader.dart';
8+
9+
void main() {
10+
group('RunSyncManualEvent', () {
11+
final tBody = BulkCreateTrackDataBody.fromJson(
12+
json.decode(
13+
fixture('bulk_create_track_data_body.json'),
14+
),
15+
);
16+
final tEvent = RunSyncManualEvent(body: tBody);
17+
18+
test(
19+
'pastikan output dari fungsi toString',
20+
() async {
21+
// assert
22+
expect(
23+
tEvent.toString(),
24+
'RunSyncManualEvent{body: ${tEvent.body}}',
25+
);
26+
},
27+
);
28+
});
29+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:dipantau_desktop_client/feature/presentation/bloc/sync_manual/sync_manual_bloc.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
void main() {
5+
group('FailureSyncManualState', () {
6+
final tState = FailureSyncManualState(errorMessage: 'testErrorMessage');
7+
8+
test(
9+
'pastikan output dari fungsi toString',
10+
() async {
11+
// assert
12+
expect(
13+
tState.toString(),
14+
'FailureSyncManualState{errorMessage: ${tState.errorMessage}}',
15+
);
16+
},
17+
);
18+
});
19+
}

0 commit comments

Comments
 (0)