def test_status_raises_not_enough_data(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.stub() ) with pytest.raises(NotEnoughDataError): p.status()
def test_body_transitions_to_done_on_empty_body(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.Mock(return_value=b'body value'), start=States.Body ) p.body() assert p.state == States.Done
def test_header_raises_on_bad_format(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.stub(), start=States.Header ) p.buffer = b'\n' with pytest.raises(ParseError): p.header()
def test_empty_header_transitions_to_body(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.stub(), start=States.Header ) p.buffer = b'' p.header() assert p.state == States.Body
def test_status_transitions_to_header_state(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.Mock(return_value={'status': 'status success'}), header_parser=mocker.stub(), body_parser=mocker.stub() ) p.buffer = b'left\r\nright' p.status() assert p.result['status'] == 'status success' assert p.state == States.Header
def test_header_writes_value(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.Mock(return_value=('header key', 'header value')), body_parser=mocker.stub(), start=States.Header ) p.buffer = b'header key: header value\r\n\r\nright' p.header() assert p.result['headers']['header key'] == 'header value' assert p.state == States.Header
def test_parse(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.Mock(return_value={'status': 'status value'}), header_parser=mocker.Mock(return_value=('header key', 'header value')), body_parser=mocker.Mock(return_value=b'body value'), ) result = p.parse(b'status line\r\nheader lines\r\nContent-length: 10\r\n\r\nbody value') assert result['status'] == 'status value' assert result['headers']['header key'] == 'header value' assert result['body'] == b'body value' assert p.state == States.Done
def test_body_too_much_data_and_transitions_to_done(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.Mock(side_effect=TooMuchDataError), start=States.Body ) p.buffer = b'body value' p.result['headers']['Content-length'] = ContentLengthValue(length=1) with pytest.raises(TooMuchDataError): p.body() assert p.state == States.Done
def test_body_saves_value_and_transitions_to_done(delimiter, mocker): p = Parser( delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.Mock(return_value=b'body value'), start=States.Body ) p.buffer = b'body value' p.result['headers']['Content-length'] = ContentLengthValue(length=len(p.buffer)) p.body() assert p.result['body'] == b'body value' assert p.state == States.Done
def test_default_state(delimiter, mocker): p = Parser(delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.stub()) assert p.state == States.Status
def test_default_result(delimiter, mocker): p = Parser(delimiter=delimiter, status_parser=mocker.stub(), header_parser=mocker.stub(), body_parser=mocker.stub()) assert p.result == {'headers': {}, 'body': b''}