1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-14 15:53:28 +01:00
pywb/tests/test_prefer_header.py
Ilya Kreymer 42b8c3a22b
merge: additional fixes after merge of ukwa/pywb and 2.2
rewrite: remove custom modifiers for now, use oe_ for non-import css embeds
bump version to 2.3.dev0
2019-09-03 18:26:09 -04:00

269 lines
10 KiB
Python

from .base_config_test import BaseConfigTest, fmod
from pywb.warcserver.index.cdxobject import CDXObject
import pytest
# ============================================================================
@pytest.fixture(params=[('mp_', 'mp_'),
('', 'mp_'),
('mp_', ''),
('', '')],
ids=['framed-mp',
'framed',
'non-framed-mp',
'non-frame'])
def fmod(request):
return request.param
# ============================================================================
class BasePreferTests(BaseConfigTest):
def get(self, url, param, *args, **kwargs):
app = self.testapp if param[0] else self.testapp_non_frame
return app.get(self.format(url, param[1], with_slash=kwargs.pop('with_slash', False)), *args, **kwargs)
def format(self, string, fmod, with_slash=False):
if with_slash and fmod:
fmod += '/'
return string.format(fmod)
def _assert_pref_headers(self, resp, pref):
assert resp.headers['Preference-Applied'] == pref
assert 'Prefer' in resp.headers['Vary']
def _assert_raw(self, resp):
self._assert_pref_headers(resp, 'raw')
assert '"/time-zones"' in resp.text, resp.text
assert 'wombat.js' not in resp.text
def _assert_banner_only(self, resp):
self._assert_pref_headers(resp, 'banner-only')
assert '"20140127171238"' in resp.text
assert 'WB Insert' in resp.text
assert 'wombat.js' not in resp.text
assert 'WBWombatInit' not in resp.text, resp.text
def _assert_rewritten(self, resp):
self._assert_pref_headers(resp, 'rewritten')
assert '"20140127171238"' in resp.text
assert 'WB Insert' in resp.text
assert 'wombat.js' in resp.text
assert 'WBWombatInit' in resp.text, resp.text
# ============================================================================
class TestPreferWithRedirects(BasePreferTests):
@classmethod
def setup_class(cls):
super(TestPreferWithRedirects, cls).setup_class('config_test_redirect_classic.yaml')
def _assert_rewritten(self, resp, fmod):
super(TestPreferWithRedirects, self)._assert_rewritten(resp)
self.format('/20140127171238{0}/http://www.iana.org/time-zones"', fmod[0]) in resp.text
def _assert_redir_to_raw(self, resp):
self._assert_pref_headers(resp, 'raw')
assert resp.location.endswith('/pywb/20140127171238id_/http://www.iana.org/')
resp = resp.follow()
self._assert_raw(resp)
def _assert_redir_to_banner_only(self, resp):
self._assert_pref_headers(resp, 'banner-only')
assert resp.location.endswith('/pywb/20140127171238bn_/http://www.iana.org/')
resp = resp.follow()
self._assert_banner_only(resp)
def _assert_redir_to_rewritten(self, resp, fmod):
self._assert_pref_headers(resp, 'rewritten')
assert resp.location.endswith(self.format('/pywb/20140127171238{0}/http://www.iana.org/', fmod[0]))
resp = resp.follow()
self._assert_rewritten(resp, fmod)
def test_prefer_redir_timegate_raw(self, fmod):
headers = {'Prefer': 'raw'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=307)
self._assert_redir_to_raw(resp)
def test_prefer_redir_timegate_banner_only(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=307)
self._assert_redir_to_banner_only(resp)
def test_prefer_redir_timegate_rewritten(self, fmod):
headers = {'Prefer': 'rewritten'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=307)
self._assert_redir_to_rewritten(resp, fmod)
def test_prefer_redir_memento_to_raw(self, fmod):
headers = {'Prefer': 'raw'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=307)
self._assert_redir_to_raw(resp)
def test_prefer_redir_memento_to_banner_only(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=307)
self._assert_redir_to_banner_only(resp)
def test_prefer_redir_memento_redir_to_banner_only_diff_mod(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/20140127171238js_/http://www.iana.org/', fmod, headers=headers, status=307)
self._assert_redir_to_banner_only(resp)
def test_prefer_redir_memento_redir_to_rewritten_diff_mod(self, fmod):
headers = {'Prefer': 'rewritten'}
resp = self.get('/pywb/20140127171238js_/http://www.iana.org/', fmod, headers=headers, status=307)
self._assert_redir_to_rewritten(resp, fmod)
def test_prefer_redir_memento_rewritten_matches_or_redir(self, fmod):
headers = {'Prefer': 'rewritten'}
url = '/pywb/20140127171238{0}/http://www.iana.org/'
# if framed mode and mp_, or non-framed mode and blank mod, already at canonical url
# no redirect
if fmod[0] == fmod[1]:
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_rewritten(resp, fmod)
# otherwise, if framed and blank mod, or non-framed and mp_ mod, redirect to canonical url
else:
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=307)
self._assert_redir_to_rewritten(resp, fmod)
def test_prefer_redir_memento_matches_raw(self):
headers = {'Prefer': 'raw'}
resp = self.testapp.get('/pywb/20140127171238id_/http://www.iana.org/', headers=headers, status=200)
self._assert_raw(resp)
def test_prefer_redir_memento_matches_banner_only(self):
headers = {'Prefer': 'banner-only'}
resp = self.testapp.get('/pywb/20140127171238bn_/http://www.iana.org/', headers=headers, status=200)
self._assert_banner_only(resp)
def test_prefer_redir_invalid(self, fmod):
headers = {'Prefer': 'unknown'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=400)
# ============================================================================
class TestPreferWithNoRedirects(BasePreferTests):
@classmethod
def setup_class(cls):
super(TestPreferWithNoRedirects, cls).setup_class('config_test.yaml',
custom_config={'enable_prefer': True})
def _assert_raw(self, resp):
super(TestPreferWithNoRedirects, self)._assert_raw(resp)
assert resp.headers['Content-Location'].endswith('/pywb/20140127171238id_/http://www.iana.org/')
def _assert_rewritten(self, resp, fmod):
super(TestPreferWithNoRedirects, self)._assert_rewritten(resp)
assert resp.headers['Content-Location'].endswith(self.format('/pywb/20140127171238{0}/http://www.iana.org/', fmod[0]))
def _assert_banner_only(self, resp):
super(TestPreferWithNoRedirects, self)._assert_banner_only(resp)
assert resp.headers['Content-Location'].endswith('/pywb/20140127171238bn_/http://www.iana.org/')
def test_prefer_timegate_raw(self, fmod):
headers = {'Prefer': 'raw'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=200)
assert '"/time-zones"' in resp.text
self._assert_raw(resp)
def test_prefer_timegate_banner_only(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=200)
assert '"/time-zones"' in resp.text
self._assert_banner_only(resp)
def test_prefer_timegate_rewritten(self, fmod):
headers = {'Prefer': 'rewritten'}
resp = self.get('/pywb/{0}http://www.iana.org/', fmod, with_slash=True, headers=headers, status=200)
assert self.format('/pywb/{0}http://www.iana.org/time-zones"', fmod[0], with_slash=True) in resp.text
self._assert_rewritten(resp, fmod)
def test_prefer_memento_raw(self, fmod):
headers = {'Prefer': 'raw'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_raw(resp)
def test_prefer_memento_banner_only(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_banner_only(resp)
def test_prefer_memento_rewritten(self, fmod):
headers = {'Prefer': 'rewritten'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=200)
assert self.format('/pywb/20140127171238{0}/http://www.iana.org/time-zones"', fmod[0]) in resp.text
self._assert_rewritten(resp, fmod)
def test_prefer_memento_raw_id_mod(self):
headers = {'Prefer': 'raw'}
resp = self.testapp.get('/pywb/20140127171238id_/http://www.iana.org/', headers=headers, status=200)
self._assert_raw(resp)
def test_prefer_memento_rewritten_from_id_mod(self, fmod):
headers = {'Prefer': 'rewritten'}
resp = self.get('/pywb/20140127171238id_/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_rewritten(resp, fmod)
def test_prefer_memento_banner_only_no_mod(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/20140127171238/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_banner_only(resp)
def test_prefer_memento_rewritten_diff_mod(self, fmod):
headers = {'Prefer': 'raw'}
resp = self.get('/pywb/20140127171238js_/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_raw(resp)
def test_prefer_memento_banner_only_diff_mod(self, fmod):
headers = {'Prefer': 'banner-only'}
resp = self.get('/pywb/20140127171238js_/http://www.iana.org/', fmod, headers=headers, status=200)
self._assert_banner_only(resp)
def test_prefer_invalid(self, fmod):
headers = {'Prefer': 'unknown'}
resp = self.get('/pywb/20140127171238{0}/http://www.iana.org/', fmod, headers=headers, status=400)