blob: bf951ebb271d8287b6bff4c68a9fa9322e486d40 [file]
from webob import Request
from webob.acceptparse import Accept, MIMEAccept, NilAccept, NoAccept, accept_property, AcceptLanguage, AcceptCharset
from nose.tools import eq_, assert_raises
def test_parse_accept_badq():
assert list(Accept.parse("value1; q=0.1.2")) == [('value1', 1)]
def test_init_accept_content_type():
accept = Accept('text/html')
assert accept._parsed == [('text/html', 1)]
def test_init_accept_accept_charset():
accept = AcceptCharset('iso-8859-5, unicode-1-1;q=0.8')
assert accept._parsed == [('iso-8859-5', 1),
('unicode-1-1', 0.80000000000000004),
('iso-8859-1', 1)]
def test_init_accept_accept_charset_with_iso_8859_1():
accept = Accept('iso-8859-1')
assert accept._parsed == [('iso-8859-1', 1)]
def test_init_accept_accept_charset_wildcard():
accept = Accept('*')
assert accept._parsed == [('*', 1)]
def test_init_accept_accept_language():
accept = AcceptLanguage('da, en-gb;q=0.8, en;q=0.7')
assert accept._parsed == [('da', 1),
('en-gb', 0.80000000000000004),
('en', 0.69999999999999996)]
def test_init_accept_invalid_value():
accept = AcceptLanguage('da, q, en-gb;q=0.8')
# The "q" value should not be there.
assert accept._parsed == [('da', 1),
('en-gb', 0.80000000000000004)]
def test_init_accept_invalid_q_value():
accept = AcceptLanguage('da, en-gb;q=foo')
# I can't get to cover line 40-41 (webob.acceptparse) as the regex
# will prevent from hitting these lines (aconrad)
assert accept._parsed == [('da', 1), ('en-gb', 1)]
def test_accept_repr():
accept = Accept('text/html')
assert repr(accept) == "<Accept('text/html')>"
def test_accept_str():
accept = Accept('text/html')
assert str(accept) == 'text/html'
def test_zero_quality():
assert Accept('bar, *;q=0').best_match(['foo']) is None
assert 'foo' not in Accept('*;q=0')
assert Accept('foo, *;q=0').first_match(['bar', 'foo']) == 'foo'
def test_accept_str_with_q_not_1():
value = 'text/html;q=0.5'
accept = Accept(value)
assert str(accept) == value
def test_accept_str_with_q_not_1_multiple():
value = 'text/html;q=0.5, foo/bar'
accept = Accept(value)
assert str(accept) == value
def test_accept_add_other_accept():
accept = Accept('text/html') + Accept('foo/bar')
assert str(accept) == 'text/html, foo/bar'
accept += Accept('bar/baz;q=0.5')
assert str(accept) == 'text/html, foo/bar, bar/baz;q=0.5'
def test_accept_add_other_list_of_tuples():
accept = Accept('text/html')
accept += [('foo/bar', 1)]
assert str(accept) == 'text/html, foo/bar'
accept += [('bar/baz', 0.5)]
assert str(accept) == 'text/html, foo/bar, bar/baz;q=0.5'
accept += ['she/bangs', 'the/house']
assert str(accept) == ('text/html, foo/bar, bar/baz;q=0.5, '
'she/bangs, the/house')
def test_accept_add_other_dict():
accept = Accept('text/html')
accept += {'foo/bar': 1}
assert str(accept) == 'text/html, foo/bar'
accept += {'bar/baz': 0.5}
assert str(accept) == 'text/html, foo/bar, bar/baz;q=0.5'
def test_accept_add_other_empty_str():
accept = Accept('text/html')
accept += ''
assert str(accept) == 'text/html'
def test_accept_with_no_value_add_other_str():
accept = Accept('')
accept += 'text/html'
assert str(accept) == 'text/html'
def test_contains():
accept = Accept('text/html')
assert 'text/html' in accept
def test_contains_not():
accept = Accept('text/html')
assert not 'foo/bar' in accept
def test_quality():
accept = Accept('text/html')
assert accept.quality('text/html') == 1
accept = Accept('text/html;q=0.5')
assert accept.quality('text/html') == 0.5
def test_quality_not_found():
accept = Accept('text/html')
assert accept.quality('foo/bar') is None
def test_first_match():
accept = Accept('text/html, foo/bar')
assert accept.first_match(['text/html', 'foo/bar']) == 'text/html'
assert accept.first_match(['foo/bar', 'text/html']) == 'foo/bar'
assert accept.first_match(['xxx/xxx', 'text/html']) == 'text/html'
assert accept.first_match(['xxx/xxx']) == 'xxx/xxx'
assert accept.first_match([None, 'text/html']) is None
assert accept.first_match(['text/html', None]) == 'text/html'
assert accept.first_match(['foo/bar', None]) == 'foo/bar'
assert_raises(ValueError, accept.first_match, [])
def test_best_match():
accept = Accept('text/html, foo/bar')
assert accept.best_match(['text/html', 'foo/bar']) == 'text/html'
assert accept.best_match(['foo/bar', 'text/html']) == 'foo/bar'
assert accept.best_match([('foo/bar', 0.5),
'text/html']) == 'text/html'
assert accept.best_match([('foo/bar', 0.5),
('text/html', 0.4)]) == 'foo/bar'
assert_raises(ValueError, accept.best_match, ['text/*'])
def test_best_match_with_one_lower_q():
accept = Accept('text/html, foo/bar;q=0.5')
assert accept.best_match(['text/html', 'foo/bar']) == 'text/html'
accept = Accept('text/html;q=0.5, foo/bar')
assert accept.best_match(['text/html', 'foo/bar']) == 'foo/bar'
def test_best_matches():
accept = Accept('text/html, foo/bar')
assert accept.best_matches() == ['text/html', 'foo/bar']
accept = Accept('text/html, foo/bar;q=0.5')
assert accept.best_matches() == ['text/html', 'foo/bar']
accept = Accept('text/html;q=0.5, foo/bar')
assert accept.best_matches() == ['foo/bar', 'text/html']
def test_best_matches_with_fallback():
accept = Accept('text/html, foo/bar')
assert accept.best_matches('xxx/yyy') == ['text/html',
'foo/bar',
'xxx/yyy']
accept = Accept('text/html;q=0.5, foo/bar')
assert accept.best_matches('xxx/yyy') == ['foo/bar',
'text/html',
'xxx/yyy']
assert accept.best_matches('foo/bar') == ['foo/bar']
assert accept.best_matches('text/html') == ['foo/bar', 'text/html']
def test_accept_match():
for mask in ['*', 'text/html', 'TEXT/HTML']:
assert 'text/html' in Accept(mask)
assert 'text/html' not in Accept('foo/bar')
def test_accept_match_lang():
for mask, lang in [
('*', 'da'),
('da', 'DA'),
('en', 'en-gb'),
('en-gb', 'en-gb'),
('en-gb', 'en'),
('en-gb', 'en_GB'),
]:
assert lang in AcceptLanguage(mask)
for mask, lang in [
('en-gb', 'en-us'),
('en-gb', 'fr-fr'),
('en-gb', 'fr'),
('en', 'fr-fr'),
]:
assert lang not in AcceptLanguage(mask)
# NilAccept tests
def test_nil():
nilaccept = NilAccept()
eq_(repr(nilaccept),
"<NilAccept: <class 'webob.acceptparse.Accept'>>"
)
assert not nilaccept
assert str(nilaccept) == ''
assert nilaccept.quality('dummy') == 0
assert nilaccept.best_matches() == []
assert nilaccept.best_matches('foo') == ['foo']
def test_nil_add():
nilaccept = NilAccept()
accept = Accept('text/html')
assert nilaccept + accept is accept
new_accept = nilaccept + nilaccept
assert isinstance(new_accept, accept.__class__)
assert new_accept.header_value == ''
new_accept = nilaccept + 'foo'
assert isinstance(new_accept, accept.__class__)
assert new_accept.header_value == 'foo'
def test_nil_radd():
nilaccept = NilAccept()
accept = Accept('text/html')
assert isinstance('foo' + nilaccept, accept.__class__)
assert ('foo' + nilaccept).header_value == 'foo'
# How to test ``if isinstance(item, self.MasterClass): return item``
# under NilAccept.__radd__ ??
def test_nil_radd_masterclass():
# Is this "reaching into" __radd__ legit?
nilaccept = NilAccept()
accept = Accept('text/html')
assert nilaccept.__radd__(accept) is accept
def test_nil_contains():
nilaccept = NilAccept()
assert 'anything' in nilaccept
def test_nil_first_match():
nilaccept = NilAccept()
# NilAccept.first_match always returns element 0 of the list
assert nilaccept.first_match(['dummy', '']) == 'dummy'
assert nilaccept.first_match(['', 'dummy']) == ''
def test_nil_best_match():
nilaccept = NilAccept()
assert nilaccept.best_match(['foo', 'bar']) == 'foo'
assert nilaccept.best_match([('foo', 1), ('bar', 0.5)]) == 'foo'
assert nilaccept.best_match([('foo', 0.5), ('bar', 1)]) == 'bar'
assert nilaccept.best_match([('foo', 0.5), 'bar']) == 'bar'
# default_match has no effect on NilAccept class
assert nilaccept.best_match([('foo', 0.5), 'bar'],
default_match=True) == 'bar'
assert nilaccept.best_match([('foo', 0.5), 'bar'],
default_match=False) == 'bar'
# NoAccept tests
def test_noaccept_contains():
assert 'text/plain' not in NoAccept()
# MIMEAccept tests
def test_mime_init():
mimeaccept = MIMEAccept('image/jpg')
assert mimeaccept._parsed == [('image/jpg', 1)]
mimeaccept = MIMEAccept('image/png, image/jpg;q=0.5')
assert mimeaccept._parsed == [('image/png', 1), ('image/jpg', 0.5)]
mimeaccept = MIMEAccept('image, image/jpg;q=0.5')
assert mimeaccept._parsed == [('image/jpg', 0.5)]
mimeaccept = MIMEAccept('*/*')
assert mimeaccept._parsed == [('*/*', 1)]
mimeaccept = MIMEAccept('*/png')
assert mimeaccept._parsed == []
mimeaccept = MIMEAccept('image/*')
assert mimeaccept._parsed == [('image/*', 1)]
def test_accept_html():
mimeaccept = MIMEAccept('image/jpg')
assert not mimeaccept.accept_html()
mimeaccept = MIMEAccept('image/jpg, text/html')
assert mimeaccept.accept_html()
def test_match():
mimeaccept = MIMEAccept('image/jpg')
assert mimeaccept._match('image/jpg', 'image/jpg')
assert mimeaccept._match('image/*', 'image/jpg')
assert mimeaccept._match('*/*', 'image/jpg')
assert not mimeaccept._match('text/html', 'image/jpg')
assert_raises(ValueError, mimeaccept._match, 'image/jpg', '*/*')
def test_accept_json():
mimeaccept = MIMEAccept('text/html, *; q=.2, */*; q=.2')
assert mimeaccept.best_match(['application/json']) == 'application/json'
# property tests
def test_accept_property_fget():
desc = accept_property('Accept-Charset', '14.2')
req = Request.blank('/', environ={'envkey': 'envval'})
desc.fset(req, 'val')
eq_(desc.fget(req).header_value, 'val')
def test_accept_property_fget_nil():
desc = accept_property('Accept-Charset', '14.2')
req = Request.blank('/')
eq_(type(desc.fget(req)), NilAccept)
def test_accept_property_fset():
desc = accept_property('Accept-Charset', '14.2')
req = Request.blank('/', environ={'envkey': 'envval'})
desc.fset(req, 'baz')
eq_(desc.fget(req).header_value, 'baz')
def test_accept_property_fset_acceptclass():
req = Request.blank('/', environ={'envkey': 'envval'})
req.accept_charset = ['utf-8', 'latin-11']
eq_(req.accept_charset.header_value, 'utf-8, latin-11, iso-8859-1')
def test_accept_property_fdel():
desc = accept_property('Accept-Charset', '14.2')
req = Request.blank('/', environ={'envkey': 'envval'})
desc.fset(req, 'val')
assert desc.fget(req).header_value == 'val'
desc.fdel(req)
eq_(type(desc.fget(req)), NilAccept)