Skip to content

Commit 059b0ec

Browse files
author
amorozenko
committed
Added handling for pytest-mocker>=1.11.2 context manager restriction
1 parent 81dfc16 commit 059b0ec

File tree

6 files changed

+119
-117
lines changed

6 files changed

+119
-117
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ You can run unit tests for cPython version of library (blynklib.py) using the co
6464

6565
python setup.py test
6666

67+
**NOTE** Blynklib version <0.2.6 should use pytest-mock<1.11.2. In version 1.11.2 were added restrictions for context manager usage
68+
6769
**NOTE:** Unit tests for Micropython ENV are not available yet.
6870

6971
#### Micropython installation

blynklib.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ def _get_socket(self):
202202
self._socket.connect(socket.getaddrinfo(self.server, self.port)[0][4])
203203
self._socket.settimeout(self.SOCK_TIMEOUT)
204204
if self.ssl_cert:
205-
# system’s default CA certificates case
205+
# system default CA certificates case
206206
if self.ssl_cert == "default":
207207
self.ssl_cert = None
208208
self.log('Using SSL socket...')

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
author='Anton Morozenko',
1515
author_email='antoha.ua@gmail.com',
1616
setup_requires=['pytest-runner', ],
17-
tests_require=['pytest', 'pytest-mock', ],
17+
tests_require=['pytest', 'pytest-mock>=1.11.2', ],
1818
py_modules=['blynklib', 'blynktimer'],
1919
classifiers=[
2020
"Programming Language :: Python :: 2.7",

test/test_blynk_connection.py

+42-42
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ def test_is_server_alive_negative(self, cb):
8686

8787
def test_is_server_alive_positive_ping(self, cb, mocker):
8888
cb._last_rcv_time = int(time.time() * 1000)
89-
with mocker.patch.object(cb, 'send', return_value=None):
90-
result = cb.is_server_alive()
91-
assert result is True
89+
mocker.patch.object(cb, 'send', return_value=None)
90+
result = cb.is_server_alive()
91+
assert result is True
9292

9393
def test_is_server_alive_positive_no_ping_1(self, cb):
9494
cb._last_rcv_time = int(time.time() * 1000)
@@ -116,59 +116,59 @@ def test_get_socket_exception(self, cb, mocker):
116116
assert 'Connection with the Blynk server failed: BE' in str(b_err.value)
117117

118118
def test_authenticate(self, cb, mocker):
119-
with mocker.patch.object(cb, 'send', return_value=None):
120-
with mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\xc8'):
121-
cb._authenticate()
122-
assert cb._state == cb.AUTHENTICATED
119+
mocker.patch.object(cb, 'send', return_value=None)
120+
mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\xc8')
121+
cb._authenticate()
122+
assert cb._state == cb.AUTHENTICATED
123123

124124
def test_authenticate_invalid_auth_token(self, cb, mocker):
125-
with mocker.patch.object(cb, 'send', return_value=None):
126-
with mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x09'):
127-
with pytest.raises(BlynkError) as b_err:
128-
cb._authenticate()
129-
assert 'Invalid Auth Token' in str(b_err.value)
125+
mocker.patch.object(cb, 'send', return_value=None)
126+
mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x09')
127+
with pytest.raises(BlynkError) as b_err:
128+
cb._authenticate()
129+
assert 'Invalid Auth Token' in str(b_err.value)
130130

131131
def test_authenticate_redirect_message(self, cb, mocker):
132-
with mocker.patch.object(cb, 'send', return_value=None):
133-
with mocker.patch.object(cb, 'receive', return_value=b'\x29\x00\x02\x00\x11127.0.0.1\x004444'):
134-
with pytest.raises(RedirectError) as r_err:
135-
cb._authenticate()
136-
# pytest exception wraps real exception - so we need access value field first
137-
assert '127.0.0.1' in r_err.value.server
138-
assert '4444' in r_err.value.port
132+
mocker.patch.object(cb, 'send', return_value=None)
133+
mocker.patch.object(cb, 'receive', return_value=b'\x29\x00\x02\x00\x11127.0.0.1\x004444')
134+
with pytest.raises(RedirectError) as r_err:
135+
cb._authenticate()
136+
# pytest exception wraps real exception - so we need access value field first
137+
assert '127.0.0.1' in r_err.value.server
138+
assert '4444' in r_err.value.port
139139

140140
def test_authenticate_not_ok_status(self, cb, mocker):
141-
with mocker.patch.object(cb, 'send', return_value=None):
142-
with mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x19'):
143-
with pytest.raises(BlynkError) as b_err:
144-
cb._authenticate()
145-
assert 'Auth stage failed. Status=25' in str(b_err.value)
141+
mocker.patch.object(cb, 'send', return_value=None)
142+
mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x19')
143+
with pytest.raises(BlynkError) as b_err:
144+
cb._authenticate()
145+
assert 'Auth stage failed. Status=25' in str(b_err.value)
146146

147147
def test_authenticate_timeout(self, cb, mocker):
148-
with mocker.patch.object(cb, 'send', return_value=None):
149-
with mocker.patch.object(cb, 'receive', return_value=None):
150-
with pytest.raises(BlynkError) as b_err:
151-
cb._authenticate()
152-
assert 'Auth stage timeout' in str(b_err.value)
148+
mocker.patch.object(cb, 'send', return_value=None)
149+
mocker.patch.object(cb, 'receive', return_value=None)
150+
with pytest.raises(BlynkError) as b_err:
151+
cb._authenticate()
152+
assert 'Auth stage timeout' in str(b_err.value)
153153

154154
def test_set_heartbeat_timeout(self, cb, mocker):
155-
with mocker.patch.object(cb, 'send', return_value=None):
156-
with mocker.patch.object(cb, 'receive', return_value=None):
157-
with pytest.raises(BlynkError) as b_err:
158-
cb._set_heartbeat()
159-
assert 'Heartbeat stage timeout' in str(b_err.value)
155+
mocker.patch.object(cb, 'send', return_value=None)
156+
mocker.patch.object(cb, 'receive', return_value=None)
157+
with pytest.raises(BlynkError) as b_err:
158+
cb._set_heartbeat()
159+
assert 'Heartbeat stage timeout' in str(b_err.value)
160160

161161
def test_set_heartbeat_error_status(self, cb, mocker):
162-
with mocker.patch.object(cb, 'send', return_value=None):
163-
with mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x0e'):
164-
with pytest.raises(BlynkError) as b_err:
165-
cb._set_heartbeat()
166-
assert 'Set heartbeat returned code=14' in str(b_err.value)
162+
mocker.patch.object(cb, 'send', return_value=None)
163+
mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\x0e')
164+
with pytest.raises(BlynkError) as b_err:
165+
cb._set_heartbeat()
166+
assert 'Set heartbeat returned code=14' in str(b_err.value)
167167

168168
def test_set_heartbeat_positive(self, cb, mocker):
169-
with mocker.patch.object(cb, 'send', return_value=None):
170-
with mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\xc8'):
171-
cb._set_heartbeat()
169+
mocker.patch.object(cb, 'send', return_value=None)
170+
mocker.patch.object(cb, 'receive', return_value=b'\x00\x00\x02\x00\xc8')
171+
cb._set_heartbeat()
172172

173173
def test_connected_false(self, cb):
174174
result = cb.connected()

test/test_blynk_main.py

+71-71
Original file line numberDiff line numberDiff line change
@@ -12,95 +12,95 @@ def bl(self):
1212
yield blynk
1313

1414
def test_connect(self, bl, mocker):
15-
with mocker.patch.object(bl, 'connected', return_value=False):
16-
with mocker.patch.object(bl, '_get_socket', return_value=None):
17-
with mocker.patch.object(bl, '_authenticate', return_value=None):
18-
with mocker.patch.object(bl, '_set_heartbeat', return_value=None):
19-
with mocker.patch.object(bl, 'call_handler', return_value=None):
20-
with mocker.patch.object(blynklib, 'ticks_ms', return_value=42):
21-
result = bl.connect()
22-
assert result is True
23-
assert bl._last_rcv_time == 42
15+
mocker.patch.object(bl, 'connected', return_value=False)
16+
mocker.patch.object(bl, '_get_socket', return_value=None)
17+
mocker.patch.object(bl, '_authenticate', return_value=None)
18+
mocker.patch.object(bl, '_set_heartbeat', return_value=None)
19+
mocker.patch.object(bl, 'call_handler', return_value=None)
20+
mocker.patch.object(blynklib, 'ticks_ms', return_value=42)
21+
result = bl.connect()
22+
assert result is True
23+
assert bl._last_rcv_time == 42
2424

2525
def test_connect_exception(self, bl, mocker):
26-
with mocker.patch.object(bl, 'connected', return_value=False):
27-
with mocker.patch.object(bl, '_get_socket', return_value=None):
28-
with mocker.patch.object(bl, '_authenticate', side_effect=blynklib.BlynkError()):
29-
with mocker.patch.object(bl, 'disconnect', return_value=None):
30-
with mocker.patch('time.sleep', return_value=None):
31-
mocker.spy(bl, 'disconnect')
32-
result = bl.connect(0.001)
33-
assert result is False
34-
assert bl.disconnect.call_count > 1
26+
mocker.patch.object(bl, 'connected', return_value=False)
27+
mocker.patch.object(bl, '_get_socket', return_value=None)
28+
mocker.patch.object(bl, '_authenticate', side_effect=blynklib.BlynkError())
29+
mocker.patch.object(bl, 'disconnect', return_value=None)
30+
mocker.patch('time.sleep', return_value=None)
31+
mocker.spy(bl, 'disconnect')
32+
result = bl.connect(0.001)
33+
assert result is False
34+
assert bl.disconnect.call_count > 1
3535

3636
def test_connect_redirect_exception(self, bl, mocker):
37-
with mocker.patch.object(bl, 'connected', return_value=False):
38-
with mocker.patch.object(bl, '_get_socket', return_value=None):
39-
with mocker.patch.object(bl, '_authenticate', side_effect=blynklib.RedirectError('127.0.0.1', 4444)):
40-
with mocker.patch.object(bl, 'disconnect', return_value=None):
41-
with mocker.patch('time.sleep', return_value=None):
42-
mocker.spy(bl, 'disconnect')
43-
result = bl.connect(0.001)
44-
assert result is False
45-
assert bl.disconnect.call_count > 1
46-
assert bl.server == '127.0.0.1'
47-
assert bl.port == 4444
37+
mocker.patch.object(bl, 'connected', return_value=False)
38+
mocker.patch.object(bl, '_get_socket', return_value=None)
39+
mocker.patch.object(bl, '_authenticate', side_effect=blynklib.RedirectError('127.0.0.1', 4444))
40+
mocker.patch.object(bl, 'disconnect', return_value=None)
41+
mocker.patch('time.sleep', return_value=None)
42+
mocker.spy(bl, 'disconnect')
43+
result = bl.connect(0.001)
44+
assert result is False
45+
assert bl.disconnect.call_count > 1
46+
assert bl.server == '127.0.0.1'
47+
assert bl.port == 4444
4848

4949
def test_connect_timeout(self, bl, mocker):
5050
bl._state = bl.CONNECTING
51-
with mocker.patch.object(bl, 'connected', return_value=False):
52-
result = bl.connect(0.001)
53-
assert result is False
51+
mocker.patch.object(bl, 'connected', return_value=False)
52+
result = bl.connect(0.001)
53+
assert result is False
5454

5555
def test_disconnect(self, bl, mocker):
5656
bl._socket = socket.socket()
57-
with mocker.patch('time.sleep', return_value=None):
58-
bl.disconnect('123')
57+
mocker.patch('time.sleep', return_value=None)
58+
bl.disconnect('123')
5959

6060
def test_virtual_write(self, bl, mocker):
61-
with mocker.patch.object(bl, 'send', return_value=10):
62-
result = bl.virtual_write(20, 'va1', 'val2')
63-
assert result == 10
61+
mocker.patch.object(bl, 'send', return_value=10)
62+
result = bl.virtual_write(20, 'va1', 'val2')
63+
assert result == 10
6464

6565
def test_virtual_sync(self, bl, mocker):
66-
with mocker.patch.object(bl, 'send', return_value=20):
67-
result = bl.virtual_sync(20, 22)
68-
assert result == 20
66+
mocker.patch.object(bl, 'send', return_value=20)
67+
result = bl.virtual_sync(20, 22)
68+
assert result == 20
6969

7070
def test_email(self, bl, mocker):
71-
with mocker.patch.object(bl, 'send', return_value=30):
72-
result = bl.email('1', '2', '3')
73-
assert result == 30
71+
mocker.patch.object(bl, 'send', return_value=30)
72+
result = bl.email('1', '2', '3')
73+
assert result == 30
7474

7575
def test_tweet(self, bl, mocker):
76-
with mocker.patch.object(bl, 'send', return_value=40):
77-
result = bl.tweet('123')
78-
assert result == 40
76+
mocker.patch.object(bl, 'send', return_value=40)
77+
result = bl.tweet('123')
78+
assert result == 40
7979

8080
def test_notify(self, bl, mocker):
81-
with mocker.patch.object(bl, 'send', return_value=50):
82-
result = bl.notify('123')
83-
assert result == 50
81+
mocker.patch.object(bl, 'send', return_value=50)
82+
result = bl.notify('123')
83+
assert result == 50
8484

8585
def test_set_property(self, bl, mocker):
86-
with mocker.patch.object(bl, 'send', return_value=60):
87-
result = bl.set_property(1, '2', '3')
88-
assert result == 60
86+
mocker.patch.object(bl, 'send', return_value=60)
87+
result = bl.set_property(1, '2', '3')
88+
assert result == 60
8989

9090
def test_internal(self, bl, mocker):
91-
with mocker.patch.object(bl, 'send', return_value=70):
92-
result = bl.internal('rtc', 'sync')
93-
assert result == 70
91+
mocker.patch.object(bl, 'send', return_value=70)
92+
result = bl.internal('rtc', 'sync')
93+
assert result == 70
9494

9595
def test_hadle_event(self, bl):
9696
bl._events = {}
9797

98-
@bl.handle_event("connect")
98+
@bl.handle_event('connect')
9999
def connect_handler():
100100
pass
101101

102-
@bl.handle_event("disconnect")
103-
def connect_handler():
102+
@bl.handle_event('disconnect')
103+
def disconnect_handler():
104104
pass
105105

106106
assert 'connect' in bl._events.keys()
@@ -142,10 +142,10 @@ def test_process_rsp(self, bl, mocker):
142142
assert bl.log.call_count == 1
143143

144144
def test_process_ping(self, bl, mocker):
145-
with mocker.patch.object(bl, 'send', return_value=None):
146-
mocker.spy(bl, 'send')
147-
bl.process(bl.MSG_PING, 100, 200, [])
148-
assert bl.send.call_count == 1
145+
mocker.patch.object(bl, 'send', return_value=None)
146+
mocker.spy(bl, 'send')
147+
bl.process(bl.MSG_PING, 100, 200, [])
148+
assert bl.send.call_count == 1
149149

150150
def test_process_internal(self, bl, mocker):
151151
bl._events = {}
@@ -154,9 +154,9 @@ def test_process_internal(self, bl, mocker):
154154
def internal_handler(*args):
155155
bl._status = 'INTERNAL TEST {}'.format(*args)
156156

157-
with mocker.patch.object(bl, 'send', return_value=None):
158-
bl.process(bl.MSG_INTERNAL, 100, 20, ["xyz", "add", 2])
159-
assert bl._status == "INTERNAL TEST ['add', 2]"
157+
mocker.patch.object(bl, 'send', return_value=None)
158+
bl.process(bl.MSG_INTERNAL, 100, 20, ['xyz', 'add', 2])
159+
assert bl._status == "INTERNAL TEST ['add', 2]"
160160

161161
def test_process_write(self, bl, mocker):
162162
bl._events = {}
@@ -165,9 +165,9 @@ def test_process_write(self, bl, mocker):
165165
def write_handler(pin, *values):
166166
bl._status = 'WRITE TEST{}'.format(*values)
167167

168-
with mocker.patch.object(bl, 'send', return_value=None):
169-
bl.process(bl.MSG_HW, 100, 200, ['vw', 4, 1, 2])
170-
assert bl._status == 'WRITE TEST[1, 2]'
168+
mocker.patch.object(bl, 'send', return_value=None)
169+
bl.process(bl.MSG_HW, 100, 200, ['vw', 4, 1, 2])
170+
assert bl._status == 'WRITE TEST[1, 2]'
171171

172172
def test_process_read(self, bl, mocker):
173173
bl._events = {}
@@ -176,6 +176,6 @@ def test_process_read(self, bl, mocker):
176176
def read_handler(pin):
177177
bl._status = 'READ TEST{}'.format(pin)
178178

179-
with mocker.patch.object(bl, 'send', return_value=None):
180-
bl.process(bl.MSG_HW, 100, 200, ['vr', 7])
181-
assert bl._status == 'READ TEST7'
179+
mocker.patch.object(bl, 'send', return_value=None)
180+
bl.process(bl.MSG_HW, 100, 200, ['vr', 7])
181+
assert bl._status == 'READ TEST7'

test/test_blynk_protocol.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_get_msg_id_defined(self, pb):
3232

3333
def test_pack_msg(self, pb):
3434
msg_type = 20
35-
args = ["test", 1234, 745, 'abcde']
35+
args = ['test', 1234, 745, 'abcde']
3636
result = pb._pack_msg(msg_type, *args)
3737
assert result == b'\x14\x00\x01\x00\x13test\x001234\x00745\x00abcde'
3838

@@ -47,7 +47,7 @@ def test_pack_msg_unicode(self, pb):
4747
pytest.skip('Python2 unicode compatibility issue')
4848

4949
msg_type = 20
50-
args = ["ёж"]
50+
args = ['ёж']
5151
result = pb._pack_msg(msg_type, *args)
5252
assert result == b'\x14\x00\x01\x00\x04\xd1\x91\xd0\xb6'
5353

0 commit comments

Comments
 (0)