API v4 계약 반영하고 보고서·입출고 화면 실연동 강화

This commit is contained in:
JiWoong Sul
2025-10-16 14:57:07 +09:00
parent 7e0f7b1c55
commit d5c99627db
34 changed files with 1767 additions and 327 deletions

View File

@@ -22,38 +22,19 @@ void main() {
repository = TransactionCustomerRepositoryRemote(apiClient: apiClient);
});
Map<String, dynamic> customerResponse() {
return {
'data': {
'customers': [
{
'id': 301,
'customer': {
'id': 700,
'customer_code': 'C-1',
'customer_name': '슈퍼포트',
},
'note': '테스트',
},
],
},
};
}
test('addCustomers는 거래 ID를 포함해 POST 요청을 보낸다', () async {
const path = '/api/v1/stock-transactions/77/customers';
when(
() => apiClient.post<Map<String, dynamic>>(
() => apiClient.post<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: customerResponse(),
(_) async => Response<void>(
requestOptions: RequestOptions(path: path),
statusCode: 200,
statusCode: 204,
),
);
@@ -63,7 +44,7 @@ void main() {
final payload =
verify(
() => apiClient.post<Map<String, dynamic>>(
() => apiClient.post<void>(
captureAny(),
data: captureAny(named: 'data'),
options: any(named: 'options'),
@@ -79,17 +60,16 @@ void main() {
test('updateCustomers는 PATCH 요청을 보낸다', () async {
const path = '/api/v1/stock-transactions/77/customers';
when(
() => apiClient.patch<Map<String, dynamic>>(
() => apiClient.patch<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: customerResponse(),
(_) async => Response<void>(
requestOptions: RequestOptions(path: path),
statusCode: 200,
statusCode: 204,
),
);
@@ -98,7 +78,7 @@ void main() {
]);
verify(
() => apiClient.patch<Map<String, dynamic>>(
() => apiClient.patch<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),

View File

@@ -22,36 +22,19 @@ void main() {
repository = TransactionLineRepositoryRemote(apiClient: apiClient);
});
Map<String, dynamic> lineResponse() {
return {
'data': {
'lines': [
{
'id': 101,
'line_no': 1,
'product': {'id': 11, 'product_code': 'P-1', 'product_name': '품목'},
'quantity': 3,
'unit_price': 1000,
},
],
},
};
}
test('addLines는 거래 ID를 포함한 POST 요청을 보낸다', () async {
const path = '/api/v1/stock-transactions/50/lines';
when(
() => apiClient.post<Map<String, dynamic>>(
() => apiClient.post<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: lineResponse(),
(_) async => Response<void>(
requestOptions: RequestOptions(path: path),
statusCode: 200,
statusCode: 204,
),
);
@@ -66,7 +49,7 @@ void main() {
final payload =
verify(
() => apiClient.post<Map<String, dynamic>>(
() => apiClient.post<void>(
captureAny(),
data: captureAny(named: 'data'),
options: any(named: 'options'),
@@ -82,17 +65,16 @@ void main() {
test('updateLines는 PATCH 요청을 사용한다', () async {
const path = '/api/v1/stock-transactions/50/lines';
when(
() => apiClient.patch<Map<String, dynamic>>(
() => apiClient.patch<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: lineResponse(),
(_) async => Response<void>(
requestOptions: RequestOptions(path: path),
statusCode: 200,
statusCode: 204,
),
);
@@ -101,7 +83,7 @@ void main() {
]);
verify(
() => apiClient.patch<Map<String, dynamic>>(
() => apiClient.patch<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
@@ -141,31 +123,28 @@ void main() {
test('restoreLine은 복구 엔드포인트를 호출한다', () async {
const path = '/api/v1/transaction-lines/101/restore';
when(
() => apiClient.post<Map<String, dynamic>>(
() => apiClient.post<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).thenAnswer(
(_) async => Response<Map<String, dynamic>>(
data: {
'data': {
'id': 101,
'line_no': 1,
'product': {'id': 11, 'product_code': 'P-1', 'product_name': '품목'},
'quantity': 3,
'unit_price': 1000,
},
},
(_) async => Response<void>(
requestOptions: RequestOptions(path: path),
statusCode: 200,
statusCode: 204,
),
);
final line = await repository.restoreLine(101);
await repository.restoreLine(101);
expect(line.id, 101);
expect(line.lineNo, 1);
verify(
() => apiClient.post<void>(
path,
data: any(named: 'data'),
options: any(named: 'options'),
cancelToken: any(named: 'cancelToken'),
),
).called(1);
});
}