def test_request_stubs_internals(): ("HTTPrettyRequest is a BaseHTTPRequestHandler that replaces " "real socket file descriptors with in-memory ones") # Given a valid HTTP request header string headers = "\r\n".join([ 'POST /somewhere/?name=foo&age=bar HTTP/1.1', 'Accept-Encoding: identity', 'Host: github.com', 'Content-Type: application/json', 'Connection: close', 'User-Agent: Python-urllib/2.7', ]) # When I create a HTTPrettyRequest with an empty body request = HTTPrettyRequest(headers, body='') # Then it should have parsed the headers dict(request.headers).should.equal({ 'accept-encoding': 'identity', 'connection': 'close', 'content-type': 'application/json', 'host': 'github.com', 'user-agent': 'Python-urllib/2.7' }) # And the `rfile` should be a StringIO request.should.have.property('rfile').being.a('StringIO.StringIO') # And the `wfile` should be a StringIO request.should.have.property('wfile').being.a('StringIO.StringIO') # And the `method` should be available request.should.have.property('method').being.equal('POST')
def test_HTTPrettyRequest_queryparam(): """ A content-type of x-www-form-urlencoded with a valid queryparam body should return parsed content """ header = TEST_HEADER % {'content_type': 'application/x-www-form-urlencoded'} valid_queryparam = u"hello=world&this=isavalidquerystring" valid_results = {'hello': ['world'], 'this': ['isavalidquerystring']} request = HTTPrettyRequest(header, valid_queryparam) expect(request.parsed_body).to.equal(valid_results)
def test_has_request(): ("httpretty.has_request() correctly detects " "whether or not a request has been made") httpretty.reset() httpretty.has_request().should.be.false with patch('httpretty.httpretty.last_request', return_value=HTTPrettyRequest('')): httpretty.has_request().should.be.true
def test_request_parse_querystring(): ("HTTPrettyRequest#parse_querystring should parse unicode data") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create?name=Gabriel+Falcão HTTP/1.1', 'Content-Type: multipart/form-data', ]) # When I create a HTTPrettyRequest with an empty body request = HTTPrettyRequest(headers, body='') # Then it should have a parsed querystring request.querystring.should.equal({'name': ['Gabriel Falcão']})
def test_request_parse_body_when_it_is_text_json(): ("HTTPrettyRequest#parse_request_body recognizes the " "content-type `text/json` and parses it") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create HTTP/1.1', 'Content-Type: text/json', ]) # And a valid json body body = json.dumps({'name': 'Gabriel Falcão'}) # When I create a HTTPrettyRequest with that data request = HTTPrettyRequest(headers, body) # Then it should have a parsed body request.parsed_body.should.equal({'name': 'Gabriel Falcão'})
def test_request_string_representation(): ("HTTPrettyRequest should have a debug-friendly " "string representation") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create HTTP/1.1', 'Content-Type: JPEG-baby', ]) # And a valid urlencoded body body = "foobar:\nlalala" # When I create a HTTPrettyRequest with that data request = HTTPrettyRequest(headers, body) # Then its string representation should show the headers and the body str(request).should.equal('<HTTPrettyRequest("JPEG-baby", total_headers=1, body_length=14)>')
def test_request_parse_body_when_unrecognized(): ("HTTPrettyRequest#parse_request_body returns the value as " "is if the Content-Type is not recognized") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create HTTP/1.1', 'Content-Type: whatever', ]) # And a valid urlencoded body body = "foobar:\nlalala" # When I create a HTTPrettyRequest with that data request = HTTPrettyRequest(headers, body) # Then it should have a parsed body request.parsed_body.should.equal("foobar:\nlalala")
def test_request_string_representation(): ("HTTPrettyRequest should have a forward_and_trace-friendly " "string representation") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create HTTP/1.1', 'Content-Type: JPEG-baby', 'Host: blog.falcao.it' ]) # And a valid urlencoded body body = "foobar:\nlalala" # When I create a HTTPrettyRequest with that data request = HTTPrettyRequest(headers, body, sock=Mock(is_https=True)) # Then its string representation should show the headers and the body str(request).should.equal('<HTTPrettyRequest("POST", "https://blog.falcao.it/create", headers={\'Content-Type\': \'JPEG-baby\', \'Host\': \'blog.falcao.it\'}, body=14)>')
def test_request_parse_body_when_it_is_urlencoded(): ("HTTPrettyRequest#parse_request_body recognizes the " "content-type `application/x-www-form-urlencoded` and parses it") # Given a request string containing a unicode encoded querystring headers = "\r\n".join([ 'POST /create HTTP/1.1', 'Content-Type: application/x-www-form-urlencoded', ]) # And a valid urlencoded body body = "name=Gabriel+Falcão&age=25&projects=httpretty&projects=sure&projects=lettuce" # When I create a HTTPrettyRequest with that data request = HTTPrettyRequest(headers, body) # Then it should have a parsed body request.parsed_body.should.equal({ 'name': ['Gabriel Falcão'], 'age': ["25"], 'projects': ["httpretty", "sure", "lettuce"] })
def test_HTTPrettyRequest_arbitrarypost(): """ A non-handled content type request's post body should return the content unaltered """ header = TEST_HEADER % {'content_type': 'thisis/notarealcontenttype'} gibberish_body = "1234567890!@#$%^&*()" request = HTTPrettyRequest(header, gibberish_body) expect(request.parsed_body).to.equal(gibberish_body)
def test_HTTPrettyRequest_invalid_json_body(): """ A content-type of application/json with an invalid json body should return the content unaltered """ header = TEST_HEADER % {'content_type': 'application/json'} invalid_json = u"{'hello', 'world','thisstringdoesntstops}" request = HTTPrettyRequest(header, invalid_json) expect(request.parsed_body).to.equal(invalid_json)
def test_HTTPrettyRequest_json_body(): """ A content-type of application/json should parse a valid json body """ header = TEST_HEADER % {'content_type': 'application/json'} test_dict = {'hello': 'world'} request = HTTPrettyRequest(header, json.dumps(test_dict)) expect(request.parsed_body).to.equal(test_dict)