"""client_ip 回环地址替换测试(同机 localhost 访问记本机网卡 IPv4)。""" from __future__ import annotations import ipaddress import pytest from dms.services import audit_service from dms.services.audit_service import _is_loopback, client_ip LAN_IP = "192.168.1.5" @pytest.fixture(autouse=True) def stub_primary_address(monkeypatch): """默认钉住本机网卡解析结果,仅真实解析用例放行。""" monkeypatch.setattr(audit_service, "_primary_local_address", lambda: LAN_IP) monkeypatch.setattr(audit_service, "_primary_address_cache", None) def request_client_ip(flask_app, remote_addr=None, headers=None): with flask_app.test_request_context( "/", environ_base={"REMOTE_ADDR": remote_addr} if remote_addr else {}, headers=headers or {}, ): return client_ip() def test_loopback_ipv6_replaced_with_lan_ip(flask_app): assert request_client_ip(flask_app, "::1") == LAN_IP assert request_client_ip(flask_app, "0:0:0:0:0:0:0:1") == LAN_IP def test_loopback_ipv4_replaced_with_lan_ip(flask_app): assert request_client_ip(flask_app, "127.0.0.1") == LAN_IP def test_xff_takes_precedence_and_passes_through(flask_app): assert request_client_ip( flask_app, "::1", headers={"X-Forwarded-For": "192.0.2.10, 10.0.0.1"} ) == "192.0.2.10" def test_non_loopback_remote_addr_passes_through(flask_app): assert request_client_ip(flask_app, "192.168.1.20") == "192.168.1.20" def test_is_loopback_variants(): assert _is_loopback("::1") assert _is_loopback("0:0:0:0:0:0:0:1") assert _is_loopback("127.0.0.1") assert _is_loopback("127.0.1.9") assert _is_loopback("::ffff:127.0.0.1") assert _is_loopback("fe80::1%eth0") is False assert not _is_loopback("192.168.1.5") assert not _is_loopback("not-an-ip") def test_primary_local_address_real_resolution(flask_app, monkeypatch): """真实选路:返回有效 IPv4 且非 ::1 形态(无网卡环境回退 127.0.0.1)。""" monkeypatch.undo() monkeypatch.setattr(audit_service, "_primary_address_cache", None) resolved = audit_service._primary_local_address() assert ipaddress.ip_address(resolved).version == 4