2018-07-12 12:13:44 +00:00
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
|
2018-10-02 18:06:34 +00:00
|
|
|
from starlette.testclient import TestClient
|
|
|
|
from starlette.staticfiles import StaticFile, StaticFiles
|
|
|
|
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
def test_staticfile(tmpdir):
|
|
|
|
path = os.path.join(tmpdir, "example.txt")
|
|
|
|
with open(path, "w") as file:
|
|
|
|
file.write("<file content>")
|
|
|
|
|
|
|
|
app = StaticFile(path=path)
|
|
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/")
|
|
|
|
assert response.status_code == 200
|
2018-07-12 12:47:23 +00:00
|
|
|
assert response.text == "<file content>"
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
2018-07-26 13:41:05 +00:00
|
|
|
def test_large_staticfile(tmpdir):
|
|
|
|
path = os.path.join(tmpdir, "example.txt")
|
|
|
|
content = "this is a lot of content" * 200
|
|
|
|
print("content len = ", len(content))
|
|
|
|
with open(path, "w") as file:
|
|
|
|
file.write(content)
|
|
|
|
|
|
|
|
app = StaticFile(path=path)
|
|
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert len(content) == len(response.text)
|
|
|
|
assert content == response.text
|
|
|
|
|
|
|
|
|
2018-07-12 12:13:44 +00:00
|
|
|
def test_staticfile_post(tmpdir):
|
|
|
|
path = os.path.join(tmpdir, "example.txt")
|
|
|
|
with open(path, "w") as file:
|
|
|
|
file.write("<file content>")
|
|
|
|
|
|
|
|
app = StaticFile(path=path)
|
|
|
|
client = TestClient(app)
|
|
|
|
response = client.post("/")
|
2018-08-30 13:42:39 +00:00
|
|
|
assert response.status_code == 405
|
2018-09-04 10:52:29 +00:00
|
|
|
assert response.text == "Method Not Allowed"
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_staticfile_with_directory_raises_error(tmpdir):
|
|
|
|
app = StaticFile(path=tmpdir)
|
|
|
|
client = TestClient(app)
|
|
|
|
with pytest.raises(RuntimeError) as exc:
|
2018-10-02 18:06:34 +00:00
|
|
|
client.get("/")
|
2018-07-12 12:47:23 +00:00
|
|
|
assert "is not a file" in str(exc)
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_staticfile_with_missing_file_raises_error(tmpdir):
|
2018-07-12 12:47:23 +00:00
|
|
|
path = os.path.join(tmpdir, "404.txt")
|
2018-07-12 12:13:44 +00:00
|
|
|
app = StaticFile(path=path)
|
|
|
|
client = TestClient(app)
|
|
|
|
with pytest.raises(RuntimeError) as exc:
|
2018-10-02 18:06:34 +00:00
|
|
|
client.get("/")
|
2018-07-12 12:47:23 +00:00
|
|
|
assert "does not exist" in str(exc)
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
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>"
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2018-09-04 10:52:29 +00:00
|
|
|
assert response.text == "Method Not Allowed"
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2018-09-04 10:52:29 +00:00
|
|
|
assert response.text == "Not Found"
|
2018-07-12 12:13:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2018-09-04 10:52:29 +00:00
|
|
|
assert response.text == "Not Found"
|
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)
|
|
|
|
client = TestClient(app)
|
|
|
|
with pytest.raises(RuntimeError) as exc:
|
2018-10-02 18:06:34 +00:00
|
|
|
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)
|
|
|
|
client = TestClient(app)
|
|
|
|
with pytest.raises(RuntimeError) as exc:
|
2018-10-02 18:06:34 +00:00
|
|
|
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
|
2018-10-02 18:06:34 +00:00
|
|
|
client.get("/")
|
2018-07-12 12:41:46 +00:00
|
|
|
assert app.config_checked
|
2018-10-02 18:06:34 +00:00
|
|
|
client.get("/")
|
2018-07-12 12:41:46 +00:00
|
|
|
assert app.config_checked
|
2018-07-12 15:29:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_staticfiles_prevents_breaking_out_of_directory(tmpdir):
|
2018-07-12 16:07:20 +00:00
|
|
|
directory = os.path.join(tmpdir, "foo")
|
2018-07-12 15:29:54 +00:00
|
|
|
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.
|
2018-10-09 14:47:51 +00:00
|
|
|
response = app({"type": "http", "method": "GET", "path": "/../example.txt"})
|
2018-07-12 15:29:54 +00:00
|
|
|
assert response.status_code == 404
|
2018-09-04 10:52:29 +00:00
|
|
|
assert response.body == b"Not Found"
|