code.pablomurad.com

prami-pet

Community virtual pet that lives as a Mastodon account

tests/test_nickname.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
70
71
72
73
from datetime import timedelta

from prami import engine, responses, sanitize
from prami.models import utcnow


def test_clean_nickname_valid():
    assert sanitize.clean_nickname("Soup Wizard") == "Soup Wizard"


def test_clean_nickname_truncates_to_32():
    assert len(sanitize.clean_nickname("x" * 50)) == 32


def test_clean_nickname_rejects_urls():
    assert sanitize.clean_nickname("see http://evil.example") is None
    assert sanitize.clean_nickname("www.evil.example") is None


def test_clean_nickname_rejects_mentions():
    assert sanitize.clean_nickname("hi @bob@server.social") is None


def test_clean_nickname_strips_html():
    assert sanitize.clean_nickname("<b>Soup</b>") == "Soup"


def test_clean_nickname_collapses_breaks():
    assert sanitize.clean_nickname("Soup\n\n  Wizard") == "Soup Wizard"


def test_clean_nickname_empty_is_none():
    assert sanitize.clean_nickname("   ") is None


def test_nickname_set_then_clear(session, pet, user, config):
    result = engine.handle(session, pet, user, "nickname", config, arg="Soup Wizard")
    assert result.accepted is True
    assert user.nickname == "Soup Wizard"

    later = utcnow() + timedelta(minutes=6)
    engine.handle(session, pet, user, "nickname", config, arg="clear", now=later)
    assert user.nickname is None


def test_nickname_invalid_is_rejected(session, pet, user, config):
    result = engine.handle(session, pet, user, "nickname", config, arg="http://x.example")
    assert result.accepted is False
    assert user.nickname is None


def test_nickname_cooldown_blocks_quick_second(session, pet, user, config):
    engine.handle(session, pet, user, "nickname", config, arg="One")
    second = engine.handle(session, pet, user, "nickname", config, arg="Two")
    assert second.accepted is False
    assert user.nickname == "One"


class _FakeUser:
    def __init__(self, nickname, bond_level="stranger"):
        self.nickname = nickname
        self.bond_level = bond_level


def test_maybe_address_can_use_nickname():
    u = _FakeUser("Soup", "friend")
    used = any(responses.maybe_address("Prami did a thing.", u).startswith("Soup, ") for _ in range(200))
    assert used


def test_maybe_address_without_nickname_is_unchanged():
    u = _FakeUser(None)
    assert responses.maybe_address("hello", u) == "hello"