Skip to content

Commit 176a94f

Browse files
committed
Add basic tests
1 parent 43017e3 commit 176a94f

File tree

6 files changed

+186
-0
lines changed

6 files changed

+186
-0
lines changed

.github/workflows/test.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Run Tests
2+
3+
on: [pull_request, push]
4+
5+
jobs:
6+
test:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: Dump GitHub context
10+
env:
11+
GITHUB_CONTEXT: ${{ toJson(github) }}
12+
run: echo "$GITHUB_CONTEXT"
13+
- name: Set up Python 3.6
14+
uses: actions/setup-python@v1
15+
with:
16+
python-version: 3.6
17+
- name: Versions
18+
run: |
19+
python3 --version
20+
- name: Checkout Current Repo
21+
uses: actions/checkout@v1
22+
with:
23+
submodules: true
24+
- name: Install pytest
25+
run: pip install pytest
26+
- name: Install locally
27+
run: pip install .
28+
- name: Run tests
29+
run: pytest

tests/header_test.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from unittest import mock
2+
import mocket
3+
import json
4+
import adafruit_requests
5+
6+
ip = "1.2.3.4"
7+
host = "httpbin.org"
8+
response_headers = b"HTTP/1.0 200 OK\r\nContent-Length: 0\r\n\r\n"
9+
10+
def test_json():
11+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip, 80)),)
12+
sock = mocket.Mocket(response_headers)
13+
mocket.socket.return_value = sock
14+
sent = []
15+
sock.send.side_effect = sent.append
16+
17+
adafruit_requests.set_socket(mocket, mocket.interface)
18+
headers = {"user-agent": "blinka/1.0.0"}
19+
r = adafruit_requests.get("http://" + host + "/get", headers=headers)
20+
21+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
22+
sent = b"".join(sent).lower()
23+
assert b"user-agent: blinka/1.0.0\r\n" in sent
24+
# The current implementation sends two user agents. Fix it, and uncomment below.
25+
# assert sent.count(b"user-agent:") == 1

tests/mocket.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from unittest import mock
2+
3+
SOCK_STREAM = 0
4+
5+
getaddrinfo = mock.Mock()
6+
socket = mock.Mock()
7+
set_interface = mock.Mock()
8+
9+
interface = mock.MagicMock()
10+
11+
class Mocket:
12+
def __init__(self, response):
13+
self.settimeout = mock.Mock()
14+
self.close = mock.Mock()
15+
self.connect = mock.Mock()
16+
self.send = mock.Mock()
17+
self.readline = mock.Mock(side_effect=self._readline)
18+
self.recv = mock.Mock(side_effect=self._recv)
19+
self._response = response
20+
self._position = 0
21+
22+
def _readline(self):
23+
i = self._response.find(b"\r\n", self._position)
24+
r = self._response[self._position:i+2]
25+
self._position = i + 2
26+
return r
27+
28+
def _recv(self, count):
29+
end = self._position + count
30+
r = self._response[self._position:end]
31+
self._position = end
32+
return r

tests/parse_test.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from unittest import mock
2+
import mocket
3+
import json
4+
import adafruit_requests
5+
6+
ip = "1.2.3.4"
7+
host = "httpbin.org"
8+
response = {"Date": "July 25, 2019"}
9+
encoded = json.dumps(response).encode("utf-8")
10+
headers = "HTTP/1.0 200 OK\r\nContent-Length: {}\r\n\r\n".format(len(encoded)).encode("utf-8")
11+
12+
def test_json():
13+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip, 80)),)
14+
sock = mocket.Mocket(headers + encoded)
15+
mocket.socket.return_value = sock
16+
17+
adafruit_requests.set_socket(mocket, mocket.interface)
18+
r = adafruit_requests.get("http://" + host + "/get")
19+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
20+
assert r.json() == response

tests/post_test.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from unittest import mock
2+
import mocket
3+
import json
4+
import adafruit_requests
5+
6+
ip = "1.2.3.4"
7+
host = "httpbin.org"
8+
response = {}
9+
encoded = json.dumps(response).encode("utf-8")
10+
headers = "HTTP/1.0 200 OK\r\nContent-Length: {}\r\n\r\n".format(len(encoded)).encode("utf-8")
11+
12+
def test_method():
13+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip, 80)),)
14+
sock = mocket.Mocket(headers + encoded)
15+
mocket.socket.return_value = sock
16+
17+
adafruit_requests.set_socket(mocket, mocket.interface)
18+
r = adafruit_requests.post("http://" + host + "/post")
19+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
20+
sock.send.assert_has_calls([mock.call(b'POST /post HTTP/1.0\r\n'),
21+
mock.call(b'Host: httpbin.org\r\n')])
22+
23+
def test_string():
24+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip, 80)),)
25+
sock = mocket.Mocket(headers + encoded)
26+
mocket.socket.return_value = sock
27+
28+
adafruit_requests.set_socket(mocket, mocket.interface)
29+
data = "31F"
30+
r = adafruit_requests.post("http://" + host + "/post", data=data)
31+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
32+
sock.send.assert_called_with(b'31F')
33+
34+
def test_json():
35+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip, 80)),)
36+
sock = mocket.Mocket(headers + encoded)
37+
mocket.socket.return_value = sock
38+
39+
adafruit_requests.set_socket(mocket, mocket.interface)
40+
json_data = {"Date": "July 25, 2019"}
41+
r = adafruit_requests.post("http://" + host + "/post", json=json_data)
42+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
43+
sock.send.assert_called_with(b'{"Date": "July 25, 2019"}')

tests/protocol_test.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from unittest import mock
2+
import mocket
3+
import adafruit_requests
4+
5+
ip = "1.2.3.4"
6+
host = "wifitest.adafruit.com"
7+
path = "/testwifi/index.html"
8+
text = b"This is a test of Adafruit WiFi!\r\nIf you can read this, its working :)"
9+
response = b"HTTP/1.0 200 OK\r\nContent-Length: 70\r\n\r\n" + text
10+
11+
def test_get_https_text():
12+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip,80)),)
13+
sock = mocket.Mocket(response)
14+
mocket.socket.return_value = sock
15+
16+
adafruit_requests.set_socket(mocket, mocket.interface)
17+
r = adafruit_requests.get("https://" + host + path)
18+
19+
sock.connect.assert_called_once_with((host, 443), mocket.interface.TLS_MODE)
20+
sock.send.assert_has_calls([mock.call(b'GET /testwifi/index.html HTTP/1.0\r\n'),
21+
mock.call(b'Host: wifitest.adafruit.com\r\n')])
22+
assert r.text == str(text, "utf-8")
23+
24+
def test_get_http_text():
25+
mocket.getaddrinfo.return_value = ((None, None, None, None, (ip,80)),)
26+
sock = mocket.Mocket(response)
27+
mocket.socket.return_value = sock
28+
29+
adafruit_requests.set_socket(mocket, mocket.interface)
30+
r = adafruit_requests.get("http://" + host + path)
31+
32+
sock.connect.assert_called_once_with((ip, 80), mocket.interface.TCP_MODE)
33+
sock.send.assert_has_calls([mock.call(b'GET /testwifi/index.html HTTP/1.0\r\n'),
34+
mock.call(b'Host: wifitest.adafruit.com\r\n')])
35+
assert r.text == str(text, "utf-8")
36+
37+
# Add a chunked response test when we support HTTP 1.1

0 commit comments

Comments
 (0)