code.pablomurad.com

prami-pet

Community virtual pet that lives as a Mastodon account

tests/test_events.py raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from datetime import timedelta

from prami import engine, events
from prami.models import utcnow


def make_event(session, pet, config, key="egg"):
    template = next(t for t in events.TEMPLATES if t["key"] == key)
    return events.start(session, pet, config, template=template)


def test_start_creates_active_event(session, pet, config):
    event = make_event(session, pet, config)
    assert event.status == "active"
    assert events.active(session).id == event.id


def test_only_one_active_event(session, pet, config):
    make_event(session, pet, config)
    assert events.maybe_start(session, pet, config, force=True) is None


def test_vote_one_per_user(session, pet, user, config):
    event = make_event(session, pet, config)
    ok, _ = events.vote(session, event, user, "hatch")
    assert ok is True
    again, reason = events.vote(session, event, user, "guard")
    assert again is False and reason == "already voted"


def test_vote_unknown_option(session, pet, user, config):
    event = make_event(session, pet, config)
    ok, reason = events.vote(session, event, user, "banana")
    assert ok is False and reason == "unknown option"


def test_complete_applies_winning_outcome(session, pet, user, config):
    event = make_event(session, pet, config, key="snack_vote")
    pet.hunger = 80
    events.vote(session, event, user, "soup")
    outcome = events.complete(session, event, pet)
    assert event.status == "completed"
    assert pet.hunger == 60
    assert "Soup" in outcome


def test_complete_without_votes_uses_first_option(session, pet, config):
    event = make_event(session, pet, config, key="egg")
    assert events.complete(session, event, pet)
    assert event.status == "completed"


def test_expire_due_completes_past_events(session, pet, config):
    event = make_event(session, pet, config)
    event.ends_at = utcnow() - timedelta(hours=1)
    done = events.expire_due(session, pet)
    assert len(done) == 1
    assert event.status == "completed"


def test_engine_vote_flow(session, pet, user, config):
    make_event(session, pet, config, key="snack_vote")
    result = engine.handle(session, pet, user, "vote", config, arg="soup")
    assert result.accepted is True


def test_engine_event_show_when_none(session, pet, user, config):
    result = engine.handle(session, pet, user, "event", config)
    assert result.text