whoogle-search/test/test_tor.py

53 lines
1.8 KiB
Python

import pytest
from app import app
from app.request import Request, TorError
from app.models.config import Config
class FakeResponse:
def __init__(self, text: str = '', status_code: int = 200, content: bytes = b''):
self.text = text
self.status_code = status_code
self.content = content or b''
class FakeHttpClient:
def __init__(self, tor_ok: bool):
self._tor_ok = tor_ok
def get(self, url, headers=None, cookies=None, retries=0, backoff_seconds=0.5, use_cache=False):
if 'check.torproject.org' in url:
return FakeResponse(text=('Congratulations' if self._tor_ok else 'Not Tor'))
return FakeResponse(text='', status_code=200, content=b'OK')
def close(self):
pass
def build_config(tor: bool) -> Config:
# Minimal config with tor flag
with app.app_context():
return Config(**{'tor': tor})
def test_tor_validation_success(monkeypatch):
# Prevent real Tor signal attempts
monkeypatch.setattr('app.request.send_tor_signal', lambda signal: True)
cfg = build_config(tor=True)
req = Request(normal_ua='TestUA', root_path='http://localhost:5000', config=cfg, http_client=FakeHttpClient(tor_ok=True))
# Avoid sending a Tor NEWNYM/HEARTBEAT in unit tests by setting attempt>0 false path
resp = req.send(base_url='https://example.com', query='')
assert req.tor_valid is True
assert resp.status_code == 200
def test_tor_validation_failure(monkeypatch):
# Prevent real Tor signal attempts
monkeypatch.setattr('app.request.send_tor_signal', lambda signal: True)
cfg = build_config(tor=True)
req = Request(normal_ua='TestUA', root_path='http://localhost:5000', config=cfg, http_client=FakeHttpClient(tor_ok=False))
with pytest.raises(TorError):
_ = req.send(base_url='https://example.com', query='')