test_wechat_oa_client.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import pytest
  2. import requests
  3. def test_client_uses_service_account_and_exact_template(monkeypatch):
  4. from app.services import wechat_oa_client as svc
  5. monkeypatch.setattr(svc.settings, 'WECHAT_OA_APPID', 'service-app')
  6. monkeypatch.setattr(svc.settings, 'WECHAT_OA_SECRET', 'test-secret')
  7. monkeypatch.setattr(svc.settings, 'WECHAT_OA_MINI_APPID', 'mini-app')
  8. calls = []
  9. class Response:
  10. def __init__(self, data): self.data = data
  11. def raise_for_status(self): pass
  12. def json(self): return self.data
  13. def request(method, url, **kwargs):
  14. calls.append((method, url, kwargs))
  15. return Response({'access_token': 'test-token', 'expires_in': 7200} if url.endswith('stable_token') else {'errcode': 0, 'msgid': 123})
  16. monkeypatch.setattr(svc.requests, 'request', request)
  17. client = svc.WechatOAClient()
  18. for _ in range(2):
  19. assert client.send(openid='service-openid', template_id='template', data={'const5': {'value': '通过'}}, event_key='key', page='pages/example') == '123'
  20. assert len(calls) == 3
  21. assert calls[0][2]['json']['appid'] == 'service-app'
  22. assert calls[1][2]['json']['touser'] == 'service-openid'
  23. assert calls[1][2]['json']['miniprogram']['appid'] == 'mini-app'
  24. def test_transport_timeout_does_not_expose_url_or_secret(monkeypatch):
  25. from app.services import wechat_oa_client as svc
  26. client = svc.WechatOAClient()
  27. monkeypatch.setattr(client, 'access_token', lambda *args: 'sensitive-token')
  28. def fail(*args, **kwargs):
  29. raise requests.Timeout('https://api.weixin.qq.com/?secret=TOP_SECRET')
  30. monkeypatch.setattr(svc.requests, 'request', fail)
  31. with pytest.raises(svc.WechatDeliveryUnknown) as exc:
  32. client.send(openid='oid', template_id='template', data={}, event_key='key')
  33. assert 'TOP_SECRET' not in str(exc.value)
  34. def test_notice_audit_masks_oauth_state_code_and_binding_fields():
  35. from app.core.api_request_log_middleware import _redact_notice_query, _redact_obj
  36. query = _redact_notice_query('/api/public/wechat-notices/oauth/callback', 'code=secret-code&state=secret-state')
  37. assert 'secret-code' not in query and 'secret-state' not in query
  38. data = _redact_obj({'sessionId': 'private', 'authorizeUrl': 'private', 'openid': 'private'})
  39. assert set(data.values()) == {'***'}