gaoluyang
20 小时以前 e40a608ef9bf51db294d8eefada6a8e2e80cebca
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import sys,json
from pathlib import Path
from collections import defaultdict,Counter
from datetime import datetime,time
from read_sources import P,connect,encode
from plan_logs import working,IP,CONFIG
result=json.loads((P/'result.json').read_text(encoding='utf8'))
plan=json.loads((P/'plan.json').read_text(encoding='utf8'))
before=json.loads(Path(result['backup']).read_text(encoding='utf8'))
inserted=json.loads((P/'inserted.json').read_text(encoding='utf8'))
c=connect(sys.stdin.readline().strip())
try:
 with c.cursor() as q:
  q.execute("SET time_zone='+08:00'")
  q.execute('SELECT NOW() now');now=q.fetchone()['now']
  q.execute('SELECT * FROM system_operate_log ORDER BY id');logs={r['id']:r for r in q.fetchall()}
  assert all(encode(logs[r['id']])==encode(r) for r in before),'Preexisting log changed'
  if (P/'display-result.json').exists():
   from refine_display import BANNED
   display_result=json.loads((P/'display-result.json').read_text(encoding='utf8'))
   display_before=json.loads(Path(display_result['backup']).read_text(encoding='utf8'))
   display_changes={r['id']:r for r in json.loads((P/'display-changes.json').read_text(encoding='utf8'))}
   for old in display_before:
    expected_row=dict(old)
    if old['id'] in display_changes:
     change=display_changes[old['id']]
     expected_row.update(sub_type=change['sub_type'],action=change['action'])
     assert not any(x in change['sub_type']+change['action'] for x in BANNED)
    assert encode(logs[old['id']])==encode(expected_row),'Unexpected change after display refinement'
  q.execute('SELECT id FROM system_users WHERE deleted=0 AND status=0');users={x['id'] for x in q.fetchall()}
  q.execute("SELECT u.id,r.name FROM system_users u JOIN system_user_role ur ON ur.user_id=u.id JOIN system_role r ON r.id=ur.role_id WHERE u.deleted=0 AND u.status=0 AND ur.deleted=0 AND r.deleted=0 AND r.status=0 AND r.name IN ('生产管理员','质量')")
  roles=defaultdict(set)
  for r in q.fetchall():roles[r['name']].add(r['id'])
  expected={r['trace_id']:r for r in plan['records']}
  traces=[]
  for item in inserted:
   r=logs[item['id']];p=expected[r['trace_id']];extra=json.loads(r['extra'])
   assert working(r['create_time'].date()) and time(9)<=r['create_time'].time()<time(18) and r['create_time']<=now
   assert r['user_ip']==IP and r['user_id']==p['user_id'] and r['user_id'] in users
   assert str(r['create_time'])==p['create_time']
   assert extra['reconstructed'] and extra['ip_source']=='user_specified' and not extra['request_evidence_available']
   assert r['request_url'] is None and r['request_method'] is None and r['user_agent'] is None
   actor=CONFIG[p['_table']][1]
   if actor=='production_admin':assert r['user_id'] in roles['生产管理员']
   if actor=='inspector_user_id':assert r['user_id'] in roles['质量']
   traces.append(r['trace_id'])
  assert len(set(traces))==len(inserted)==result['inserted']
  groups=defaultdict(list)
  for r in plan['records']:groups[r['_table']].append(r)
  for table,records in groups.items():
   ids=[r['biz_id'] for r in records]
   q.execute('SELECT * FROM `'+table+'` WHERE id IN ('+','.join(['%s']*len(ids))+')',ids)
   current={r['id']:r for r in q.fetchall()}
   assert all(encode(current[r['biz_id']])==encode(r['_source']) for r in records),'Source business changed: '+table
  verified={'passed':True,'verified_at':str(now),'inserted_logs':len(inserted),'original_logs_unchanged':len(before),
   'business_rows_unchanged':len(plan['records']),'no_weekend_or_holiday_or_future_times':True,
   'all_ip':IP,'actors_match_business_fields_or_requested_role':True,'source_provenance_retained':True}
  (P/'verification.json').write_text(encode(verified),encoding='utf8');print(encode(verified))
finally:c.close()