43 lines
1.8 KiB
Python
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()
|