Files
kra-new/scripts/sw_menu_icons_http_smoke.py
T

43 lines
1.8 KiB
Python

"""通过真实菜单接口检查商务图标映射,不进行页面交互。"""
import argparse
import json
import re
import urllib.request
from pathlib import Path
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--base-url', default='http://127.0.0.1:18000')
parser.add_argument('--token-file', required=True, type=Path)
parser.add_argument('--output', required=True, type=Path)
args = parser.parse_args()
token = args.token_file.read_text(encoding='utf-8').strip()
icons = dict(re.findall(r'"(sw_[^"]+)":\s*"([^"]+)"', Path('internal/data/business/menu_icons.go').read_text(encoding='utf-8')))
req = urllib.request.Request(args.base_url + '/menu/getMenu', data=b'{}', headers={'x-token': token, 'Content-Type': 'application/json'})
with urllib.request.urlopen(req, timeout=30) as response:
data = json.load(response)
assert data['code'] == 0, data.get('msg')
rows = []
def walk(value):
if isinstance(value, dict):
name = value.get('name')
if name in icons and 'component' in value:
actual = value.get('meta', {}).get('icon')
rows.append({'name': name, 'icon': actual, 'expected': icons[name], 'passed': actual == icons[name]})
for item in value.values():
walk(item)
elif isinstance(value, list):
for item in value:
walk(item)
walk(data)
report = {'baseURL': args.base_url, 'menuCount': len(rows), 'checks': rows, 'passed': len(rows) == len(icons) and all(row['passed'] for row in rows)}
args.output.write_text(json.dumps(report, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
print(json.dumps(report, ensure_ascii=False))
if not report['passed']:
raise SystemExit(1)
if __name__ == '__main__':
main()