Passed
Push — master ( a16b88...f8e46c )
by dgw
02:00 queued 10s
created

test_coretasks.test_mode_colon()   A

Complexity

Conditions 2

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 19
rs 9.85
c 0
b 0
f 0
cc 2
nop 1
1
# coding=utf-8
2
"""coretasks.py tests"""
3
from __future__ import unicode_literals, absolute_import, print_function, division
4
5
import pytest
6
7
from sopel import coretasks
8
from sopel.module import VOICE, HALFOP, OP, ADMIN, OWNER
9
from sopel.tools import Identifier
10
from sopel.test_tools import MockSopel, MockSopelWrapper
11
from sopel.trigger import PreTrigger, Trigger
12
13
14
@pytest.fixture
15
def sopel():
16
    bot = MockSopel("Sopel")
17
    return bot
18
19
20
def test_bot_mixed_modes(sopel):
21
    """
22
    Ensure mixed modes like +vha are tracked correctly.
23
    Sopel 6.6.6 and older would assign all modes to all users. #1575
24
    """
25
26
    # RPL_NAMREPLY to create Users and (zeroed) privs
27
    for user in set("Unothing Uvoice Uhalfop Uop Uadmin Uowner".split(" ")):
28
        pretrigger = PreTrigger(
29
            "Foo", ":test.example.com 353 Foo = #test :Foo %s" % user
30
        )
31
        trigger = Trigger(sopel.config, pretrigger, None)
32
        coretasks.handle_names(MockSopelWrapper(sopel, trigger), trigger)
33
34
    pretrigger = PreTrigger("Foo", "MODE #test +qvhao Uowner Uvoice Uhalfop Uadmin Uop")
35
    trigger = Trigger(sopel.config, pretrigger, None)
36
    coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
37
38
    assert sopel.channels["#test"].privileges[Identifier("Unothing")] == 0
39
    assert sopel.channels["#test"].privileges[Identifier("Uvoice")] == VOICE
40
    assert sopel.channels["#test"].privileges[Identifier("Uhalfop")] == HALFOP
41
    assert sopel.channels["#test"].privileges[Identifier("Uop")] == OP
42
    assert sopel.channels["#test"].privileges[Identifier("Uadmin")] == ADMIN
43
    assert sopel.channels["#test"].privileges[Identifier("Uowner")] == OWNER
44
45
46
def test_bot_mixed_mode_removal(sopel):
47
    """
48
    Ensure mixed mode types like -h+a are handled
49
    Sopel 6.6.6 and older did not handle this correctly. #1575
50
    """
51
52
    # RPL_NAMREPLY to create Users and (zeroed) privs
53
    for user in set("Uvoice Uop".split(" ")):
54
        pretrigger = PreTrigger(
55
            "Foo", ":test.example.com 353 Foo = #test :Foo %s" % user
56
        )
57
        trigger = Trigger(sopel.config, pretrigger, None)
58
        coretasks.handle_names(MockSopelWrapper(sopel, trigger), trigger)
59
60
    pretrigger = PreTrigger("Foo", "MODE #test +qao Uvoice Uvoice Uvoice")
61
    trigger = Trigger(sopel.config, pretrigger, None)
62
    coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
63
64
    pretrigger = PreTrigger(
65
        "Foo", "MODE #test -o+o-qa+v Uvoice Uop Uvoice Uvoice Uvoice"
66
    )
67
    trigger = Trigger(sopel.config, pretrigger, None)
68
    coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
69
70
    assert sopel.channels["#test"].privileges[Identifier("Uvoice")] == VOICE
71
    assert sopel.channels["#test"].privileges[Identifier("Uop")] == OP
72
73
74
def test_bot_mixed_mode_types(sopel):
75
    """
76
    Ensure mixed argument- and non-argument- modes are handled
77
    Sopel 6.6.6 and older did not behave well. #1575
78
    """
79
80
    # RPL_NAMREPLY to create Users and (zeroed) privs
81
    for user in set("Uvoice Uop Uadmin Uvoice2 Uop2 Uadmin2".split(" ")):
82
        pretrigger = PreTrigger(
83
            "Foo", ":test.example.com 353 Foo = #test :Foo %s" % user
84
        )
85
        trigger = Trigger(sopel.config, pretrigger, None)
86
        coretasks.handle_names(MockSopelWrapper(sopel, trigger), trigger)
87
88
    # Non-attribute-requiring non-permission mode
89
    pretrigger = PreTrigger("Foo", "MODE #test +amov Uadmin Uop Uvoice")
90
    trigger = Trigger(sopel.config, pretrigger, None)
91
    coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
92
93
    assert sopel.channels["#test"].privileges[Identifier("Uvoice")] == VOICE
94
    assert sopel.channels["#test"].privileges[Identifier("Uop")] == OP
95
    assert sopel.channels["#test"].privileges[Identifier("Uadmin")] == ADMIN
96
97
    # Attribute-requiring non-permission modes
98
    # This results in a _send_who, which isn't supported in MockSopel or this
99
    # test, so we just make sure it results in an exception instead of privesc.
100
    pretrigger = PreTrigger("Foo", "MODE #test +abov Uadmin2 x!y@z Uop2 Uvoice2")
101
    trigger = Trigger(sopel.config, pretrigger, None)
102
    try:
103
        coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
104
    except AttributeError as e:
105
        if e.args[0] == "'MockSopel' object has no attribute 'enabled_capabilities'":
106
            return
107
108
    assert sopel.channels["#test"].privileges[Identifier("Uvoice2")] == VOICE
109
    assert sopel.channels["#test"].privileges[Identifier("Uop2")] == OP
110
    assert sopel.channels["#test"].privileges[Identifier("Uadmin2")] == ADMIN
111
112
113
def test_mode_colon(sopel):
114
    """
115
    Ensure mode messages with colons are parsed properly
116
    """
117
118
    # RPL_NAMREPLY to create Users and (zeroed) privs
119
    for user in set("Uvoice Uadmin".split(" ")):
120
        pretrigger = PreTrigger(
121
            "Foo", ":test.example.com 353 Foo = #test :Foo %s" % user
122
        )
123
        trigger = Trigger(sopel.config, pretrigger, None)
124
        coretasks.handle_names(MockSopelWrapper(sopel, trigger), trigger)
125
126
    pretrigger = PreTrigger("Foo", "MODE #test +av Uadmin :Uvoice")
127
    trigger = Trigger(sopel.config, pretrigger, None)
128
    coretasks.track_modes(MockSopelWrapper(sopel, trigger), trigger)
129
130
    assert sopel.channels["#test"].privileges[Identifier("Uvoice")] == VOICE
131
    assert sopel.channels["#test"].privileges[Identifier("Uadmin")] == ADMIN
132