cara/cara/tests/apps/calculator/test_webapp.py

145 lines
5 KiB
Python

from pathlib import Path
import pytest
import tornado.testing
import cara.apps.calculator
from cara.apps.calculator.report_generator import generate_permalink
_TIMEOUT = 20.
@pytest.fixture
def app():
return cara.apps.calculator.make_app()
async def test_homepage(http_server_client):
response = await http_server_client.fetch('/')
assert response.code == 200
async def test_calculator_form(http_server_client):
# Both with and without a trailing slash.
response = await http_server_client.fetch('/calculator')
assert response.code == 200
response = await http_server_client.fetch('/calculator/')
assert response.code == 200
async def test_user_guide(http_server_client):
resp = await http_server_client.fetch('/calculator/user-guide')
assert resp.code == 200
async def test_about(http_server_client):
resp = await http_server_client.fetch('/about')
assert resp.code == 200
async def test_404(http_server_client):
resp = await http_server_client.fetch('/doesnt-exist', raise_error=False)
assert resp.code == 404
class TestBasicApp(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
return cara.apps.calculator.make_app()
@tornado.testing.gen_test(timeout=_TIMEOUT)
def test_report(self):
requests = [
self.http_client.fetch(self.get_url('/calculator/baseline-model/result')),
# At the same time, request a non-report page (to check whether the report is blocking).
self.http_client.fetch(self.get_url('/calculator/')),
]
response = yield requests[0]
other_response = yield requests[1]
def end_time(resp):
return resp.start_time + resp.request_time
# The start time is before the other request,
# but the end time is after the other request (because it takes longer
# to process a report than a simple page).
assert response.start_time < other_response.start_time
assert end_time(response) > end_time(other_response)
self.assertEqual(response.code, 200)
assert 'CERN HSE' not in response.body.decode()
assert 'expected number of new cases is' in response.body.decode()
class TestCernApp(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
cern_theme = Path(cara.apps.calculator.__file__).parent / 'themes' / 'cern'
return cara.apps.calculator.make_app(theme_dir=cern_theme)
@tornado.testing.gen_test(timeout=_TIMEOUT)
def test_report(self):
response = yield self.http_client.fetch(self.get_url('/calculator/baseline-model/result'))
self.assertEqual(response.code, 200)
assert 'CERN HSE' in response.body.decode()
assert 'expected number of new cases is' in response.body.decode()
class TestOpenApp(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
return cara.apps.calculator.make_app(calculator_prefix="/mycalc")
@tornado.testing.gen_test(timeout=_TIMEOUT)
def test_report(self):
response = yield self.http_client.fetch(self.get_url('/mycalc/baseline-model/result'))
self.assertEqual(response.code, 200)
def test_calculator_404(self):
response = self.fetch('/calculator')
assert response.code == 404
async def test_permalink_urls(http_server_client, baseline_form):
base_url = 'proto://hostname/prefix'
permalink_data = generate_permalink(base_url, "/calculator", baseline_form)
expected = f'{base_url}/calculator?exposed_coffee_break_option={baseline_form.exposed_coffee_break_option}&'
assert permalink_data['link'].startswith(expected)
# We should get a 200 for the link.
response = await http_server_client.fetch(permalink_data['link'].replace(base_url, ''))
assert response.code == 200
# And a 302 for the QR url itself. The redirected URL should be the same as
# in the link.
assert permalink_data['shortened'].startswith(base_url)
response = await http_server_client.fetch(
permalink_data['shortened'].replace(base_url, ''),
max_redirects=0,
raise_error=False,
)
assert response.code == 302
assert response.headers['Location'] == permalink_data['link'].replace(base_url, '')
async def test_invalid_compressed_url(http_server_client, baseline_form):
response = await http_server_client.fetch(
'/_c/invalid-data',
max_redirects=0,
raise_error=False,
)
assert response.code == 400
class TestError500(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
class ProcessingErrorPage(cara.apps.calculator.BaseRequestHandler):
def get(self):
raise ValueError('some unexpected error')
app = cara.apps.calculator.make_app()
page = [
(r'/', ProcessingErrorPage),
]
return tornado.web.Application(page, **app.settings)
def test_500(self):
response = self.fetch('/')
assert response.code == 500
assert 'Unfortunately an error occurred when processing your request' in response.body.decode()