"""通过真实菜单接口检查商务图标映射,不进行页面交互。""" 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()