"""榜单登记和旧登记项消费的地址边界;合成读取器,不发网络。""" from types import SimpleNamespace import pytest from fastapi import HTTPException from muse.接入.http.路由.资料研究 import 采集快照 from muse.资料研究 import 榜单快照 from muse.资料研究.接口 import 资料服务 from muse.资料研究.模型 import 资料错误 @pytest.mark.case_id("NC-O07-B03-001") @pytest.mark.parametrize( "url", [ "file:///etc/passwd", "ftp://example.invalid", "https:///ranking", "example.invalid", "https://user:secret@example.invalid/rank", "https://@example.invalid", "https://example.invalid@", "https://exam ple.invalid", "https://example.invalid\n/rank", "https://example.invalid\\rank", "https://example.invalid:abc", "https://example.invalid:65536", "https://example.invalid:0", "https://[bad-address]", "https://example.invalid/#section", "https://-bad.invalid", "https://bad..invalid", "https://%65xample.invalid", "https://exam\x00ple.invalid", ], ) def test_非法榜单地址在调用存储前拒绝(url, monkeypatch): writes = [] monkeypatch.setattr( 榜单快照, "资料存储", lambda conn: SimpleNamespace(登记榜单源=lambda *args: writes.append(args)), ) with pytest.raises(资料错误, match="榜单地址"): 资料服务().登记榜单(None, "ranking", "合成榜单", url) assert writes == [] @pytest.mark.case_id("NC-O07-B03-002") @pytest.mark.parametrize( "url", [ "https://example.invalid/ranking?kind=new", "http://localhost:8080/rank", "https://[::1]:8443/rank", "https://例子.测试/榜单", "https://example.invalid./rank", ], ) def test_合法URL原样登记不请求目标(url, monkeypatch): writes = [] monkeypatch.setattr( 榜单快照, "资料存储", lambda conn: SimpleNamespace(登记榜单源=lambda *args: writes.append(args)), ) 资料服务().登记榜单(None, "ranking", "合成榜单", url) assert writes == [("ranking", "合成榜单", url, "html")] @pytest.mark.case_id("NC-O07-B03-003") def test_旧非法登记不能绕过读取器调用前验证(): calls = [] cursor = SimpleNamespace( execute=lambda *args: SimpleNamespace( fetchone=lambda: {"url": "file:///private", "采集方式": "html"} ) ) conn = SimpleNamespace(cursor=lambda **kwargs: cursor) reader = SimpleNamespace(抓取=lambda *args: calls.append(args)) with pytest.raises(资料错误, match="榜单地址"): 资料服务().采集榜单快照(conn, "ranking", reader) assert calls == [] @pytest.mark.case_id("NC-O07-B03-004") def test_未注入真实读取器仍返回503且不建联(): def unexpected(): raise AssertionError("未注入读取器时不能请求数据库") app = SimpleNamespace(配置=SimpleNamespace(), 要求数据库=unexpected) request = SimpleNamespace(app=SimpleNamespace(state=SimpleNamespace(装配=app))) with pytest.raises(HTTPException) as error: 采集快照("ranking", request, "author") assert error.value.status_code == 503