feat: 日聚合服务与命令 + 索引迁移打包(Task3 审查结论)
- refresh_daily:按上海自然日聚合 pv/uv/sessions/new_visitors,update_or_create 幂等 - refresh_stats 管理命令:回刷近 N 天(生产由 1Panel 每日 00:10 调度,见 Task 22) - 索引打包(0002):Event/VisitSession 增加 (site, 时间) 日聚合索引; 删 5 个冗余单列 FK 索引(Event.site/session、VisitSession.site/visitor、DailyStat.site), 保留 Event.visitor/Visitor.site;sqlite PRAGMA 实证级联索引完整、EXPLAIN 走新索引 - test_models:IntegrityError 断言收紧 + Site 级联删除测试 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import pytest
|
||||
from django.db import IntegrityError
|
||||
from tracker.models import Site, Visitor, VisitSession, Event
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
@@ -22,6 +23,16 @@ def test_event_unique_site_event_id():
|
||||
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(Exception):
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user