From c946fa457ca2494f880aadda3555dedff2e86aa6 Mon Sep 17 00:00:00 2001 From: hskwon Date: Thu, 4 Dec 2025 22:22:46 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20API=20Flow=20Tester=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=AC=B8=EC=84=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - flow-tester-auth.json: 인증 API 테스트 설정 추가 - flow-tester-client.json: Client API 테스트 설정 업데이트 - flow-tester-item-master.json: ItemMaster API 테스트 설정 추가 - LOGICAL_RELATIONSHIPS.md: 논리 관계 문서 업데이트 --- LOGICAL_RELATIONSHIPS.md | 23 +++- claudedocs/flow-tester-auth.json | 85 +++++++++++++ claudedocs/flow-tester-client.json | 26 ++-- claudedocs/flow-tester-item-master.json | 157 ++++++++++++++++++++++++ 4 files changed, 273 insertions(+), 18 deletions(-) create mode 100644 claudedocs/flow-tester-auth.json create mode 100644 claudedocs/flow-tester-item-master.json diff --git a/LOGICAL_RELATIONSHIPS.md b/LOGICAL_RELATIONSHIPS.md index 850b2b5..309b2e0 100644 --- a/LOGICAL_RELATIONSHIPS.md +++ b/LOGICAL_RELATIONSHIPS.md @@ -1,6 +1,6 @@ # 논리적 데이터베이스 관계 문서 -> **자동 생성**: 2025-12-03 15:19:21 +> **자동 생성**: 2025-12-04 20:56:47 > **소스**: Eloquent 모델 관계 분석 ## 📊 모델별 관계 현황 @@ -332,6 +332,27 @@ ### lot_sales - **lot()**: belongsTo → `lots` +### quotes +**모델**: `App\Models\Quote\Quote` + +- **client()**: belongsTo → `clients` +- **finalizer()**: belongsTo → `users` +- **creator()**: belongsTo → `users` +- **updater()**: belongsTo → `users` +- **items()**: hasMany → `quote_items` +- **revisions()**: hasMany → `quote_revisions` + +### quote_items +**모델**: `App\Models\Quote\QuoteItem` + +- **quote()**: belongsTo → `quotes` + +### quote_revisions +**모델**: `App\Models\Quote\QuoteRevision` + +- **quote()**: belongsTo → `quotes` +- **reviser()**: belongsTo → `users` + ### departments **모델**: `App\Models\Tenants\Department` diff --git a/claudedocs/flow-tester-auth.json b/claudedocs/flow-tester-auth.json new file mode 100644 index 0000000..48aac9c --- /dev/null +++ b/claudedocs/flow-tester-auth.json @@ -0,0 +1,85 @@ +{ + "name": "인증 플로우 테스트", + "description": "로그인, 프로필 조회, 토큰 갱신, 로그아웃 플로우를 테스트합니다.", + "version": "1.0", + "config": { + "apiKey": "42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a", + "baseUrl": "https://api.sam.kr/api/v1", + "timeout": 30000, + "stopOnFailure": true + }, + "variables": { + "user_id": "codebridgex", + "user_pwd": "code1234" + }, + "steps": [ + { + "id": "login", + "name": "로그인", + "method": "POST", + "endpoint": "/login", + "body": { + "user_id": "{{variables.user_id}}", + "user_pwd": "{{variables.user_pwd}}" + }, + "extract": { + "accessToken": "$.access_token", + "refreshToken": "$.refresh_token" + }, + "expect": { + "status": [200], + "jsonPath": { + "$.access_token": "@isString" + } + } + }, + { + "id": "get_profile", + "name": "프로필 조회", + "method": "GET", + "endpoint": "/users/me", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["login"], + "expect": { + "status": [200], + "jsonPath": { + "$.success": true + } + } + }, + { + "id": "refresh_token", + "name": "토큰 갱신", + "method": "POST", + "endpoint": "/refresh", + "body": { + "refresh_token": "{{login.refreshToken}}" + }, + "dependsOn": ["get_profile"], + "extract": { + "newToken": "$.access_token" + }, + "expect": { + "status": [200], + "jsonPath": { + "$.access_token": "@isString" + } + } + }, + { + "id": "logout", + "name": "로그아웃", + "method": "POST", + "endpoint": "/logout", + "headers": { + "Authorization": "Bearer {{refresh_token.newToken}}" + }, + "dependsOn": ["refresh_token"], + "expect": { + "status": [200, 204] + } + } + ] +} diff --git a/claudedocs/flow-tester-client.json b/claudedocs/flow-tester-client.json index 72d39e2..ab3c254 100644 --- a/claudedocs/flow-tester-client.json +++ b/claudedocs/flow-tester-client.json @@ -42,7 +42,7 @@ "Authorization": "Bearer {{login.token}}" }, "body": { - "client_code": "{{test_client_code}}", + "client_code": "{{variables.test_client_code}}", "name": "테스트 거래처", "contact_person": "홍길동", "phone": "02-1234-5678", @@ -58,7 +58,7 @@ "jsonPath": { "$.success": true, "$.data.id": "@isNumber", - "$.data.client_code": "{{test_client_code}}", + "$.data.client_code": "{{variables.test_client_code}}", "$.data.name": "테스트 거래처", "$.data.business_no": "123-45-67890", "$.data.business_type": "제조업", @@ -73,15 +73,10 @@ "id": "list_clients", "name": "3. 거래처 목록 조회", "method": "GET", - "endpoint": "/clients", + "endpoint": "/clients?page=1&size=20&q=테스트", "headers": { "Authorization": "Bearer {{login.token}}" }, - "params": { - "page": 1, - "size": 20, - "q": "테스트" - }, "expect": { "status": [200], "jsonPath": { @@ -104,7 +99,7 @@ "jsonPath": { "$.success": true, "$.data.id": "{{create_client.client_id}}", - "$.data.client_code": "{{test_client_code}}", + "$.data.client_code": "{{variables.test_client_code}}", "$.data.business_no": "123-45-67890", "$.data.business_type": "제조업", "$.data.business_item": "전자부품" @@ -140,7 +135,7 @@ }, { "id": "toggle_client", - "name": "6. 거래처 활성/비활성 토글", + "name": "6. 거래처 활성/비활성 토글 (N으로)", "method": "PATCH", "endpoint": "/clients/{{create_client.client_id}}/toggle", "headers": { @@ -150,7 +145,7 @@ "status": [200], "jsonPath": { "$.success": true, - "$.data.is_active": "N" + "$.data.is_active": false } } }, @@ -166,7 +161,7 @@ "status": [200], "jsonPath": { "$.success": true, - "$.data.is_active": "Y" + "$.data.is_active": true } } }, @@ -174,13 +169,10 @@ "id": "list_active_only", "name": "8. 활성 거래처만 조회", "method": "GET", - "endpoint": "/clients", + "endpoint": "/clients?only_active=1", "headers": { "Authorization": "Bearer {{login.token}}" }, - "params": { - "only_active": true - }, "expect": { "status": [200], "jsonPath": { @@ -220,4 +212,4 @@ } } ] -} +} \ No newline at end of file diff --git a/claudedocs/flow-tester-item-master.json b/claudedocs/flow-tester-item-master.json new file mode 100644 index 0000000..77663a7 --- /dev/null +++ b/claudedocs/flow-tester-item-master.json @@ -0,0 +1,157 @@ +{ + "name": "품목기준관리 통합 테스트", + "description": "품목기준관리 API의 전체 CRUD 플로우를 테스트합니다.", + "version": "1.0", + "config": { + "apiKey": "42Jfwc6EaRQ04GNRmLR5kzJp5UudSOzGGqjmdk1a", + "baseUrl": "https://api.sam.kr/api/v1", + "timeout": 30000, + "stopOnFailure": true + }, + "variables": { + "user_id": "codebridgex", + "user_pwd": "code1234", + "testItemCode": "TEST-ITEM-{{$timestamp}}", + "testItemName": "테스트 품목", + "testItemSpec": "100x100x10", + "updatedItemName": "수정된 테스트 품목", + "updatedItemSpec": "200x200x20" + }, + "steps": [ + { + "id": "login", + "name": "로그인", + "method": "POST", + "endpoint": "/login", + "body": { + "user_id": "{{variables.user_id}}", + "user_pwd": "{{variables.user_pwd}}" + }, + "extract": { + "accessToken": "$.access_token" + }, + "expect": { + "status": [200], + "jsonPath": { + "$.access_token": "@isString" + } + } + }, + { + "id": "create_item", + "name": "품목 생성", + "method": "POST", + "endpoint": "/item-master-data", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "body": { + "item_code": "{{variables.testItemCode}}", + "item_name": "{{variables.testItemName}}", + "item_spec": "{{variables.testItemSpec}}", + "item_type": "PRODUCT", + "unit": "EA", + "is_active": true + }, + "dependsOn": ["login"], + "extract": { + "createdItemId": "$.data.id", + "createdItemCode": "$.data.item_code" + }, + "expect": { + "status": [201], + "jsonPath": { + "$.data.id": "@exists" + } + } + }, + { + "id": "get_item", + "name": "품목 단건 조회", + "method": "GET", + "endpoint": "/item-master-data/{{create_item.createdItemId}}", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["create_item"], + "expect": { + "status": [200], + "jsonPath": { + "$.data.id": "@exists" + } + } + }, + { + "id": "list_items", + "name": "품목 목록 조회", + "method": "GET", + "endpoint": "/item-master-data", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["create_item"], + "expect": { + "status": [200], + "jsonPath": { + "$.data": "@isArray" + } + } + }, + { + "id": "update_item", + "name": "품목 수정", + "method": "PUT", + "endpoint": "/item-master-data/{{create_item.createdItemId}}", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "body": { + "item_name": "{{variables.updatedItemName}}", + "item_spec": "{{variables.updatedItemSpec}}" + }, + "dependsOn": ["get_item"], + "expect": { + "status": [200] + } + }, + { + "id": "verify_update", + "name": "수정 확인", + "method": "GET", + "endpoint": "/item-master-data/{{create_item.createdItemId}}", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["update_item"], + "expect": { + "status": [200] + } + }, + { + "id": "delete_item", + "name": "품목 삭제", + "method": "DELETE", + "endpoint": "/item-master-data/{{create_item.createdItemId}}", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["verify_update"], + "expect": { + "status": [200] + } + }, + { + "id": "verify_delete", + "name": "삭제 확인", + "method": "GET", + "endpoint": "/item-master-data/{{create_item.createdItemId}}", + "headers": { + "Authorization": "Bearer {{login.accessToken}}" + }, + "dependsOn": ["delete_item"], + "expect": { + "status": [404] + } + } + ] +} \ No newline at end of file