cb57e67179
TDD:7 测试先红(ModuleNotFoundError)后绿。与计划的一处偏差: 敏感键扫描移至属性白名单之前——白名单内无任何键命中敏感模式, 原顺序下 sensitive_field 不可达,test_sensitive_property_rejected (user_password 非白名单键)将得到 property_not_allowed 而失败。 Co-Authored-By: Claude Code <noreply@anthropic.com>
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
from datetime import datetime, timedelta
|
|
from django.utils import timezone
|
|
from tracker.services.validation import validate_event, sanitize_url
|
|
|
|
NOW = timezone.now()
|
|
|
|
def _ev(**kw):
|
|
base = dict(event_id="e1", event_name="page_view",
|
|
occurred_at=NOW, path="/p", title="t", properties={})
|
|
base.update(kw)
|
|
return base
|
|
|
|
def test_ok_event():
|
|
assert validate_event(_ev()) is None # None = 通过
|
|
|
|
def test_unknown_event_name():
|
|
assert validate_event(_ev(event_name="xxx")) == "event_name_not_allowed"
|
|
|
|
def test_sensitive_property_rejected():
|
|
r = validate_event(_ev(properties={"user_password": "1"}))
|
|
assert "sensitive" in r
|
|
|
|
def test_shape_type_and_whitelist():
|
|
assert validate_event(["x"]) == "event_invalid_shape"
|
|
assert validate_event(_ev(event_id=123)) == "invalid_event_id"
|
|
assert validate_event(_ev(properties={"foo": "bar"})) == "property_not_allowed"
|
|
|
|
def test_too_many_props_and_long_string():
|
|
r = validate_event(_ev(properties={f"k{i}": "v" for i in range(40)}))
|
|
assert "properties" in r
|
|
r = validate_event(_ev(properties={"referrer": "x" * 600}))
|
|
assert "properties" in r
|
|
|
|
def test_future_and_stale_time():
|
|
r = validate_event(_ev(occurred_at=NOW + timedelta(days=2)))
|
|
assert "occurred_at" in r # 超窗拒绝
|
|
assert validate_event(_ev(occurred_at=NOW - timedelta(hours=2))) is None # 窗内迟到可收
|
|
|
|
def test_sanitize_url_drops_sensitive_params():
|
|
u = sanitize_url("/p?email=a@b.com&token=x&id=3&utm_source=google&monkey=1")
|
|
assert "email=" not in u and "token=" not in u and "utm_source=google" in u
|
|
assert "monkey=1" in u # fullmatch:含 key 子串的正常参数不误伤
|