결재 및 마스터 모듈을 v4 API 계약에 맞게 조정

This commit is contained in:
JiWoong Sul
2025-10-16 17:27:20 +09:00
parent d5c99627db
commit 9e2244f260
34 changed files with 1394 additions and 330 deletions

View File

@@ -8,6 +8,8 @@ import 'package:superport_v2/features/approvals/domain/entities/approval_proceed
import 'package:superport_v2/features/approvals/domain/repositories/approval_repository.dart';
import 'package:superport_v2/features/approvals/domain/repositories/approval_template_repository.dart';
import 'package:superport_v2/features/approvals/presentation/controllers/approval_controller.dart';
import 'package:superport_v2/features/inventory/lookups/domain/entities/lookup_item.dart';
import 'package:superport_v2/features/inventory/lookups/domain/repositories/inventory_lookup_repository.dart';
/// ApprovalRepository 모킹 클래스.
class _MockApprovalRepository extends Mock implements ApprovalRepository {}
@@ -26,6 +28,9 @@ class _MockApprovalTemplateRepository extends Mock
class _FakeStepAssignmentInput extends Fake
implements ApprovalStepAssignmentInput {}
class _MockInventoryLookupRepository extends Mock
implements InventoryLookupRepository {}
void main() {
late ApprovalController controller;
late _MockApprovalRepository repository;
@@ -90,10 +95,9 @@ void main() {
() => repository.list(
page: any(named: 'page'),
pageSize: any(named: 'pageSize'),
query: any(named: 'query'),
status: any(named: 'status'),
from: any(named: 'from'),
to: any(named: 'to'),
transactionId: any(named: 'transactionId'),
approvalStatusId: any(named: 'approvalStatusId'),
requestedById: any(named: 'requestedById'),
includeHistories: any(named: 'includeHistories'),
includeSteps: any(named: 'includeSteps'),
),
@@ -110,11 +114,13 @@ void main() {
// 검색어/상태/기간 필터가 Repository 호출에 반영되는지 확인한다.
test('필터 전달을 검증한다', () async {
controller.updateQuery('TRX');
controller.updateTransactionFilter(55);
controller.updateStatusFilter(ApprovalStatusFilter.approved);
final from = DateTime(2024, 4, 1);
final to = DateTime(2024, 4, 30);
controller.updateDateRange(from, to);
controller.updateRequestedByFilter(
id: 77,
name: '상신자',
employeeNo: 'EMP077',
);
await controller.fetch(page: 3);
@@ -122,10 +128,9 @@ void main() {
() => repository.list(
page: 3,
pageSize: 20,
query: 'TRX',
status: 'approved',
from: from,
to: to,
transactionId: 55,
approvalStatusId: null,
requestedById: 77,
includeHistories: false,
includeSteps: false,
),
@@ -138,10 +143,9 @@ void main() {
() => repository.list(
page: any(named: 'page'),
pageSize: any(named: 'pageSize'),
query: any(named: 'query'),
status: any(named: 'status'),
from: any(named: 'from'),
to: any(named: 'to'),
transactionId: any(named: 'transactionId'),
approvalStatusId: any(named: 'approvalStatusId'),
requestedById: any(named: 'requestedById'),
includeHistories: any(named: 'includeHistories'),
includeSteps: any(named: 'includeSteps'),
),
@@ -151,6 +155,46 @@ void main() {
expect(controller.errorMessage, isNotNull);
});
test('상태 룩업 로드 후 status ID를 전달한다', () async {
final lookupRepository = _MockInventoryLookupRepository();
final ctrl = ApprovalController(
approvalRepository: repository,
templateRepository: templateRepository,
lookupRepository: lookupRepository,
);
when(
() => lookupRepository.fetchApprovalStatuses(
activeOnly: any(named: 'activeOnly'),
),
).thenAnswer(
(_) async => [
LookupItem(
id: 5,
name: '승인완료',
code: 'approved',
isDefault: false,
isActive: true,
),
],
);
await ctrl.loadStatusLookups();
ctrl.updateStatusFilter(ApprovalStatusFilter.approved);
await ctrl.fetch();
verify(
() => repository.list(
page: 1,
pageSize: 20,
transactionId: null,
approvalStatusId: 5,
requestedById: null,
includeHistories: false,
includeSteps: false,
),
).called(1);
});
});
group('selectApproval', () {
@@ -304,10 +348,9 @@ void main() {
() => repository.list(
page: any(named: 'page'),
pageSize: any(named: 'pageSize'),
query: any(named: 'query'),
status: any(named: 'status'),
from: any(named: 'from'),
to: any(named: 'to'),
transactionId: any(named: 'transactionId'),
approvalStatusId: any(named: 'approvalStatusId'),
requestedById: any(named: 'requestedById'),
includeHistories: any(named: 'includeHistories'),
includeSteps: any(named: 'includeSteps'),
),
@@ -471,10 +514,9 @@ void main() {
() => repository.list(
page: any(named: 'page'),
pageSize: any(named: 'pageSize'),
query: any(named: 'query'),
status: any(named: 'status'),
from: any(named: 'from'),
to: any(named: 'to'),
transactionId: any(named: 'transactionId'),
approvalStatusId: any(named: 'approvalStatusId'),
requestedById: any(named: 'requestedById'),
includeHistories: any(named: 'includeHistories'),
includeSteps: any(named: 'includeSteps'),
),
@@ -571,15 +613,19 @@ void main() {
});
test('필터 초기화', () {
controller.updateQuery('abc');
controller.updateTransactionFilter(42);
controller.updateStatusFilter(ApprovalStatusFilter.rejected);
controller.updateDateRange(DateTime(2024, 1, 1), DateTime(2024, 1, 31));
controller.updateRequestedByFilter(
id: 11,
name: '요청자',
employeeNo: 'EMP011',
);
controller.clearFilters();
expect(controller.query, isEmpty);
expect(controller.transactionIdFilter, isNull);
expect(controller.statusFilter, ApprovalStatusFilter.all);
expect(controller.fromDate, isNull);
expect(controller.toDate, isNull);
expect(controller.requestedById, isNull);
expect(controller.requestedByName, isNull);
});
}

View File

@@ -105,10 +105,9 @@ void main() {
() => repository.list(
page: any(named: 'page'),
pageSize: any(named: 'pageSize'),
query: any(named: 'query'),
status: any(named: 'status'),
from: any(named: 'from'),
to: any(named: 'to'),
transactionId: any(named: 'transactionId'),
approvalStatusId: any(named: 'approvalStatusId'),
requestedById: any(named: 'requestedById'),
includeHistories: any(named: 'includeHistories'),
includeSteps: any(named: 'includeSteps'),
),