tests: use responses in context processor tests (#86346)
This commit is contained in:
parent
e6c0555f78
commit
395f437539
|
@ -1,123 +1,126 @@
|
|||
import json
|
||||
import threading
|
||||
import time
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from django.core.cache import cache
|
||||
from django.test import override_settings
|
||||
from django.test.client import RequestFactory
|
||||
from django.utils import translation
|
||||
from httmock import HTTMock, urlmatch
|
||||
|
||||
from hobo.context_processors import theme_base, user_urls
|
||||
|
||||
TEMPLATE = 'Feeling lucky, punk?'
|
||||
TEMPLATE_PAGE2 = 'Response for page 2'
|
||||
|
||||
def test_theme_base(settings, rf):
|
||||
settings.THEME_SKELETON_URL = 'http://combo.example.com/_skeleton_/'
|
||||
seen_urls = []
|
||||
TEMPLATE = 'Feeling lucky, punk?'
|
||||
TEMPLATE_PAGE2 = 'Response for page 2'
|
||||
|
||||
@urlmatch(netloc=r'combo.example.com$')
|
||||
def combo_mock(url, request):
|
||||
seen_urls.append(url.geturl())
|
||||
status_code = 200
|
||||
content = TEMPLATE
|
||||
if 'page2' in url.query:
|
||||
content = TEMPLATE_PAGE2
|
||||
elif 'page1' in url.query:
|
||||
status_code = 500
|
||||
content = 'No template sorry'
|
||||
return {
|
||||
'status_code': status_code,
|
||||
'content': content,
|
||||
'headers': {
|
||||
'X-Combo-Skeleton-Pages': json.dumps(
|
||||
{'1': 'http://testserver/foo', '2': 'http://testserver/page1/page2/'}
|
||||
)
|
||||
},
|
||||
def wait_other_threads():
|
||||
time.sleep(0.1)
|
||||
for thread in threading.enumerate()[1:]:
|
||||
thread.join(timeout=10)
|
||||
assert len(threading.enumerate()) == 1
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def portal_mock():
|
||||
def callback(request):
|
||||
headers = {
|
||||
'X-Combo-Skeleton-Pages': json.dumps(
|
||||
{'1': 'http://testserver/foo', '2': 'http://testserver/page1/page2/'}
|
||||
)
|
||||
}
|
||||
if 'page2' in request.url:
|
||||
return 200, headers, TEMPLATE_PAGE2
|
||||
else:
|
||||
return 200, headers, TEMPLATE
|
||||
|
||||
cache.clear()
|
||||
|
||||
def check(context, value):
|
||||
assert context['theme_base']().source == value
|
||||
|
||||
with HTTMock(combo_mock), override_settings(INSTALLED_APPS=[]):
|
||||
context = theme_base(rf.get('/'))
|
||||
check(context, TEMPLATE)
|
||||
assert seen_urls[0] == 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F'
|
||||
for dummy in range(10):
|
||||
# wait for the other requests, made from a thread, to happen
|
||||
time.sleep(0.1)
|
||||
if len(seen_urls) == 4:
|
||||
break
|
||||
assert len(seen_urls) == 4
|
||||
# requested page + root + pages from X-Combo-Skeleton-Pages header
|
||||
seen_urls = []
|
||||
context = theme_base(rf.get('/'))
|
||||
check(context, TEMPLATE)
|
||||
assert len(seen_urls) == 0
|
||||
seen_urls = []
|
||||
context = theme_base(rf.get('/page1/page2/'))
|
||||
check(context, TEMPLATE_PAGE2)
|
||||
assert len(seen_urls) == 0
|
||||
seen_urls = []
|
||||
context = theme_base(rf.get('/page1/'))
|
||||
check(context, TEMPLATE)
|
||||
assert len(seen_urls) == 0
|
||||
context = theme_base(rf.get('/page1/page2/'))
|
||||
check(context, TEMPLATE_PAGE2)
|
||||
assert len(seen_urls) == 0
|
||||
|
||||
|
||||
def test_theme_base_language(settings, rf):
|
||||
settings.THEME_SKELETON_URL = 'http://combo.example.com/_skeleton_/'
|
||||
seen_urls = []
|
||||
|
||||
@urlmatch(netloc=r'combo.example.com$')
|
||||
def combo_mock(url, request):
|
||||
language = request.headers['Accept-Language']
|
||||
seen_urls.append((language, url.geturl()))
|
||||
status_code = 200
|
||||
assert language in ('en', 'fr'), 'invalid language'
|
||||
if language == 'en':
|
||||
content = 'Skeleton for English'
|
||||
elif language == 'fr':
|
||||
content = 'Skeleton for French'
|
||||
return {
|
||||
'status_code': status_code,
|
||||
'content': content,
|
||||
'headers': {'X-Combo-Skeleton-Pages': json.dumps({'1': 'http://testserver/foo'})},
|
||||
}
|
||||
|
||||
cache.clear()
|
||||
|
||||
with HTTMock(combo_mock), override_settings(
|
||||
INSTALLED_APPS=[], LANGUAGES=[('en', 'English'), ('fr', 'French')]
|
||||
with responses.RequestsMock() as rsps, override_settings(
|
||||
INSTALLED_APPS=[], THEME_SKELETON_URL='http://combo.example.com/_skeleton_/'
|
||||
):
|
||||
context = theme_base(rf.get('/'))
|
||||
assert context['theme_base']().source == 'Skeleton for English'
|
||||
for dummy in range(10):
|
||||
# wait for the other requests, made from a thread, to happen
|
||||
time.sleep(0.1)
|
||||
if len(seen_urls) == 5:
|
||||
break
|
||||
assert len(seen_urls) == 5
|
||||
assert ('en', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F') in seen_urls
|
||||
assert ('fr', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F') in seen_urls
|
||||
assert (
|
||||
'en',
|
||||
'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2Ffoo',
|
||||
) in seen_urls
|
||||
assert (
|
||||
'fr',
|
||||
'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2Ffoo',
|
||||
) in seen_urls
|
||||
rsps.add_callback(responses.GET, 'http://combo.example.com/_skeleton_/', callback=callback)
|
||||
yield rsps
|
||||
|
||||
assert theme_base(rf.get('/'))['theme_base']().source == 'Skeleton for English'
|
||||
|
||||
with translation.override('fr'):
|
||||
assert theme_base(rf.get('/'))['theme_base']().source == 'Skeleton for French'
|
||||
@pytest.fixture
|
||||
def theme_base_source(rf):
|
||||
def theme_base_source(path):
|
||||
context = theme_base(rf.get(path))
|
||||
return context['theme_base']().source
|
||||
|
||||
return theme_base_source
|
||||
|
||||
|
||||
def test_theme_base(portal_mock, theme_base_source):
|
||||
cache.clear()
|
||||
|
||||
calls = portal_mock.calls
|
||||
|
||||
assert theme_base_source('/') == TEMPLATE
|
||||
assert calls[0].request.url == 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F'
|
||||
wait_other_threads()
|
||||
|
||||
# requested page + root + pages from X-Combo-Skeleton-Pages header
|
||||
assert len(calls) == 4
|
||||
|
||||
calls.reset()
|
||||
|
||||
assert theme_base_source('/') == TEMPLATE
|
||||
assert not calls
|
||||
|
||||
assert theme_base_source('/page1/page2/') == TEMPLATE_PAGE2
|
||||
assert not calls
|
||||
|
||||
assert theme_base_source('/page1/') == TEMPLATE
|
||||
assert not calls
|
||||
|
||||
assert theme_base_source('/page1/page2/') == TEMPLATE_PAGE2
|
||||
assert not calls
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def portal_mock_language():
|
||||
def callback(request):
|
||||
language = request.headers['Accept-Language']
|
||||
headers = {'X-Combo-Skeleton-Pages': json.dumps({'1': 'http://testserver/foo'})}
|
||||
if language == 'en':
|
||||
return 200, headers, 'Skeleton for English'
|
||||
elif language == 'fr':
|
||||
return 200, headers, 'Skeleton for French'
|
||||
|
||||
with responses.RequestsMock() as rsps, override_settings(
|
||||
INSTALLED_APPS=[],
|
||||
LANGUAGES=[('en', 'English'), ('fr', 'French')],
|
||||
THEME_SKELETON_URL='http://combo.example.com/_skeleton_/',
|
||||
):
|
||||
rsps.add_callback(responses.GET, 'http://combo.example.com/_skeleton_/', callback=callback)
|
||||
yield rsps
|
||||
|
||||
|
||||
def test_theme_base_language(portal_mock_language, theme_base_source):
|
||||
cache.clear()
|
||||
|
||||
calls = portal_mock_language.calls
|
||||
|
||||
assert theme_base_source(path='/') == 'Skeleton for English'
|
||||
|
||||
wait_other_threads()
|
||||
|
||||
assert len(calls) == 5
|
||||
|
||||
language_and_urls = {(call.request.headers['accept-language'], call.request.url) for call in calls}
|
||||
assert {
|
||||
('en', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F'),
|
||||
('fr', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2F'),
|
||||
('en', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2Ffoo'),
|
||||
('fr', 'http://combo.example.com/_skeleton_/?source=http%3A%2F%2Ftestserver%2Ffoo'),
|
||||
} == language_and_urls
|
||||
|
||||
assert theme_base_source(path='/') == 'Skeleton for English'
|
||||
|
||||
with translation.override('fr'):
|
||||
assert theme_base_source(path='/') == 'Skeleton for French'
|
||||
|
||||
|
||||
class IdPRequestFactory(RequestFactory):
|
||||
|
|
Loading…
Reference in New Issue