Skip to content

Commit 97388f4

Browse files
Create test_webhooks_v1.py
1 parent a2f147e commit 97388f4

1 file changed

Lines changed: 80 additions & 0 deletions

File tree

tests/test_webhooks_v1.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import json
2+
3+
4+
def _wallet_stub(chain, address):
5+
return {
6+
'chain': chain,
7+
'address_type': 'personal_wallet',
8+
'rpc_used': False,
9+
'details': 'stubbed for webhook tests',
10+
}
11+
12+
13+
class _FakeResponse:
14+
def __init__(self, status_code=200, payload=None, text=''):
15+
self.status_code = status_code
16+
self._payload = payload
17+
self.text = text if text else (json.dumps(payload) if payload is not None else '')
18+
19+
def json(self):
20+
if self._payload is None:
21+
raise ValueError('no json payload')
22+
return self._payload
23+
24+
25+
def test_successful_webhook_delivery_marks_acknowledged(client, api_headers, app_module, monkeypatch):
26+
monkeypatch.setattr(app_module, 'classify_address', _wallet_stub)
27+
28+
api_key_record = app_module.API_KEYS['pp_test_suite_key']
29+
api_key_record['webhook_active'] = True
30+
api_key_record['webhook_url'] = 'https://receiver.example.test/hook'
31+
api_key_record['webhook_secret'] = 'receiver-secret'
32+
api_key_record['webhook_events'] = ['preflight_run']
33+
34+
captured = {}
35+
36+
def _fake_post(url, data=None, headers=None, timeout=None):
37+
captured['url'] = url
38+
captured['data'] = data.decode('utf-8') if isinstance(data, (bytes, bytearray)) else data
39+
captured['headers'] = headers or {}
40+
captured['timeout'] = timeout
41+
return _FakeResponse(status_code=200, payload={'ok': True})
42+
43+
monkeypatch.setattr(app_module.requests, 'post', _fake_post)
44+
45+
payload = {
46+
'expected': {
47+
'network': 'ethereum',
48+
'asset': 'USDT',
49+
'address': '0x1111111111111111111111111111111111111111',
50+
},
51+
'provided': {
52+
'network': 'ethereum',
53+
'asset': 'USDT',
54+
'address': '0x1111111111111111111111111111111111111111',
55+
},
56+
}
57+
58+
response = client.post('/api/preflight-check', json=payload, headers=api_headers)
59+
body = response.get_json()
60+
record_id = body['record_id']
61+
62+
details_response = client.get(f'/api/verification-records/{record_id}', headers=api_headers)
63+
details_body = details_response.get_json()
64+
deliveries = details_body['record']['webhook_deliveries']
65+
66+
assert response.status_code == 200
67+
assert details_response.status_code == 200
68+
assert captured['url'] == 'https://receiver.example.test/hook'
69+
assert captured['headers']['X-PayeeProof-Event'] == 'preflight_run'
70+
assert deliveries[0]['delivery_status'] == 'delivered'
71+
assert deliveries[0]['ack_status'] == 'acknowledged'
72+
assert deliveries[0]['acknowledged_at']
73+
74+
usage_response = client.get('/api/usage-summary?period=this_month', headers=api_headers)
75+
usage_body = usage_response.get_json()
76+
assert usage_response.status_code == 200
77+
assert usage_body['totals']['webhook_deliveries'] == 1
78+
assert usage_body['totals']['webhook_delivered'] == 1
79+
assert usage_body['totals']['webhook_acknowledged'] == 1
80+
assert usage_body['totals']['webhook_pending'] == 0

0 commit comments

Comments
 (0)