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