# -*- coding: utf-8 -*- """兼容垫片与同步桥测试。""" import asyncio import pytest from aiohttp import web from core import aiohttp_compat as req from core import async_bridge @pytest.fixture() async def server(): app = web.Application() async def ok(request): return web.json_response({'code': 200, 'data': 'hi'}) async def notfound(request): return web.json_response({'code': 404}, status=404) async def echo_post(request): body = await request.text() return web.json_response({'got': body, 'ua': request.headers.get('User-Agent')}) app.router.add_get('/ok', ok) app.router.add_get('/nf', notfound) app.router.add_post('/echo', echo_post) runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, '127.0.0.1', 0) await site.start() port = runner.addresses[0][1] try: yield f'http://127.0.0.1:{port}' finally: await runner.cleanup() async def test_get_json(server): r = await req.get(server + '/ok') assert r.status_code == 200 assert r.json() == {'code': 200, 'data': 'hi'} assert 'code' in r.text r.raise_for_status() # 200 不抛 async def test_4xx_does_not_raise_until_raise_for_status(server): r = await req.get(server + '/nf') assert r.status_code == 404 # 请求本身不抛(同 requests) assert r.json() == {'code': 404} with pytest.raises(req.HTTPError): r.raise_for_status() async def test_post_headers_forwarded(server): r = await req.post(server + '/echo', data={'params': 'x'}, headers={'User-Agent': 'ua-test'}) body = r.json() assert body['ua'] == 'ua-test' assert 'params' in body['got'] async def test_network_error_raises_request_exception(): with pytest.raises(req.RequestException): await req.get('http://127.0.0.1:1/nope', timeout=1) def test_bridge_runs_coro_from_sync(): async def coro(): await asyncio.sleep(0.01) return 42 assert async_bridge.run_sync(coro()) == 42 async def test_bridge_rejects_inside_loop(): async def coro(): return 1 c = coro() try: with pytest.raises(RuntimeError): async_bridge.run_sync(c) finally: c.close() # run_sync 拒绝执行,需自行关闭以免「未 await」告警