| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- from pathlib import Path
- import json
- import urllib.request
- import urllib.error
- import urllib.parse
- from datetime import datetime, timezone
- root = Path(__file__).parent
- base = 'http://192.168.110.96:8301/api/cockpit/v1/'
- keys = ['ALARM','WARNING','WORK_ORDER','NORMAL','OFFLINE','EMPTY','UNKNOWN','UNASSOCIATED']
- rows = []
- checks = []
- def get(endpoint, params):
- url = base + endpoint + '?' + urllib.parse.urlencode(params, doseq=True)
- try:
- with urllib.request.urlopen(url, timeout=15) as response:
- status, raw = response.status, response.read()
- except urllib.error.HTTPError as error:
- status, raw = error.code, error.read()
- envelope = json.loads(raw)
- data = envelope.get('data') or {}
- row = {'endpoint':endpoint,'params':params,'http':status,'business':envelope.get('code'),
- 'category':data.get('category'),'total':data.get('total', (data.get('pagination') or {}).get('total')),
- 'mapFilter':data.get('mapFilter'),'distribution':data.get('pointStatusDistribution'),
- 'snapshotAt':data.get('snapshotAt'),'monitoringPoints':data.get('monitoringPoints'),
- 'unassociatedEquipment':data.get('unassociatedEquipment')}
- rows.append(row)
- return row
- def check(name, passed):
- checks.append({'name':name,'passed':bool(passed)})
- baselines = {}
- for endpoint in ['map-snapshot','monitoring/distribution']:
- first = get(endpoint, [('pageSize',2)])
- baselines[endpoint] = first
- dist = first['distribution'] or []
- check(endpoint+'-eight-buckets', [r['status'] for r in dist] == keys and all(isinstance(r['count'],int) and r['count'] >= 0 for r in dist))
- check(endpoint+'-total-partition', sum(r['count'] for r in dist)==first['total'])
- for raw in ['ALARM,WARNING','UNKNOWN','UNASSOCIATED','UNASSOCIATED,ALARM','EMPTY','NORMAL']:
- selected = get(endpoint, [('pageSize',2),('pointStatus',raw)])
- check(endpoint+'-'+raw+'-accepted', selected['http']==200 and selected['business']==200)
- check(endpoint+'-'+raw+'-global-unchanged', selected['distribution']==dist)
- if 'UNASSOCIATED' in raw:
- check(endpoint+'-'+raw+'-only-devices', not selected['monitoringPoints'])
- csv = get(endpoint,[('pointStatus','WARNING,ALARM')])
- repeat = get(endpoint,[('pointStatus','ALARM'),('pointStatus','WARNING')])
- check(endpoint+'-repeat-csv-equivalent', csv['mapFilter']==repeat['mapFilter'] and csv['total']==repeat['total'])
- check(endpoint+'-effective-status-filter', csv['total'] < first['total'])
- for raw in ['BOGUS','ALARM,BOGUS']:
- rejected = get(endpoint,[('pointStatus',raw)])
- check(endpoint+'-'+raw+'-invalid-400', rejected['http']==400 and rejected['category']=='INVALID_REQUEST')
- scoped = get(endpoint,[('district','0'),('pointStatus','UNASSOCIATED')])
- check(endpoint+'-district-global-unchanged', scoped['distribution']==dist)
- first = baselines['map-snapshot']
- second = get('map-snapshot',[('page',2),('pageSize',2),('snapshotAt',first['snapshotAt'])])
- check('map-page2-token-retained', second['http']==200 and second['snapshotAt']==first['snapshotAt'] and second['distribution']==first['distribution'])
- check('cross-endpoint-global-identical', baselines['map-snapshot']['distribution']==baselines['monitoring/distribution']['distribution'])
- check('cross-endpoint-mapFilter-identical', get('map-snapshot',[('pointStatus','UNASSOCIATED,ALARM')])['mapFilter']==get('monitoring/distribution',[('pointStatus','UNASSOCIATED,ALARM')])['mapFilter'])
- result={'checkedAt':datetime.now(timezone.utc).isoformat(),'baseUrl':base,'checks':checks,'requests':rows}
- (root/'real-probe-new-runtime.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8')
- for item in checks:
- print(('PASS ' if item['passed'] else 'FAIL ')+item['name'])
- print(f'{sum(c["passed"] for c in checks)}/{len(checks)} passed')
- raise SystemExit(0 if all(c['passed'] for c in checks) else 1)
|