From b65209db7bd63084af3f85dbcd336fe62bf14d2c Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Wed, 30 Dec 2020 03:03:03 +0100 Subject: [PATCH] Add tests --- pyproject.toml | 2 ++ tests/__init__.py | 0 tests/test_client.py | 81 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 pyproject.toml create mode 100644 tests/__init__.py create mode 100644 tests/test_client.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..21f57cf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.pytest.ini_options] +log_level = "INFO" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..40041ce --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,81 @@ +import pytest +import tempfile +import os +from flask_migrate import upgrade as db_upgrade +from io import BytesIO + +from fhost import app, db, url_for, File, URL + +@pytest.fixture +def client(): + with tempfile.TemporaryDirectory() as tmpdir: + app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{tmpdir}/db.sqlite" + app.config["FHOST_STORAGE_PATH"] = os.path.join(tmpdir, "up") + app.config["TESTING"] = True + + with app.test_client() as client: + with app.app_context(): + db_upgrade() + yield client + +def test_client(client): + payloads = [ + ({ "file" : (BytesIO(b"hello"), "hello.txt") }, 200, b"https://localhost/E.txt\n"), + ({ "file" : (BytesIO(b"hello"), "hello.ignorethis") }, 200, b"https://localhost/E.txt\n"), + ({ "file" : (BytesIO(b"bye"), "bye.truncatethis") }, 200, b"https://localhost/Q.truncate\n"), + ({ "file" : (BytesIO(b"hi"), "hi.tar.gz") }, 200, b"https://localhost/h.tar.gz\n"), + ({ "file" : (BytesIO(b"lea!"), "lea!") }, 200, b"https://localhost/d.txt\n"), + ({ "file" : (BytesIO(b"why?"), "balls", "application/x-dosexec") }, 415, None), + ({ "shorten" : "https://0x0.st" }, 200, b"https://localhost/E\n"), + ({ "shorten" : "https://localhost" }, 400, None), + ({}, 400, None), + ] + + for p, s, r in payloads: + rv = client.post("/", buffered=True, + content_type="multipart/form-data", + data=p) + assert rv.status_code == s + if r: + assert rv.data == r + + f = File.query.get(2) + f.removed = True + db.session.add(f) + db.session.commit() + + rq = [ + (200, [ + "/", + "robots.txt", + "E.txt", + "E.txt/test", + "E.txt/test.py", + "d.txt", + "h.tar.gz", + ]), + (302, [ + "E", + "E/test", + "E/test.bin", + ]), + (404, [ + "test.bin", + "test.bin/test", + "test.bin/test.py", + "test", + "test/test", + "test.bin/test.py", + "E.bin", + ]), + (451, [ + "Q.truncate", + ]), + ] + + for code, paths in rq: + for p in paths: + app.logger.info(f"GET {p}") + rv = client.get(p) + assert rv.status_code == code +