76일차 자료 추가 (답 포함): 실습 15개 · 의도 · 생활 속 예 · 실행 결과, LAB-A · 정답 워크플로우와 25단계 실행 기록, 교안 개요 30장 · 4단계 정리, 바이브 코딩 tretry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mcchaeandClaude Opus 5.5 committed 2026-10-29 23:18:55 +09:00
1 parent 3f36605043
commit bbf17e4696
141 files changed
+34072

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"llm": "up"
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "평소에는 분류됨",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"created": 2,
"unclassified": 0
}
}
},
{
"name": "LLM이 멈추면 미분류로 접수",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3,
"unclassified": 3,
"failed": 0
}
},
"before": [
{
"llm": "down"
}
],
"after": [
{
"llm": "up"
}
]
},
{
"name": "미분류도 접수 건으로",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"contains": {
"tickets": [
"미분류"
]
}
}
}
]
}
+89
View File
@@ -0,0 +1,89 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "같은 id가 두 번이면 두 번째는 거절",
"request": "requests/batch-dup-id.json",
"expect": {
"equals": {
"created": 2,
"rejected": 1,
"duplicates": 0
},
"contains": {
"results": [
"duplicate id"
]
}
}
},
{
"name": "11건은 400 (한 번에 10건까지)",
"request": "requests/batch-eleven.json",
"expect": {
"status": 400,
"contains": {
"error": [
"too many"
]
}
}
},
{
"name": "400이면 하나도 만들지 않음",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 2
}
}
},
{
"name": "평소 요청은 그대로",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3,
"rejected": 0
}
}
}
]
}
+129
View File
@@ -0,0 +1,129 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "flaky · 다시 해 보면 됨",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"created": 2,
"failed": 0
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "flaky"
}
}
]
},
{
"name": "error · 세 번 해도 실패",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 0,
"failed": 3
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "slow · 3초씩 세 번 기다리다 실패",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"failed": 3
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "slow"
}
}
]
},
{
"name": "실패라던 3건이 늦게 만들어짐 (2 + 3)",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 5
}
},
"before": [
{
"sleep": 8
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "같은 요청을 다시 · 멱등 키로 중복 없음",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3,
"duplicates": 3
}
}
}
]
}
+125
View File
@@ -0,0 +1,125 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "정상 3건",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3,
"failed": 0,
"rejected": 0
}
}
},
{
"name": "같은 요청을 다시 보내도 중복 없음",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3,
"duplicates": 3
}
}
},
{
"name": "만들어진 접수 건은 3개",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 3
}
}
},
{
"name": "잘못된 항목은 그 항목만 거절",
"request": "requests/batch-bad-item.json",
"expect": {
"equals": {
"created": 2,
"rejected": 1,
"failed": 0
},
"contains": {
"results": [
"text is required"
]
}
}
},
{
"name": "목록이 아니면 400",
"request": "requests/not-a-list.json",
"expect": {
"status": 400
}
},
{
"name": "가끔 실패하는 API · 다시 해 보기로 성공",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"created": 2,
"failed": 0
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "flaky"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
}
]
}
+153
View File
@@ -0,0 +1,153 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "API가 멈춤 → DLQ",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2,
"dlq_saved": true,
"alert": "sent"
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "처리한 실패도 알림 (high · 개수)",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "high",
"reason": "dlq",
"count": 2,
"workflow": "intake"
}
}
},
{
"name": "실패가 없으면 알림 없음",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"failed": 0,
"alert": "none"
}
}
},
{
"name": "알림은 그대로 1개",
"url": "http://localhost:8800/alerts/list",
"body": {},
"expect": {
"equals": {
"count": 1
}
}
},
{
"name": "DLQ도 멈추면 critical",
"request": "requests/batch-bad-item.json",
"expect": {
"equals": {
"failed": 2,
"dlq_saved": false
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error",
"dlq": "error"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "잃어버린 id를 알림에",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "critical",
"reason": "dlq_down",
"count": 2
},
"contains": {
"message": [
"R-201"
]
}
}
}
]
}
+132
View File
@@ -0,0 +1,132 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "첫 실패 → 알림 보냄",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2,
"alert": "sent"
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "10분 안에 또 실패 → 보내지 않음",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"failed": 3,
"alert": "suppressed"
}
}
},
{
"name": "dlq 알림은 1개",
"url": "http://localhost:8800/alerts/list",
"body": {
"reason": "dlq"
},
"expect": {
"equals": {
"count": 1
}
}
},
{
"name": "그래도 DLQ에는 5건 모두",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 5
}
}
},
{
"name": "DLQ가 멈춘 것은 늘 보냄 (critical)",
"request": "requests/batch-bad-item.json",
"expect": {
"equals": {
"dlq_saved": false,
"alert": "sent"
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error",
"dlq": "error"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "고친 뒤 · 실패 없음 · 알림 없음",
"request": "requests/batch-dup-id.json",
"expect": {
"equals": {
"failed": 0,
"alert": "none"
}
}
}
]
}
+132
View File
@@ -0,0 +1,132 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "1 · 잘못된 항목 → 결과에만 (rejected)",
"request": "requests/batch-bad-item.json",
"expect": {
"equals": {
"rejected": 1,
"created": 2
}
}
},
{
"name": "2 · API 오류 → failed",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "3 · failed는 DLQ에",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 2
}
}
},
{
"name": "4 · 버그 → 500",
"webhook": "nightly-report",
"body": {},
"expect": {
"status": 500
}
},
{
"name": "5 · Error Workflow → critical 알림",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "critical",
"reason": "unexpected"
}
},
"before": [
{
"sleep": 3
}
]
},
{
"name": "6 · DLQ마저 멈추면 결과가 알려야",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"failed": 3,
"dlq_saved": false
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error",
"dlq": "error"
}
}
]
},
{
"name": "7 · DLQ가 멈춘 것을 누가 아나 (critical · dlq_down)",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "critical",
"reason": "dlq_down"
}
}
}
]
}
+118
View File
@@ -0,0 +1,118 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "예제 1 · API가 멈추면 실패로 표시 · 200",
"request": "requests/batch-two.json",
"expect": {
"status": 200,
"equals": {
"created": 0,
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "예제 1 · 실패한 2건은 DLQ에",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 2
},
"contains": {
"items": [
"R-301",
"R-302"
]
}
}
},
{
"name": "예제 2 · 예상 못 한 오류 (nightly-report)",
"webhook": "nightly-report",
"body": {},
"expect": {
"status": 500
}
},
{
"name": "예제 2 · Error Workflow가 알림을 남김",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "critical",
"reason": "unexpected",
"workflow": "76 Nightly report (provided, has a bug)"
},
"contains": {
"node": [
"Count by category"
]
}
},
"before": [
{
"sleep": 3
}
]
}
]
}
+137
View File
@@ -0,0 +1,137 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "API가 오래 멈춤 · 처음 실패",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "재처리 1 · 또 실패",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 2,
"still_failed": 2,
"parked": 0
}
}
},
{
"name": "재처리 2 · 또 실패",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 2,
"still_failed": 2,
"parked": 0
}
}
},
{
"name": "재처리 3 · 세 번 실패한 것은 멈춤 (parked)",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 0,
"parked": 2
}
}
},
{
"name": "parked로 남음",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 2,
"parked": 2
}
}
},
{
"name": "멈춘 것은 알림",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"reason": "parked",
"severity": "high"
}
}
},
{
"name": "고친 뒤에도 parked는 자동으로 돌리지 않음",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 0
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
}
]
}
+146
View File
@@ -0,0 +1,146 @@
{
"webhook": "my-ops-status",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "1 · 아무 일 없음 → ok",
"body": {},
"expect": {
"equals": {
"status": "ok",
"dlq": 0
}
}
},
{
"name": "2 · (접수 실패 2건)",
"webhook": "my-intake",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "3 · DLQ가 있으면 warn",
"body": {},
"expect": {
"equals": {
"status": "warn",
"dlq": 2
},
"contains": {
"reasons": [
"재처리"
]
}
}
},
{
"name": "4 · (보고서 버그)",
"webhook": "nightly-report",
"body": {},
"expect": {
"status": 500
}
},
{
"name": "5 · critical 알림이 있으면 critical",
"body": {},
"expect": {
"equals": {
"status": "critical",
"alerts.critical": 1
}
},
"before": [
{
"sleep": 3
}
]
},
{
"name": "6 · (재처리 · 알림 확인 뒤 비움)",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"ok": 2
}
},
"after": [
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
}
]
},
{
"name": "7 · 고친 뒤 → ok",
"body": {},
"expect": {
"equals": {
"status": "ok",
"dlq": 0,
"created": 2
}
}
}
]
}
+133
View File
@@ -0,0 +1,133 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "1 · 평소",
"request": "requests/batch-ok.json",
"expect": {
"equals": {
"created": 3
}
}
},
{
"name": "2 · 장애 시작 · API 오류",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2,
"created": 0
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "3 · DLQ 확인",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 2
}
}
},
{
"name": "4 · 보고서 작업도 실패",
"webhook": "nightly-report",
"body": {},
"expect": {
"status": 500
}
},
{
"name": "5 · 알림 확인",
"url": "http://localhost:8800/alerts/latest",
"body": {},
"expect": {
"equals": {
"severity": "critical"
}
},
"before": [
{
"sleep": 3
}
]
},
{
"name": "6 · 고친 뒤 재처리",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"ok": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "7 · 결과 확인 · 중복 없이 5건",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 5
}
}
}
]
}
+125
View File
@@ -0,0 +1,125 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "1 · API가 느림 → 기다리다 실패",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "slow"
}
}
]
},
{
"name": "2 · DLQ에 2건",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 2
}
}
},
{
"name": "3 · 그런데 접수 건은 이미 2개",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 2
}
},
"before": [
{
"sleep": 8
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "4 · 재처리 · 이미 있는 건이라 duplicate",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 2,
"ok": 2,
"duplicates": 2
}
}
},
{
"name": "5 · 그래도 2개 (중복 없음)",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 2
}
}
},
{
"name": "6 · DLQ가 비었음",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 0
}
}
}
]
}
+112
View File
@@ -0,0 +1,112 @@
{
"webhook": "my-intake",
"before": [
{
"url": "http://localhost:8800/tickets-reset",
"body": {}
},
{
"url": "http://localhost:8800/dlq-clear",
"body": {}
},
{
"url": "http://localhost:8800/alerts-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
],
"cases": [
{
"name": "API가 멈춘 동안 2건 → DLQ",
"request": "requests/batch-two.json",
"expect": {
"equals": {
"failed": 2
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"tickets": "error"
}
}
]
},
{
"name": "고친 뒤 다시 돌리기",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 2,
"ok": 2,
"still_failed": 0
}
},
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok"
}
}
]
},
{
"name": "DLQ가 비었음",
"url": "http://localhost:8800/dlq/list",
"body": {},
"expect": {
"equals": {
"size": 0
}
}
},
{
"name": "접수 건은 2개 (중복 없음)",
"url": "http://localhost:8800/tickets-created/list",
"body": {},
"expect": {
"equals": {
"count": 2
}
}
},
{
"name": "한 번 더 돌려도 할 일 없음",
"webhook": "my-replay",
"body": {},
"expect": {
"equals": {
"replayed": 0
}
}
}
]
}