starlette/tests/test_staticfiles.py

121 lines
3.7 KiB
Python
Raw Normal View History

import os
import pytest
from starlette.staticfiles import StaticFiles
from starlette.testclient import TestClient
def test_staticfiles(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
response = client.get("/example.txt")
assert response.status_code == 200
2018-07-12 12:47:23 +00:00
assert response.text == "<file content>"
def test_staticfiles_post(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
response = client.post("/example.txt")
2018-08-30 13:42:39 +00:00
assert response.status_code == 405
assert response.text == "Method Not Allowed"
def test_staticfiles_with_directory_returns_404(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
response = client.get("/")
assert response.status_code == 404
assert response.text == "Not Found"
def test_staticfiles_with_missing_file_returns_404(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
response = client.get("/404.txt")
assert response.status_code == 404
assert response.text == "Not Found"
2018-07-12 12:41:46 +00:00
def test_staticfiles_instantiated_with_missing_directory(tmpdir):
with pytest.raises(RuntimeError) as exc:
path = os.path.join(tmpdir, "no_such_directory")
app = StaticFiles(directory=path)
assert "does not exist" in str(exc)
2018-07-12 12:41:46 +00:00
def test_staticfiles_configured_with_missing_directory(tmpdir):
path = os.path.join(tmpdir, "no_such_directory")
app = StaticFiles(directory=path, check_dir=False)
2018-07-12 12:41:46 +00:00
client = TestClient(app)
with pytest.raises(RuntimeError) as exc:
client.get("/example.txt")
2018-07-12 12:47:23 +00:00
assert "does not exist" in str(exc)
2018-07-12 12:41:46 +00:00
def test_staticfiles_configured_with_file_instead_of_directory(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=path, check_dir=False)
2018-07-12 12:41:46 +00:00
client = TestClient(app)
with pytest.raises(RuntimeError) as exc:
client.get("/example.txt")
2018-07-12 12:47:23 +00:00
assert "is not a directory" in str(exc)
2018-07-12 12:41:46 +00:00
def test_staticfiles_config_check_occurs_only_once(tmpdir):
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
assert not app.config_checked
client.get("/")
2018-07-12 12:41:46 +00:00
assert app.config_checked
client.get("/")
2018-07-12 12:41:46 +00:00
assert app.config_checked
def test_staticfiles_prevents_breaking_out_of_directory(tmpdir):
2018-07-12 16:07:20 +00:00
directory = os.path.join(tmpdir, "foo")
os.mkdir(directory)
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("outside root dir")
app = StaticFiles(directory=directory)
# We can't test this with 'requests', so we call the app directly here.
response = app({"type": "http", "method": "GET", "path": "/../example.txt"})
assert response.status_code == 404
assert response.body == b"Not Found"
def test_staticfiles_never_read_file_for_head_method(tmpdir):
path = os.path.join(tmpdir, "example.txt")
with open(path, "w") as file:
file.write("<file content>")
app = StaticFiles(directory=tmpdir)
client = TestClient(app)
response = client.head("/example.txt")
assert response.status_code == 200
assert response.content == b""
assert response.headers["content-length"] == "14"