import inspect import os import pytest from sanic.blueprints import Blueprint @pytest.fixture(scope="module") def static_file_directory(): """The static directory to serve""" current_file = inspect.getfile(inspect.currentframe()) current_directory = os.path.dirname(os.path.abspath(current_file)) static_directory = os.path.join(current_directory, "static") return static_directory def get_file_path(static_file_directory, file_name): return os.path.join(static_file_directory, file_name) def get_file_content(static_file_directory, file_name): """The content of the static file to check""" with open(get_file_path(static_file_directory, file_name), "rb") as file: return file.read() @pytest.mark.parametrize( "file_name", ["test.file", "decode me.txt", "python.png"] ) def test_static_file(app, static_file_directory, file_name): app.static( "/testing.file", get_file_path(static_file_directory, file_name) ) app.static( "/testing2.file", get_file_path(static_file_directory, file_name), name="testing_file", ) uri = app.url_for("static") uri2 = app.url_for("static", filename="any") uri3 = app.url_for("static", name="static", filename="any") assert uri == "/testing.file" assert uri == uri2 assert uri2 == uri3 request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static("/testing.file", get_file_path(static_file_directory, file_name)) bp.static( "/testing2.file", get_file_path(static_file_directory, file_name), name="testing_file", ) app.blueprint(bp) uri = app.url_for("static", name="test_bp_static.static") uri2 = app.url_for("static", name="test_bp_static.static", filename="any") uri3 = app.url_for("test_bp_static.static") uri4 = app.url_for("test_bp_static.static", name="any") uri5 = app.url_for("test_bp_static.static", filename="any") uri6 = app.url_for("test_bp_static.static", name="any", filename="any") assert uri == "/bp/testing.file" assert uri == uri2 assert uri2 == uri3 assert uri3 == uri4 assert uri4 == uri5 assert uri5 == uri6 request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) # test for other parameters uri = app.url_for("static", _external=True, _server="http://localhost") assert uri == "http://localhost/testing.file" uri = app.url_for( "static", name="test_bp_static.static", _external=True, _server="http://localhost", ) assert uri == "http://localhost/bp/testing.file" # test for defined name uri = app.url_for("static", name="testing_file") assert uri == "/testing2.file" request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) uri = app.url_for("static", name="test_bp_static.testing_file") assert uri == "/bp/testing2.file" assert uri == app.url_for( "static", name="test_bp_static.testing_file", filename="any" ) request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) @pytest.mark.parametrize("base_uri", ["/static", "", "/dir"]) def test_static_directory(app, file_name, base_uri, static_file_directory): app.static(base_uri, static_file_directory) base_uri2 = base_uri + "/2" app.static(base_uri2, static_file_directory, name="uploads") uri = app.url_for("static", name="static", filename=file_name) assert uri == "{}/{}".format(base_uri, file_name) request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) uri2 = app.url_for("static", name="static", filename="/" + file_name) uri3 = app.url_for("static", filename=file_name) uri4 = app.url_for("static", filename="/" + file_name) uri5 = app.url_for("static", name="uploads", filename=file_name) uri6 = app.url_for("static", name="uploads", filename="/" + file_name) assert uri == uri2 assert uri2 == uri3 assert uri3 == uri4 assert uri5 == "{}/{}".format(base_uri2, file_name) assert uri5 == uri6 bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static(base_uri, static_file_directory) bp.static(base_uri2, static_file_directory, name="uploads") app.blueprint(bp) uri = app.url_for( "static", name="test_bp_static.static", filename=file_name ) uri2 = app.url_for( "static", name="test_bp_static.static", filename="/" + file_name ) uri4 = app.url_for( "static", name="test_bp_static.uploads", filename=file_name ) uri5 = app.url_for( "static", name="test_bp_static.uploads", filename="/" + file_name ) assert uri == "/bp{}/{}".format(base_uri, file_name) assert uri == uri2 assert uri4 == "/bp{}/{}".format(base_uri2, file_name) assert uri4 == uri5 request, response = app.test_client.get(uri) assert response.status == 200 assert response.body == get_file_content(static_file_directory, file_name) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_head_request(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.head(uri) assert response.status == 200 assert "Accept-Ranges" in response.headers assert "Content-Length" in response.headers assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) request, response = app.test_client.head(uri) assert response.status == 200 assert "Accept-Ranges" in response.headers assert "Content-Length" in response.headers assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_content_range_correct(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) headers = {"Range": "bytes=12-19"} uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ 12:20 ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", name="any") assert uri == app.url_for("test_bp_static.static", filename="any") assert uri == app.url_for( "test_bp_static.static", name="any", filename="any" ) request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ 12:20 ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_content_range_front(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) headers = {"Range": "bytes=12-"} uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ 12: ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", name="any") assert uri == app.url_for("test_bp_static.static", filename="any") assert uri == app.url_for( "test_bp_static.static", name="any", filename="any" ) request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ 12: ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_content_range_back(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) headers = {"Range": "bytes=-12"} uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ -12: ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", name="any") assert uri == app.url_for("test_bp_static.static", filename="any") assert uri == app.url_for( "test_bp_static.static", name="any", filename="any" ) request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers static_content = bytes(get_file_content(static_file_directory, file_name))[ -12: ] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_content_range_empty(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.get(uri) assert response.status == 200 assert "Content-Length" in response.headers assert "Content-Range" not in response.headers assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) assert response.body == bytes( get_file_content(static_file_directory, file_name) ) # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", name="any") assert uri == app.url_for("test_bp_static.static", filename="any") assert uri == app.url_for( "test_bp_static.static", name="any", filename="any" ) request, response = app.test_client.get(uri) assert response.status == 200 assert "Content-Length" in response.headers assert "Content-Range" not in response.headers assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) assert response.body == bytes( get_file_content(static_file_directory, file_name) ) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) def test_static_content_range_error(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) bp = Blueprint("test_bp_static", url_prefix="/bp") bp.static( "/testing.file", get_file_path(static_file_directory, file_name), use_content_range=True, ) app.blueprint(bp) headers = {"Range": "bytes=1-0"} uri = app.url_for("static") assert uri == "/testing.file" assert uri == app.url_for("static", name="static") assert uri == app.url_for("static", name="static", filename="any") request, response = app.test_client.get(uri, headers=headers) assert response.status == 416 assert "Content-Length" in response.headers assert "Content-Range" in response.headers assert response.headers["Content-Range"] == "bytes */%s" % ( len(get_file_content(static_file_directory, file_name)), ) # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" assert uri == app.url_for( "static", name="test_bp_static.static", filename="any" ) assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", name="any") assert uri == app.url_for("test_bp_static.static", filename="any") assert uri == app.url_for( "test_bp_static.static", name="any", filename="any" ) request, response = app.test_client.get(uri, headers=headers) assert response.status == 416 assert "Content-Length" in response.headers assert "Content-Range" in response.headers assert response.headers["Content-Range"] == "bytes */%s" % ( len(get_file_content(static_file_directory, file_name)), )