76일차 자료 추가 (답 포함): 실습 15개 · 의도 · 생활 속 예 · 실행 결과, LAB-A · 정답 워크플로우와 25단계 실행 기록, 교안 개요 30장 · 4단계 정리, 바이브 코딩 tretry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3f36605043
commit
bbf17e4696
141 files changed
+34072
No files matched your search
@@ -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": [
|
||||
"미분류"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user