Home | History | Annotate | Download | only in tests
      1 from paste.httpheaders import *
      2 import time
      3 
      4 def _test_generic(collection):
      5     assert 'bing' == VIA(collection)
      6     REFERER.update(collection,'internal:/some/path')
      7     assert 'internal:/some/path' == REFERER(collection)
      8     CACHE_CONTROL.update(collection,max_age=1234)
      9     CONTENT_DISPOSITION.update(collection,filename="bingles.txt")
     10     PRAGMA.update(collection,"test","multi",'valued="items"')
     11     assert 'public, max-age=1234' == CACHE_CONTROL(collection)
     12     assert 'attachment; filename="bingles.txt"' == \
     13             CONTENT_DISPOSITION(collection)
     14     assert 'test, multi, valued="items"' == PRAGMA(collection)
     15     VIA.delete(collection)
     16 
     17 
     18 def test_environ():
     19     collection = {'HTTP_VIA':'bing', 'wsgi.version': '1.0' }
     20     _test_generic(collection)
     21     assert collection == {'wsgi.version': '1.0',
     22       'HTTP_PRAGMA': 'test, multi, valued="items"',
     23       'HTTP_REFERER': 'internal:/some/path',
     24       'HTTP_CONTENT_DISPOSITION': 'attachment; filename="bingles.txt"',
     25       'HTTP_CACHE_CONTROL': 'public, max-age=1234'
     26     }
     27 
     28 def test_environ_cgi():
     29     environ = {'CONTENT_TYPE': 'text/plain', 'wsgi.version': '1.0',
     30                'HTTP_CONTENT_TYPE': 'ignored/invalid',
     31                'CONTENT_LENGTH': '200'}
     32     assert 'text/plain' == CONTENT_TYPE(environ)
     33     assert '200' == CONTENT_LENGTH(environ)
     34     CONTENT_TYPE.update(environ,'new/type')
     35     assert 'new/type' == CONTENT_TYPE(environ)
     36     CONTENT_TYPE.delete(environ)
     37     assert '' == CONTENT_TYPE(environ)
     38     assert 'ignored/invalid' == environ['HTTP_CONTENT_TYPE']
     39 
     40 def test_response_headers():
     41     collection = [('via', 'bing')]
     42     _test_generic(collection)
     43     normalize_headers(collection)
     44     assert collection == [
     45         ('Cache-Control', 'public, max-age=1234'),
     46         ('Pragma', 'test, multi, valued="items"'),
     47         ('Referer', 'internal:/some/path'),
     48         ('Content-Disposition', 'attachment; filename="bingles.txt"')
     49     ]
     50 
     51 def test_cache_control():
     52     assert 'public' == CACHE_CONTROL()
     53     assert 'public' == CACHE_CONTROL(public=True)
     54     assert 'private' == CACHE_CONTROL(private=True)
     55     assert 'no-cache' == CACHE_CONTROL(no_cache=True)
     56     assert 'private, no-store' == CACHE_CONTROL(private=True, no_store=True)
     57     assert 'public, max-age=60' == CACHE_CONTROL(max_age=60)
     58     assert 'public, max-age=86400' == \
     59             CACHE_CONTROL(max_age=CACHE_CONTROL.ONE_DAY)
     60     CACHE_CONTROL.extensions['community'] = str
     61     assert 'public, community="bingles"' == \
     62             CACHE_CONTROL(community="bingles")
     63     headers = []
     64     CACHE_CONTROL.apply(headers,max_age=60)
     65     assert 'public, max-age=60' == CACHE_CONTROL(headers)
     66     assert EXPIRES.parse(headers) > time.time()
     67     assert EXPIRES.parse(headers) < time.time() + 60
     68 
     69 def test_content_disposition():
     70     assert 'attachment' == CONTENT_DISPOSITION()
     71     assert 'attachment' == CONTENT_DISPOSITION(attachment=True)
     72     assert 'inline' == CONTENT_DISPOSITION(inline=True)
     73     assert 'inline; filename="test.txt"' == \
     74             CONTENT_DISPOSITION(inline=True, filename="test.txt")
     75     assert 'attachment; filename="test.txt"' == \
     76             CONTENT_DISPOSITION(filename="/some/path/test.txt")
     77     headers = []
     78     CONTENT_DISPOSITION.apply(headers,filename="test.txt")
     79     assert 'text/plain' == CONTENT_TYPE(headers)
     80     CONTENT_DISPOSITION.apply(headers,filename="test")
     81     assert 'text/plain' == CONTENT_TYPE(headers)
     82     CONTENT_DISPOSITION.apply(headers,filename="test.html")
     83     assert 'text/plain' == CONTENT_TYPE(headers)
     84     headers = [('Content-Type', 'application/octet-stream')]
     85     CONTENT_DISPOSITION.apply(headers,filename="test.txt")
     86     assert 'text/plain' == CONTENT_TYPE(headers)
     87     assert headers == [
     88       ('Content-Type', 'text/plain'),
     89       ('Content-Disposition', 'attachment; filename="test.txt"')
     90     ]
     91 
     92 def test_range():
     93     assert ('bytes',[(0,300)]) == RANGE.parse("bytes=0-300")
     94     assert ('bytes',[(0,300)]) == RANGE.parse("bytes   =  -300")
     95     assert ('bytes',[(0,None)]) == RANGE.parse("bytes=  -")
     96     assert ('bytes',[(0,None)]) == RANGE.parse("bytes=0   -   ")
     97     assert ('bytes',[(300,None)]) == RANGE.parse("   BYTES=300-")
     98     assert ('bytes',[(4,5),(6,7)]) == RANGE.parse(" Bytes = 4 - 5,6 - 07  ")
     99     assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
    100     assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
    101     assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
    102     assert None == RANGE.parse("")
    103     assert None == RANGE.parse("bytes=0,300")
    104     assert None == RANGE.parse("bytes=-7,5-")
    105 
    106 def test_copy():
    107     environ = {'HTTP_VIA':'bing', 'wsgi.version': '1.0' }
    108     response_headers = []
    109     VIA.update(response_headers,environ)
    110     assert response_headers == [('Via', 'bing')]
    111 
    112 def test_sorting():
    113     # verify the HTTP_HEADERS are set with their canonical form
    114     sample = [WWW_AUTHENTICATE, VIA, ACCEPT, DATE,
    115     ACCEPT_CHARSET, AGE, ALLOW, CACHE_CONTROL,
    116     CONTENT_ENCODING, ETAG, CONTENT_TYPE, FROM,
    117     EXPIRES, RANGE, UPGRADE, VARY, ALLOW]
    118     sample.sort()
    119     sample = [str(x) for x in sample]
    120     assert sample == [
    121      # general headers first
    122      'Cache-Control', 'Date', 'Upgrade', 'Via',
    123      # request headers next
    124      'Accept', 'Accept-Charset', 'From', 'Range',
    125      # response headers following
    126      'Age', 'ETag', 'Vary', 'WWW-Authenticate',
    127      # entity headers (/w expected duplicate)
    128      'Allow', 'Allow', 'Content-Encoding', 'Content-Type', 'Expires'
    129     ]
    130 
    131 def test_normalize():
    132     response_headers = [
    133        ('www-authenticate','Response AuthMessage'),
    134        ('unknown-header','Unknown Sorted Last'),
    135        ('Via','General Bingles'),
    136        ('aLLoW','Entity Allow Something'),
    137        ('ETAG','Response 34234'),
    138        ('expires','Entity An-Expiration-Date'),
    139        ('date','General A-Date')]
    140     normalize_headers(response_headers, strict=False)
    141     assert response_headers == [
    142      ('Date', 'General A-Date'),
    143      ('Via', 'General Bingles'),
    144      ('ETag', 'Response 34234'),
    145      ('WWW-Authenticate', 'Response AuthMessage'),
    146      ('Allow', 'Entity Allow Something'),
    147      ('Expires', 'Entity An-Expiration-Date'),
    148      ('Unknown-Header', 'Unknown Sorted Last')]
    149 
    150 def test_if_modified_since():
    151     from paste.httpexceptions import HTTPBadRequest
    152     date = 'Thu, 34 Jul 3119 29:34:18 GMT'
    153     try:
    154         x = IF_MODIFIED_SINCE.parse({'HTTP_IF_MODIFIED_SINCE': date,
    155                                      'wsgi.version': (1, 0)})
    156     except HTTPBadRequest:
    157         pass
    158     else:
    159         assert 0
    160