| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- import pytest
- import requests
- def test_client_uses_service_account_and_exact_template(monkeypatch):
- from app.services import wechat_oa_client as svc
- monkeypatch.setattr(svc.settings, 'WECHAT_OA_APPID', 'service-app')
- monkeypatch.setattr(svc.settings, 'WECHAT_OA_SECRET', 'test-secret')
- monkeypatch.setattr(svc.settings, 'WECHAT_OA_MINI_APPID', 'mini-app')
- calls = []
- class Response:
- def __init__(self, data): self.data = data
- def raise_for_status(self): pass
- def json(self): return self.data
- def request(method, url, **kwargs):
- calls.append((method, url, kwargs))
- return Response({'access_token': 'test-token', 'expires_in': 7200} if url.endswith('stable_token') else {'errcode': 0, 'msgid': 123})
- monkeypatch.setattr(svc.requests, 'request', request)
- client = svc.WechatOAClient()
- for _ in range(2):
- assert client.send(openid='service-openid', template_id='template', data={'const5': {'value': '通过'}}, event_key='key', page='pages/example') == '123'
- assert len(calls) == 3
- assert calls[0][2]['json']['appid'] == 'service-app'
- assert calls[1][2]['json']['touser'] == 'service-openid'
- assert calls[1][2]['json']['miniprogram']['appid'] == 'mini-app'
- def test_transport_timeout_does_not_expose_url_or_secret(monkeypatch):
- from app.services import wechat_oa_client as svc
- client = svc.WechatOAClient()
- monkeypatch.setattr(client, 'access_token', lambda *args: 'sensitive-token')
- def fail(*args, **kwargs):
- raise requests.Timeout('https://api.weixin.qq.com/?secret=TOP_SECRET')
- monkeypatch.setattr(svc.requests, 'request', fail)
- with pytest.raises(svc.WechatDeliveryUnknown) as exc:
- client.send(openid='oid', template_id='template', data={}, event_key='key')
- assert 'TOP_SECRET' not in str(exc.value)
- def test_notice_audit_masks_oauth_state_code_and_binding_fields():
- from app.core.api_request_log_middleware import _redact_notice_query, _redact_obj
- query = _redact_notice_query('/api/public/wechat-notices/oauth/callback', 'code=secret-code&state=secret-state')
- assert 'secret-code' not in query and 'secret-state' not in query
- data = _redact_obj({'sessionId': 'private', 'authorizeUrl': 'private', 'openid': 'private'})
- assert set(data.values()) == {'***'}
|