Files

60 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import pytest
from django.db import IntegrityError
from tracker.models import Site, Visitor, VisitSession, Event
pytestmark = pytest.mark.django_db
def _base_event_kwargs():
"""合法 Event 基线 kwargs(schema v2 测试用)"""
site = Site.objects.create(name="s", domains=["a.com"])
visitor = Visitor.objects.create(site=site, visitor_id="vid1")
session = VisitSession.objects.create(site=site, visitor=visitor, session_id="sid1",
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
return dict(site=site, visitor=visitor, session=session, event_id="e1",
event_name="page_stay", occurred_at="2026-09-15T10:00:30Z", path="/")
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",
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
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(IntegrityError):
Event.objects.create(site=site, visitor=v, session=s, event_id="e1",
event_name="page_view", occurred_at="2026-09-15T10:01:00Z", path="/")
def test_site_cascade_deletes_children():
site = Site.objects.create(name="s", domains=["a.com"])
v = Visitor.objects.create(site=site, visitor_id="v")
s = VisitSession.objects.create(site=site, visitor=v, session_id="s",
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
Event.objects.create(site=site, visitor=v, session=s, event_id="e",
event_name="page_view", occurred_at="2026-09-15T10:00:00Z", path="/")
site.delete()
assert Visitor.objects.count() == 0 and VisitSession.objects.count() == 0 and Event.objects.count() == 0
def test_event_has_phase_a_fields():
e = Event(**_base_event_kwargs(), page_id="p1", active_from_ms=0,
active_to_ms=15000, flush_reason="periodic",
time_quality="ok", sdk_version="0.2.0", schema_version=2)
e.full_clean()
def test_visit_session_resume_of_self_fk():
assert VisitSession._meta.get_field("resume_of").related_model is VisitSession