결재 API 계약 보완 및 테스트 정리

This commit is contained in:
JiWoong Sul
2025-10-16 18:53:22 +09:00
parent 9e2244f260
commit efed3c1a6f
44 changed files with 1969 additions and 293 deletions

View File

@@ -245,7 +245,7 @@ class _StubApprovalRepository implements ApprovalRepository {
}
@override
Future<Approval> create(ApprovalInput input) {
Future<Approval> create(ApprovalCreateInput input) {
throw UnimplementedError();
}
@@ -260,7 +260,7 @@ class _StubApprovalRepository implements ApprovalRepository {
}
@override
Future<Approval> update(int id, ApprovalInput input) {
Future<Approval> update(ApprovalUpdateInput input) {
throw UnimplementedError();
}
}

View File

@@ -68,6 +68,104 @@ void main() {
expect(query['include'], 'steps,histories');
});
test('create는 필수 필드를 전달한다', () async {
const path = '/api/v1/approvals';
when(
() => apiClient.post<Map<String, dynamic>>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: {
'data': {
'id': 5001,
'approval_no': 'APP-2025-0001',
'transaction_id': 9001,
},
},
statusCode: 201,
requestOptions: RequestOptions(path: path),
),
);
final input = ApprovalCreateInput(
transactionId: 9001,
approvalNo: 'APP-2025-0001',
approvalStatusId: 1,
requestedById: 7,
note: ' 신규 결재 ',
);
await repository.create(input);
final captured = verify(
() => apiClient.post<Map<String, dynamic>>(
captureAny(),
data: captureAny(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).captured;
expect(captured.first, equals(path));
final payload = captured[1] as Map<String, dynamic>;
expect(payload['transaction_id'], 9001);
expect(payload['approval_no'], 'APP-2025-0001');
expect(payload['approval_status_id'], 1);
expect(payload['requested_by_id'], 7);
expect(payload['note'], '신규 결재');
});
test('update는 id를 포함해 패치를 수행한다', () async {
const path = '/api/v1/approvals/5001';
when(
() => apiClient.patch<Map<String, dynamic>>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: {
'data': {
'id': 5001,
'approval_no': 'APP-2025-0001',
'approval_status': {'id': 2, 'status_name': '진행중'},
},
},
statusCode: 200,
requestOptions: RequestOptions(path: path),
),
);
final input = ApprovalUpdateInput(
id: 5001,
approvalStatusId: 2,
note: '보류',
);
await repository.update(input);
final captured = verify(
() => apiClient.patch<Map<String, dynamic>>(
captureAny(),
data: captureAny(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).captured;
expect(captured.first, equals(path));
final payload = captured[1] as Map<String, dynamic>;
expect(payload['id'], 5001);
expect(payload['approval_status_id'], 2);
expect(payload['note'], '보류');
});
Map<String, dynamic> buildStep({
required int id,
required int order,

View File

@@ -15,7 +15,10 @@ import 'package:superport_v2/features/inventory/lookups/domain/repositories/inve
class _MockApprovalRepository extends Mock implements ApprovalRepository {}
/// Approval 생성 요청을 대체하기 위한 가짜 입력.
class _FakeApprovalInput extends Fake implements ApprovalInput {}
class _FakeApprovalCreateInput extends Fake implements ApprovalCreateInput {}
/// Approval 수정 요청을 대체하기 위한 가짜 입력.
class _FakeApprovalUpdateInput extends Fake implements ApprovalUpdateInput {}
/// 단계 행위 요청을 대체하기 위한 가짜 입력.
class _FakeStepActionInput extends Fake implements ApprovalStepActionInput {}
@@ -68,7 +71,8 @@ void main() {
}
setUpAll(() {
registerFallbackValue(_FakeApprovalInput());
registerFallbackValue(_FakeApprovalCreateInput());
registerFallbackValue(_FakeApprovalUpdateInput());
registerFallbackValue(_FakeStepActionInput());
registerFallbackValue(_FakeStepAssignmentInput());
});

View File

@@ -18,7 +18,9 @@ import 'package:superport_v2/features/inventory/lookups/domain/repositories/inve
class _MockApprovalRepository extends Mock implements ApprovalRepository {}
class _FakeApprovalInput extends Fake implements ApprovalInput {}
class _FakeApprovalCreateInput extends Fake implements ApprovalCreateInput {}
class _FakeApprovalUpdateInput extends Fake implements ApprovalUpdateInput {}
class _MockApprovalTemplateRepository extends Mock
implements ApprovalTemplateRepository {}
@@ -45,7 +47,8 @@ void main() {
TestWidgetsFlutterBinding.ensureInitialized();
setUpAll(() {
registerFallbackValue(_FakeApprovalInput());
registerFallbackValue(_FakeApprovalCreateInput());
registerFallbackValue(_FakeApprovalUpdateInput());
});
tearDown(() async {