| 12345678910111213141516171819202122232425262728 |
- """集成用例构造真实图片字节与明确填报,测试数据不属于企业政策。"""
- from io import BytesIO
- from datetime import date
- import json
- from PIL import Image
- BASE = '/api/v1'
- def image_bytes(color='green'):
- output = BytesIO()
- Image.new('RGB', (32, 24), color).save(output, format='PNG')
- return output.getvalue()
- def fields(**changes):
- data = {'invoice_no': 'TEST-001', 'invoice_date': date.today().isoformat(), 'amount': '100.00', 'tax_amount': '6.00',
- 'tax_rate': '0.06', 'buyer_name': '测试企业', 'seller_name': '测试销售方', 'tax_number': '123456789012345678', 'invoice_type': '测试普通发票'}
- return {**data, **changes}
- def reimbursement(client, headers, color='green', declared=None, owner='alice', total='106.00'):
- row = client.post(BASE + '/reimbursements', headers=headers[owner], json={'title': '集成测试报销', 'total_amount': total, 'type': 1}).json()['data']
- response = client.post(f"{BASE}/reimbursements/{row['id']}/invoices", headers=headers[owner],
- data={'revision': row['revision'], 'metadata': json.dumps([fields() if declared is None else declared])}, files=[('files', ('test.png', image_bytes(color), 'image/png'))])
- assert response.status_code == 200 and 'event: completed' in response.text, response.text
- return client.get(f"{BASE}/reimbursements/{row['id']}", headers=headers[owner]).json()['data']
- def submit(client, headers, row, owner='alice', key='test-submit-key'):
- response = client.post(f"{BASE}/reimbursements/{row['id']}/submit", headers={**headers[owner], 'Idempotency-Key': key}, json={'revision': row['revision']})
- assert response.status_code == 202, response.text
- return response.json()['data']['audit_id']
|