import pytest from .._util import LocalProtocolError from .. import _events from .._events import * def test_event_bundle(): class T(_events._EventBundle): _fields = ["a", "b"] _defaults = {"b": 1} def _validate(self): if self.a == 0: raise ValueError # basic construction and methods t = T(a=1, b=0) assert repr(t) == "T(a=1, b=0)" assert t == T(a=1, b=0) assert not (t == T(a=2, b=0)) assert not (t != T(a=1, b=0)) assert (t != T(a=2, b=0)) with pytest.raises(TypeError): hash(t) # check defaults t = T(a=10) assert t.a == 10 assert t.b == 1 # no positional args with pytest.raises(TypeError): T(1) with pytest.raises(TypeError): T(1, a=1, b=0) # unknown field with pytest.raises(TypeError): T(a=1, b=0, c=10) # missing required field with pytest.raises(TypeError) as exc: T(b=0) # make sure we error on the right missing kwarg assert 'kwarg a' in str(exc) # _validate is called with pytest.raises(ValueError): T(a=0, b=0) def test_events(): with pytest.raises(LocalProtocolError): # Missing Host: req = Request(method="GET", target="/", headers=[("a", "b")], http_version="1.1") # But this is okay (HTTP/1.0) req = Request(method="GET", target="/", headers=[("a", "b")], http_version="1.0") # fields are normalized assert req.method == b"GET" assert req.target == b"/" assert req.headers == [(b"a", b"b")] assert req.http_version == b"1.0" # This is also okay -- has a Host (with weird capitalization, which is ok) req = Request(method="GET", target="/", headers=[("a", "b"), ("hOSt", "example.com")], http_version="1.1") # we normalize header capitalization assert req.headers == [(b"a", b"b"), (b"host", b"example.com")] # Multiple host is bad too with pytest.raises(LocalProtocolError): req = Request(method="GET", target="/", headers=[("Host", "a"), ("Host", "a")], http_version="1.1") # Even for HTTP/1.0 with pytest.raises(LocalProtocolError): req = Request(method="GET", target="/", headers=[("Host", "a"), ("Host", "a")], http_version="1.0") # Header values are validated with pytest.raises(LocalProtocolError): req = Request(method="GET", target="/", headers=[("Host", "a"), ("Foo", " asd\x00")], http_version="1.0") ir = InformationalResponse(status_code=100, headers=[("Host", "a")]) assert ir.status_code == 100 assert ir.headers == [(b"host", b"a")] assert ir.http_version == b"1.1" with pytest.raises(LocalProtocolError): InformationalResponse(status_code=200, headers=[("Host", "a")]) resp = Response(status_code=204, headers=[], http_version="1.0") assert resp.status_code == 204 assert resp.headers == [] assert resp.http_version == b"1.0" with pytest.raises(LocalProtocolError): resp = Response(status_code=100, headers=[], http_version="1.0") with pytest.raises(LocalProtocolError): Response(status_code="100", headers=[], http_version="1.0") with pytest.raises(LocalProtocolError): InformationalResponse(status_code=b"100", headers=[], http_version="1.0") d = Data(data=b"asdf") assert d.data == b"asdf" eom = EndOfMessage() assert eom.headers == [] cc = ConnectionClosed() assert repr(cc) == "ConnectionClosed()"