You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.7 KiB
44 lines
1.7 KiB
|
6 days ago
|
# -*- coding: utf-8 -*-
|
||
|
|
# 票 04 / t12 验收:knife4j/swagger 抽查 —— OpenAPI tags = 深路径 tag 原文
|
||
|
|
import json, sys, io, urllib.request
|
||
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||
|
|
|
||
|
|
URL = 'http://localhost:8080/v3/api-docs'
|
||
|
|
try:
|
||
|
|
with urllib.request.urlopen(URL, timeout=15) as r:
|
||
|
|
spec = json.loads(r.read().decode('utf-8'))
|
||
|
|
except Exception as e:
|
||
|
|
print('FETCH FAILED:', e)
|
||
|
|
raise SystemExit(1)
|
||
|
|
|
||
|
|
tags = sorted(t.get('name', '') for t in spec.get('tags', []))
|
||
|
|
print(f'openapi={spec.get("openapi")} tags={len(tags)}')
|
||
|
|
for t in tags:
|
||
|
|
print(' TAG:', t)
|
||
|
|
|
||
|
|
# 抽查:(路径, method, 期望 tag)
|
||
|
|
CHECKS = [
|
||
|
|
('/api/auth/login/dingtalk', 'post', 'A0 登录界面'),
|
||
|
|
('/api/opportunity/customer/list', 'get', 'A3 商机管理/商机详情/客户'),
|
||
|
|
('/api/roles/page', 'post', 'A7 后台管理/权限管理/角色管理'),
|
||
|
|
('/api/file/upload', 'post', '公共依赖/文件'),
|
||
|
|
]
|
||
|
|
ok = True
|
||
|
|
paths = spec.get('paths', {})
|
||
|
|
for p, m, expect in CHECKS:
|
||
|
|
node = paths.get(p, {}).get(m)
|
||
|
|
got = (node or {}).get('tags', [])
|
||
|
|
hit = expect in got
|
||
|
|
ok = ok and hit
|
||
|
|
print(f'{"OK " if hit else "DIFF"} {m.upper()} {p} -> {got} (期望 {expect})')
|
||
|
|
# 双归属抽查:LeadPool 5 端点应同时挂两个 tag
|
||
|
|
pool = [p for p in paths if p.startswith('/api/rule/pool/')]
|
||
|
|
for p in sorted(pool):
|
||
|
|
for m, node in paths[p].items():
|
||
|
|
if m in ('get', 'post', 'put', 'delete', 'patch'):
|
||
|
|
got = node.get('tags', [])
|
||
|
|
hit = ('A2 线索管理/线索设置' in got) and ('A7 后台管理/线索规则' in got)
|
||
|
|
ok = ok and hit
|
||
|
|
print(f'{"OK " if hit else "DIFF"} {m.upper()} {p} -> {got}')
|
||
|
|
print('RESULT:', 'ALL MATCH' if ok else 'HAS DIFF')
|