1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
# coding: utf8
from __future__ import unicode_literals
import unittest
import flask_api
from flask_api import exceptions
from flask_api.negotiation import BaseNegotiation, DefaultNegotiation
app = flask_api.FlaskAPI(__name__)
class JSON(object):
media_type = 'application/json'
class HTML(object):
media_type = 'application/html'
class URLEncodedForm(object):
media_type = 'application/x-www-form-urlencoded'
class TestRendererNegotiation(unittest.TestCase):
def test_select_renderer_client_preference(self):
negotiation = DefaultNegotiation()
renderers = [JSON, HTML]
headers = {'Accept': 'application/html'}
with app.test_request_context(headers=headers):
renderer, media_type = negotiation.select_renderer(renderers)
self.assertEqual(renderer, HTML)
self.assertEqual(str(media_type), 'application/html')
def test_select_renderer_no_accept_header(self):
negotiation = DefaultNegotiation()
renderers = [JSON, HTML]
with app.test_request_context():
renderer, media_type = negotiation.select_renderer(renderers)
self.assertEqual(renderer, JSON)
self.assertEqual(str(media_type), 'application/json')
def test_select_renderer_server_preference(self):
negotiation = DefaultNegotiation()
renderers = [JSON, HTML]
headers = {'Accept': '*/*'}
with app.test_request_context(headers=headers):
renderer, media_type = negotiation.select_renderer(renderers)
self.assertEqual(renderer, JSON)
self.assertEqual(str(media_type), 'application/json')
def test_select_renderer_failed(self):
negotiation = DefaultNegotiation()
renderers = [JSON, HTML]
headers = {'Accept': 'application/xml'}
with app.test_request_context(headers=headers):
with self.assertRaises(exceptions.NotAcceptable):
renderer, media_type = negotiation.select_renderer(renderers)
def test_renderer_negotiation_not_implemented(self):
negotiation = BaseNegotiation()
with self.assertRaises(NotImplementedError) as context:
negotiation.select_renderer([])
msg = str(context.exception)
expected = '`select_renderer()` method must be implemented for class "BaseNegotiation"'
self.assertEqual(msg, expected)
class TestParserNegotiation(unittest.TestCase):
def test_select_parser(self):
negotiation = DefaultNegotiation()
parsers = [JSON, URLEncodedForm]
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
with app.test_request_context(headers=headers):
renderer, media_type = negotiation.select_parser(parsers)
self.assertEqual(renderer, URLEncodedForm)
self.assertEqual(str(media_type), 'application/x-www-form-urlencoded')
def test_select_parser_failed(self):
negotiation = DefaultNegotiation()
parsers = [JSON, URLEncodedForm]
headers = {'Content-Type': 'application/xml'}
with app.test_request_context(headers=headers):
with self.assertRaises(exceptions.UnsupportedMediaType):
renderer, media_type = negotiation.select_parser(parsers)
def test_parser_negotiation_not_implemented(self):
negotiation = BaseNegotiation()
with self.assertRaises(NotImplementedError) as context:
negotiation.select_parser([])
msg = str(context.exception)
expected = '`select_parser()` method must be implemented for class "BaseNegotiation"'
self.assertEqual(msg, expected)
|