"""DECODO 프록시 제공자 테스트 (포트 기반 sticky, 순수·네트워크 불필요).""" from config.config_models import DecodoConfig from services.search.proxy import DecodoProxy def _p(**kw): base = dict(host="gate.decodo.com", username="user1", password="pw", port_start=10001, port_end=10010, session_minutes=10) base.update(kw) return DecodoProxy(DecodoConfig(**base)) def test_disabled_when_credentials_missing(): assert DecodoProxy(DecodoConfig()).enabled is False # 전부 비어있음 assert _p(password="").enabled is False assert _p(port_end=0).enabled is False # 포트 미설정 assert _p().enabled is True def test_playwright_proxy_shape(): cfg = _p().playwright_proxy() assert cfg["username"] == "user1" and cfg["password"] == "pw" # 고정 자격증명 assert cfg["server"].startswith("http://gate.decodo.com:") port = int(cfg["server"].rsplit(":", 1)[1]) assert 10001 <= port <= 10010 # 포트 범위 안 def test_disabled_returns_none(): assert DecodoProxy(DecodoConfig()).playwright_proxy() is None def test_port_selected_within_range_and_stable_in_window(): p = _p() port = p._port() assert 10001 <= port <= 10010 assert p._port() == port # 같은 시간창에서는 동일 포트(동일 sticky IP) def test_single_port_range(): p = _p(port_start=10001, port_end=10001) assert p._port() == 10001 # 포트 1개면 항상 그 포트 def test_rotate_advances_port_immediately(): p = _p(port_start=10001, port_end=10003) # 포트 3개 before = p._port() p.rotate() after = p._port() assert after != before # 즉시 다음 포트(새 IP) assert 10001 <= after <= 10003 p.rotate(); p.rotate() # 3번 회전하면 한 바퀴 → 원위치 assert p._port() == before