feat(realestate): 매물 수집 MOLIT/Naver 진단 계측(collect_log.error) — silent-failure 관측

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EqCYBhvTcdeCTUDX3RhWx9
This commit is contained in:
2026-07-09 17:09:59 +09:00
parent a7be8f76bf
commit cdc309150e
2 changed files with 65 additions and 18 deletions

View File

@@ -1,4 +1,4 @@
from unittest.mock import patch
from unittest.mock import patch, MagicMock
def test_parse_molit_rent_fields():
from app.listing_collector import _parse_molit_rent
@@ -20,10 +20,36 @@ def test_parse_naver_article_fields():
def test_collect_naver_block_sets_naver_ok_false(monkeypatch):
"""네이버 403 → 매물수집 skip + naver_ok=False, 실거래는 계속."""
from app import listing_collector as lc
monkeypatch.setattr(lc, "_fetch_molit_all", lambda: 2) # 실거래 2건 저장됨 가정
monkeypatch.setattr(lc, "_fetch_molit_all", lambda: (2, "calls=1 saved=2"))
def boom(*a, **k):
import requests
raise requests.RequestException("403")
monkeypatch.setattr(lc, "_fetch_naver_all", boom)
r = lc.collect_listings()
assert r["naver_ok"] is False # 안전마진(실거래)은 유지
def test_molit_call_returns_diag_on_http_error(monkeypatch):
"""MOLIT 401 등 HTTP 오류 → ([], diag) 반환, diag에 상태코드 포함(관측)."""
from app import listing_collector as lc
import requests
monkeypatch.setattr(lc, "MOLIT_KEY", "TESTKEY")
monkeypatch.setattr(lc.time, "sleep", lambda *a: None) # 재시도 대기 skip
resp = MagicMock()
resp.status_code = 401
resp.raise_for_status.side_effect = requests.HTTPError(response=resp)
monkeypatch.setattr(lc.requests, "get", lambda *a, **k: resp)
items, diag = lc._molit_call("getRTMSDataSvcAptTradeDev", "11590", "202606")
assert items == []
assert diag and "401" in diag
def test_collect_writes_molit_diag_to_log(monkeypatch):
"""collect_listings가 MOLIT/Naver 진단을 collect_log.error에 기록(silent-failure 관측)."""
from app import listing_collector as lc
from app import db
monkeypatch.setattr(lc, "_fetch_molit_all", lambda: (0, "calls=36 saved=0 err=http=401"))
monkeypatch.setattr(lc, "_fetch_naver_all", lambda: (0, 0))
lc.collect_listings()
log = db.get_last_listing_collect_log()
assert log is not None
assert "http=401" in (log["error"] or "")
assert "molit" in (log["error"] or "")