sanic/tests/test_cookies.py

192 lines
5.6 KiB
Python
Raw Normal View History

from datetime import datetime, timedelta
from http.cookies import SimpleCookie
2018-10-22 21:25:38 +01:00
from sanic.response import text
2017-01-25 09:53:39 +00:00
import pytest
from sanic.cookies import Cookie
# ------------------------------------------------------------ #
# GET
# ------------------------------------------------------------ #
2018-08-26 15:43:14 +01:00
def test_cookies(app):
@app.route('/')
def handler(request):
response = text('Cookies are: {}'.format(request.cookies['test']))
response.cookies['right_back'] = 'at you'
return response
2017-02-14 19:51:20 +00:00
request, response = app.test_client.get('/', cookies={"test": "working!"})
response_cookies = SimpleCookie()
response_cookies.load(response.headers.get('Set-Cookie', {}))
assert response.text == 'Cookies are: working!'
assert response_cookies['right_back'].value == 'at you'
2017-10-06 06:20:36 +01:00
@pytest.mark.parametrize("httponly,expected", [
(False, False),
(True, True),
])
2018-08-26 15:43:14 +01:00
def test_false_cookies_encoded(app, httponly, expected):
2017-10-06 06:20:36 +01:00
@app.route('/')
def handler(request):
response = text('hello cookies')
response.cookies['hello'] = 'world'
response.cookies['hello']['httponly'] = httponly
return text(response.cookies['hello'].encode('utf8'))
request, response = app.test_client.get('/')
assert ('HttpOnly' in response.text) == expected
@pytest.mark.parametrize("httponly,expected", [
(False, False),
(True, True),
])
2018-08-26 15:43:14 +01:00
def test_false_cookies(app, httponly, expected):
@app.route('/')
def handler(request):
2017-10-06 06:20:36 +01:00
response = text('hello cookies')
response.cookies['right_back'] = 'at you'
response.cookies['right_back']['httponly'] = httponly
return response
2017-02-14 19:51:20 +00:00
request, response = app.test_client.get('/')
response_cookies = SimpleCookie()
response_cookies.load(response.headers.get('Set-Cookie', {}))
2017-10-06 06:20:36 +01:00
assert ('HttpOnly' in response_cookies['right_back'].output()) == expected
2018-10-22 21:25:38 +01:00
2018-08-26 15:43:14 +01:00
def test_http2_cookies(app):
@app.route('/')
async def handler(request):
response = text('Cookies are: {}'.format(request.cookies['test']))
return response
headers = {'cookie': 'test=working!'}
2017-02-14 19:51:20 +00:00
request, response = app.test_client.get('/', headers=headers)
assert response.text == 'Cookies are: working!'
2018-10-22 21:25:38 +01:00
2018-08-26 15:43:14 +01:00
def test_cookie_options(app):
@app.route('/')
def handler(request):
response = text("OK")
response.cookies['test'] = 'at you'
response.cookies['test']['httponly'] = True
2018-10-22 21:25:38 +01:00
response.cookies['test']['expires'] = (datetime.now() +
timedelta(seconds=10))
return response
2017-02-14 19:51:20 +00:00
request, response = app.test_client.get('/')
response_cookies = SimpleCookie()
response_cookies.load(response.headers.get('Set-Cookie', {}))
assert response_cookies['test'].value == 'at you'
2018-10-22 21:25:38 +01:00
assert response_cookies['test']['httponly'] is True
2017-01-25 09:53:39 +00:00
2018-08-26 15:43:14 +01:00
def test_cookie_deletion(app):
2017-01-25 09:53:39 +00:00
@app.route('/')
def handler(request):
response = text("OK")
del response.cookies['i_want_to_die']
response.cookies['i_never_existed'] = 'testing'
del response.cookies['i_never_existed']
return response
2017-02-14 19:51:20 +00:00
request, response = app.test_client.get('/')
2017-01-25 09:53:39 +00:00
response_cookies = SimpleCookie()
response_cookies.load(response.headers.get('Set-Cookie', {}))
assert int(response_cookies['i_want_to_die']['max-age']) == 0
with pytest.raises(KeyError):
2018-10-22 21:25:38 +01:00
response.cookies['i_never_existed']
def test_cookie_reserved_cookie():
with pytest.raises(expected_exception=KeyError) as e:
Cookie("domain", "testdomain.com")
assert e.message == "Cookie name is a reserved word"
def test_cookie_illegal_key_format():
with pytest.raises(expected_exception=KeyError) as e:
Cookie("testå", "test")
assert e.message == "Cookie key contains illegal characters"
def test_cookie_set_unknown_property():
c = Cookie("test_cookie", "value")
with pytest.raises(expected_exception=KeyError) as e:
c["invalid"] = "value"
assert e.message == "Unknown cookie property"
def test_cookie_set_same_key(app):
cookies = {'test': 'wait'}
@app.get('/')
def handler(request):
response = text('pass')
response.cookies['test'] = 'modified'
response.cookies['test'] = 'pass'
return response
request, response = app.test_client.get('/', cookies=cookies)
assert response.status == 200
assert response.cookies['test'].value == 'pass'
@pytest.mark.parametrize('max_age', ['0', 30, '30'])
def test_cookie_max_age(app, max_age):
cookies = {'test': 'wait'}
@app.get('/')
def handler(request):
response = text('pass')
response.cookies['test'] = 'pass'
response.cookies['test']['max-age'] = max_age
return response
request, response = app.test_client.get('/', cookies=cookies)
assert response.status == 200
assert response.cookies['test'].value == 'pass'
assert response.cookies['test']['max-age'] == str(max_age)
@pytest.mark.parametrize('expires', [
datetime.now() + timedelta(seconds=60),
'Fri, 21-Dec-2018 15:30:00 GMT'
])
def test_cookie_expires(app, expires):
cookies = {'test': 'wait'}
@app.get('/')
def handler(request):
response = text('pass')
response.cookies['test'] = 'pass'
response.cookies['test']['expires'] = expires
return response
request, response = app.test_client.get('/', cookies=cookies)
assert response.status == 200
assert response.cookies['test'].value == 'pass'
if isinstance(expires, datetime):
expires = expires.strftime("%a, %d-%b-%Y %T GMT")
assert response.cookies['test']['expires'] == expires