helpers.py 1.7 KB

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