feat: 核心数据模型(Site/Visitor/VisitSession/Event/DailyStat)

VisitSession.started_at/ended_at 在计划模型基础上加 null=True(计划测试
未传这两字段,原 NOT NULL 会导致测试失败;ended_at 为空也表示会话进行中)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-15 11:45:03 +08:00
parent cda80b1605
commit d1472c1845
5 changed files with 299 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
import pytest
from tracker.models import Site, Visitor, VisitSession, Event
pytestmark = pytest.mark.django_db
def test_create_site_generates_public_site_id():
site = Site.objects.create(name="官网", domains=["www.example.com"])
assert site.site_id.startswith("site_") and len(site.site_id) == 21
assert site.is_active is True
def test_visitor_first_touch_fields():
site = Site.objects.create(name="s", domains=["a.com"])
v = Visitor.objects.create(site=site, visitor_id="vid1",
first_referrer_domain="google.com", first_utm={"utm_source": "google"},
first_landing_path="/p", country="美国", device_type="PC")
assert v.visit_count == 0 and v.active_days == 0
def test_event_unique_site_event_id():
site = Site.objects.create(name="s", domains=["a.com"])
v = Visitor.objects.create(site=site, visitor_id="vid1")
s = VisitSession.objects.create(site=site, visitor=v, session_id="sid1")
Event.objects.create(site=site, visitor=v, session=s, event_id="e1",
event_name="page_view", occurred_at="2026-09-15T10:00:00Z", path="/")
with pytest.raises(Exception):
Event.objects.create(site=site, visitor=v, session=s, event_id="e1",
event_name="page_view", occurred_at="2026-09-15T10:01:00Z", path="/")