Brian S. Stephan
be8a8dd35a
I'm going to be screwing around with this code in some future commits so it's better to be explicit
221 lines
8.9 KiB
Python
221 lines
8.9 KiB
Python
"""Test page requests."""
|
|
import re
|
|
from unittest.mock import patch
|
|
|
|
|
|
def test_page_that_exists(client):
|
|
"""Test that the app can serve a basic file at the index."""
|
|
response = client.get('/')
|
|
assert response.status_code == 200
|
|
assert b'<h1 id="test-index">test index</h1>' in response.data
|
|
|
|
|
|
def test_direct_file_that_exists(client):
|
|
"""Test that the app can serve a basic file at the index."""
|
|
response = client.get('/foo.txt')
|
|
assert response.status_code == 200
|
|
assert b'test file' in response.data
|
|
|
|
|
|
def test_page_that_doesnt_exist(client):
|
|
"""Test that the app returns 404 for nonsense requests and they use my error page."""
|
|
response = client.get('/ohuesthaoeusth')
|
|
assert response.status_code == 404
|
|
assert b'<b><tt>/ohuesthaoeusth</tt></b> does not seem to exist' in response.data
|
|
# test the contact email config
|
|
assert b'admin@example.com' in response.data
|
|
|
|
|
|
def test_files_outside_pages_do_not_get_served(client):
|
|
"""Test that page pathing doesn't break out of the instance/pages/ dir, and the error uses my error page."""
|
|
response = client.get('/../unreachable')
|
|
assert response.status_code == 400
|
|
assert b'You\'re doing something you\'re not supposed to. Stop it?' in response.data
|
|
|
|
|
|
def test_internal_server_error_serves_error_page(client):
|
|
"""Test that various exceptions serve up the 500 page."""
|
|
response = client.get('/actually-a-png')
|
|
assert response.status_code == 500
|
|
assert b'INTERNAL SERVER ERROR' in response.data
|
|
# test the contact email config
|
|
assert b'admin@example.com' in response.data
|
|
|
|
|
|
def test_oserror_is_500(client, app):
|
|
"""Test that an OSError raises as a 500."""
|
|
with app.test_request_context():
|
|
with patch('flask.current_app.open_instance_resource', side_effect=OSError):
|
|
response = client.get('/')
|
|
assert response.status_code == 500
|
|
assert b'INTERNAL SERVER ERROR' in response.data
|
|
|
|
|
|
def test_unsupported_file_type_is_500(client, app):
|
|
"""Test a coding condition mishap raises as a 500."""
|
|
with app.test_request_context():
|
|
with patch('incorporealcms.pages.request_path_to_instance_resource_path', return_value=('foo', 'bar')):
|
|
response = client.get('/')
|
|
assert response.status_code == 500
|
|
assert b'INTERNAL SERVER ERROR' in response.data
|
|
|
|
|
|
def test_weird_paths_do_not_get_served(client):
|
|
"""Test that we clean up requests as desired."""
|
|
response = client.get('/../../')
|
|
assert response.status_code == 400
|
|
|
|
|
|
def test_page_with_title_metadata(client):
|
|
"""Test that a page with title metadata has its title written."""
|
|
response = client.get('/')
|
|
assert response.status_code == 200
|
|
assert b'<title>Index - example.com</title>' in response.data
|
|
|
|
|
|
def test_page_without_title_metadata(client):
|
|
"""Test that a page without title metadata gets the default title."""
|
|
response = client.get('/no-title')
|
|
assert response.status_code == 200
|
|
assert b'<title>/no-title - example.com</title>' in response.data
|
|
|
|
|
|
def test_page_in_subdir_without_title_metadata(client):
|
|
"""Test that the title-less page display is as expected."""
|
|
response = client.get('/subdir//page-no-title')
|
|
assert response.status_code == 200
|
|
assert b'<title>/subdir/page-no-title - example.com</title>' in response.data
|
|
|
|
|
|
def test_page_with_card_metadata(client):
|
|
"""Test that a page with opengraph metadata."""
|
|
response = client.get('/more-metadata')
|
|
assert response.status_code == 200
|
|
assert b'<meta property="og:title" content="title for the page - example.com">' in response.data
|
|
assert b'<meta property="og:description" content="description of this page made even longer">' in response.data
|
|
assert b'<meta property="og:image" content="http://buh.com/test.img">' in response.data
|
|
|
|
|
|
def test_page_with_card_title_even_when_no_metadata(client):
|
|
"""Test that a page without metadata still has a card with the derived title."""
|
|
response = client.get('/no-title')
|
|
assert response.status_code == 200
|
|
assert b'<meta property="og:title" content="/no-title - example.com">' in response.data
|
|
assert b'<meta property="og:description"' not in response.data
|
|
assert b'<meta property="og:image"' not in response.data
|
|
|
|
|
|
def test_page_with_forced_empty_title_just_shows_suffix(client):
|
|
"""Test that if a page specifies a blank Title meta tag explicitly, only the suffix is used in the title."""
|
|
response = client.get('/forced-no-title')
|
|
assert response.status_code == 200
|
|
assert b'<title>example.com</title>' in response.data
|
|
|
|
|
|
def test_page_with_redirect_meta_url_redirects(client):
|
|
"""Test that if a page specifies a URL to redirect to, that the site serves up a 301."""
|
|
response = client.get('/redirect')
|
|
assert response.status_code == 301
|
|
assert response.location == 'http://www.google.com/'
|
|
|
|
|
|
def test_page_has_modified_timestamp(client):
|
|
"""Test that pages have modified timestamps in them."""
|
|
response = client.get('/')
|
|
assert response.status_code == 200
|
|
assert re.search(r'Last modified: ....-..-.. ..:..:.. ...', response.data.decode()) is not None
|
|
|
|
|
|
def test_that_page_request_redirects_to_directory(client):
|
|
"""Test that a request to /foo reirects to /foo/, if foo is a directory.
|
|
|
|
This might be useful in cases where a formerly page-only page has been
|
|
converted to a directory with subpages.
|
|
"""
|
|
response = client.get('/subdir')
|
|
assert response.status_code == 301
|
|
assert response.location == '/subdir/'
|
|
|
|
|
|
def test_that_request_to_symlink_redirects_markdown(client):
|
|
"""Test that a request to /foo redirects to /what-foo-points-at."""
|
|
response = client.get('/symlink-to-no-title')
|
|
assert response.status_code == 301
|
|
assert response.location == '/no-title'
|
|
|
|
|
|
def test_that_request_to_symlink_redirects_file(client):
|
|
"""Test that a request to /foo.txt redirects to /what-foo-points-at.txt."""
|
|
response = client.get('/symlink-to-foo.txt')
|
|
assert response.status_code == 301
|
|
assert response.location == '/foo.txt'
|
|
|
|
|
|
def test_that_request_to_symlink_redirects_directory(client):
|
|
"""Test that a request to /foo/ redirects to /what-foo-points-at/."""
|
|
response = client.get('/symlink-to-subdir/')
|
|
assert response.status_code == 301
|
|
assert response.location == '/subdir'
|
|
# sadly, this location also redirects
|
|
response = client.get('/subdir')
|
|
assert response.status_code == 301
|
|
assert response.location == '/subdir/'
|
|
# but we do get there
|
|
response = client.get('/subdir/')
|
|
assert response.status_code == 200
|
|
|
|
|
|
def test_that_request_to_symlink_redirects_subdirectory(client):
|
|
"""Test that a request to /foo/bar redirects to /what-foo-points-at/bar."""
|
|
response = client.get('/symlink-to-subdir/page-no-title')
|
|
assert response.status_code == 301
|
|
assert response.location == '/subdir/page-no-title'
|
|
response = client.get('/subdir/page-no-title')
|
|
assert response.status_code == 200
|
|
|
|
|
|
def test_that_dir_request_does_not_redirect(client):
|
|
"""Test that a request to /foo/ serves the index page, if foo is a directory."""
|
|
response = client.get('/subdir/')
|
|
assert response.status_code == 200
|
|
assert b'another page' in response.data
|
|
|
|
|
|
def test_setting_selected_style_includes_cookie(client):
|
|
"""Test that a request with style=foo sets the cookie and renders appropriately."""
|
|
response = client.get('/')
|
|
style_cookie = next((cookie for cookie in client.cookie_jar if cookie.name == 'user-style'), None)
|
|
assert style_cookie is None
|
|
|
|
response = client.get('/?style=light')
|
|
style_cookie = next((cookie for cookie in client.cookie_jar if cookie.name == 'user-style'), None)
|
|
assert response.status_code == 200
|
|
assert b'/static/css/light.css' in response.data
|
|
assert b'/static/css/dark.css' not in response.data
|
|
assert style_cookie.value == 'light'
|
|
|
|
response = client.get('/?style=dark')
|
|
style_cookie = next((cookie for cookie in client.cookie_jar if cookie.name == 'user-style'), None)
|
|
assert response.status_code == 200
|
|
assert b'/static/css/dark.css' in response.data
|
|
assert b'/static/css/light.css' not in response.data
|
|
assert style_cookie.value == 'dark'
|
|
|
|
|
|
def test_pages_can_supply_alternate_templates(client):
|
|
"""Test that pages can supply templates other than the default."""
|
|
response = client.get('/')
|
|
assert b'class="site-wrap site-wrap-normal-width"' in response.data
|
|
assert b'class="site-wrap site-wrap-double-width"' not in response.data
|
|
response = client.get('/custom-template')
|
|
assert b'class="site-wrap site-wrap-normal-width"' not in response.data
|
|
assert b'class="site-wrap site-wrap-double-width"' in response.data
|
|
|
|
|
|
def test_extra_footer_per_page(client):
|
|
"""Test that we don't include the extra-footer if there isn't one (or do if there is)."""
|
|
response = client.get('/')
|
|
assert b'<div class="extra-footer">' not in response.data
|
|
response = client.get('/index-but-with-footer')
|
|
assert b'<div class="extra-footer"><i>ooo <a href="a">a</a></i>' in response.data
|