krz/hutch-stats

Server-side utility for calculating contributions for sourcehut users.

clone: git clone https://gitbay.org/krz/hutch-stats.git

main: tests/test_aggregator.py · raw

 1from datetime import UTC, datetime, date
 2
 3from sqlalchemy.orm import Session
 4
 5from srht_contrib.models import ContributionEvent
 6from srht_contrib.services.aggregator import ContributionAggregator
 7
 8
 9def test_aggregator_zero_fills_days(db_session: Session) -> None:
10    db_session.add(
11        ContributionEvent(
12            service="todo",
13            event_type="ticket_created",
14            actor="~ccleberg",
15            repo_name=None,
16            resource_id="1",
17            external_uid="todo:1:created",
18            occurred_at=datetime(2026, 3, 28, 12, 0, tzinfo=UTC),
19            weight=1.0,
20            raw_payload_json=None,
21        )
22    )
23    db_session.commit()
24
25    calendar = ContributionAggregator().build_calendar(
26        db_session,
27        "~ccleberg",
28        date(2026, 3, 28),
29        date(2026, 3, 30),
30    )
31
32    assert [day.model_dump() for day in calendar.days] == [
33        {"date": date(2026, 3, 28), "count": 1, "score": 1.0},
34        {"date": date(2026, 3, 29), "count": 0, "score": 0.0},
35        {"date": date(2026, 3, 30), "count": 0, "score": 0.0},
36    ]
37
38
39def test_stats_calculation(db_session: Session) -> None:
40    db_session.add_all(
41        [
42            ContributionEvent(
43                service="todo",
44                event_type="ticket_created",
45                actor="~ccleberg",
46                repo_name=None,
47                resource_id="1",
48                external_uid="todo:1:created",
49                occurred_at=datetime(2026, 3, 28, 12, 0, tzinfo=UTC),
50                weight=1.0,
51                raw_payload_json=None,
52            ),
53            ContributionEvent(
54                service="todo",
55                event_type="ticket_comment",
56                actor="~ccleberg",
57                repo_name=None,
58                resource_id="1",
59                external_uid="todo:1:comment:1",
60                occurred_at=datetime(2026, 3, 29, 12, 0, tzinfo=UTC),
61                weight=0.5,
62                raw_payload_json=None,
63            ),
64        ]
65    )
66    db_session.commit()
67
68    stats = ContributionAggregator().build_stats(
69        db_session,
70        "~ccleberg",
71        date(2026, 3, 28),
72        date(2026, 3, 30),
73    )
74
75    assert stats.total_events == 2
76    assert stats.total_score == 1.5
77    assert stats.active_days == 2
78    assert stats.longest_streak == 2
79    assert stats.current_streak == 0