test_notification.test_attrs_sanity()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 10
rs 10
c 0
b 0
f 0
cc 1
nop 0
1
import pytest
2
3
4
@pytest.fixture
5
def subject():
6
    from so_magic.utils import Subject
7
    return Subject
8
9
10
@pytest.fixture
11
def observer():
12
    from so_magic.utils import Observer
13
    return Observer
14
15
16
def test_attrs_sanity():
17
    import attr
18
19
    @attr.s
20
    class A:
21
        _observers = attr.ib(init=True, default=[])
22
23
    i1 = A()
24
    i2 = A()
25
    assert id(i1._observers) == id(i2._observers)  # SOS
26
27
28
def test_attrs_sanity1():
29
    import attr
30
31
    @attr.s
32
    class A:
33
        _observers = attr.ib(init=True)
34
        def add(self, *objects):
35
            self._observers.extend([_ for _ in objects])
36
    i1 = A([])
37
    i2 = A([])
38
    assert id(i1._observers) != id(i2._observers)
39
    i1.add('obs1')
40
    assert i1._observers == ['obs1']
41
    assert i2._observers == []
42
    assert id(i1._observers) != id(i2._observers)
43
44
    @attr.s
45
    class B:
46
        _observers = attr.ib(init=True, default=attr.Factory(list))
47
48
    i1 = B()
49
    i2 = B()
50
    assert id(i1._observers) != id(i2._observers)
51
52
53
def test_observers_sanity_test1(subject):
54
    subject1 = subject([])
55
    subject2 = subject([])
56
    assert hasattr(subject1, '_observers')
57
    assert hasattr(subject2, '_observers')
58
    assert id(subject1._observers) != id(subject2._observers)
59
60
61
def test_observer_as_constructor(observer):
62
    with pytest.raises(TypeError) as instantiation_from_interface_error:
63
        observer_instance = observer()
64
    assert "Can't instantiate abstract class Observer with abstract methods update" in str(instantiation_from_interface_error.value)
65
66
67
def test_scenario(subject, observer):
68
# The client code.
69
70
    print("------ Scenario 1 ------\n")
71
    class ObserverA(observer):
72
        def update(self, a_subject) -> None:
73
            print("ObserverA: Reacted to the event")
74
75
    s1 = subject([])
76
    # o1 = observer()
77
    # s1.attach(o1)
78
79
    # business logic
80
    s1.state = 0
81
    s1.notify()
82
83
    print("------ Scenario 2 ------\n")
84
    # example 2
85
    class Businessubject(subject):
86
87
        def some_business_logic(self) -> None:
88
            """
89
            Usually, the subscription logic is only a fraction of what a Subject can
90
            really do. Subjects commonly hold some important business logic, that
91
            triggers a notification method whenever something important is about to
92
            happen (or after it).
93
            """
94
            print("\nSubject: I'm doing something important.")
95
            from random import randrange
96
            self._state = randrange(0, 10)
97
            print(f"Subject: My state has just changed to: {self._state}")
98
            self.notify()
99
100
    class ObserverB(observer):
101
        def update(self, a_subject) -> None:
102
            if a_subject.state == 0 or a_subject.state >= 2:
103
                print("ObserverB: Reacted to the event")
104
105
    s2 = Businessubject([])
106
    assert id(s1) != id(s2)
107
    assert id(s1._observers) != id(s2._observers)
108
    o1, o2 = ObserverA(), ObserverB()
109
    # s2.attach(o1)
110
    # s2.attach(o2)
111
    s2.add(o1, o2)
112
    # business logic
113
    print(s2._observers)
114
    s2.some_business_logic()
115
    s2.some_business_logic()
116
117
    s2.detach(o1)
118
    s2.some_business_logic()
119