From c7b897d7a000ab331f7155299f3fb01313f355c5 Mon Sep 17 00:00:00 2001 From: Fabio Ambauen <1833932+open-dynaMIX@users.noreply.github.com> Date: Sun, 3 Jan 2021 11:22:13 +0100 Subject: [PATCH] fix: handle missing file parameter in /api/loadfile This commit also introduces a test that calls post endpoints with wrong args. --- tests/snapshots/snap_tests.py | 152 ++++++++++++++++++++++++++++++++++ tests/tests.py | 54 ++++++++++++ webui.lua | 2 +- 3 files changed, 207 insertions(+), 1 deletion(-) diff --git a/tests/snapshots/snap_tests.py b/tests/snapshots/snap_tests.py index 87a2454b..baf415d2 100644 --- a/tests/snapshots/snap_tests.py +++ b/tests/snapshots/snap_tests.py @@ -6,6 +6,158 @@ snapshots = Snapshot() +snapshots["TestsRequests.test_post_wrong_args[add-&-foo] 1"] = { + "message": "Parameter name contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[add-foo-&] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[add_audio_delay-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[add_chapter-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[add_sub_delay-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[add_volume-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[cycle-&-foo] 1"] = { + "message": "Parameter name contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[cycle-foo-&] 1"] = { + "message": 'Cycle paramater is not "up" or "down"' +} + +snapshots["TestsRequests.test_post_wrong_args[loadfile-None-None] 1"] = { + "message": "No url provided!" +} + +snapshots["TestsRequests.test_post_wrong_args[loadfile-http://foo-invalid] 1"] = { + "message": "Invalid mode: 'foo'" +} + +snapshots["TestsRequests.test_post_wrong_args[loop_file-&-None] 1"] = { + "message": "Invalid parameter!" +} + +snapshots["TestsRequests.test_post_wrong_args[loop_file-None-None] 1"] = { + "message": "Invalid parameter!" +} + +snapshots["TestsRequests.test_post_wrong_args[loop_playlist-&-None] 1"] = { + "message": "Invalid parameter!" +} + +snapshots["TestsRequests.test_post_wrong_args[multiply-&-23] 1"] = { + "message": "Parameter name contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[multiply-23-&] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[multiply-23-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_jump-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_jump-None-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_move-&-23] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_move-23-&] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_move-23-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_move_up-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_move_up-None-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_remove-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[playlist_remove-None-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[seek-None-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[seek-g-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[set-&-foo] 1"] = { + "message": "Parameter name contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[set-foo- ] 1"] = { + "message": "Parameter value contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[set_audio_delay-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[set_position-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[set_position-None-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[set_sub_delay-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[set_volume-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[speed_adjust-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[speed_set-&-None] 1"] = { + "message": "Parameter needs to be an integer or float" +} + +snapshots["TestsRequests.test_post_wrong_args[toggle-&-None] 1"] = { + "message": "Parameter name contains invalid characters" +} + +snapshots["TestsRequests.test_post_wrong_args[toggle-None-None] 1"] = { + "message": "Parameter name contains invalid characters" +} + snapshots["test_status 1"] = { "audio-delay": 0, "audio-devices": [ diff --git a/tests/tests.py b/tests/tests.py index d948922d..7dae0800 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -132,6 +132,60 @@ def test_post(mpv_instance, endpoint, arg, key, value, invert_actual): assert send(endpoint, arg=arg, status=key) == value + @staticmethod + @pytest.mark.parametrize( + "endpoint,arg,arg2", + [ + ("seek", "g", None), + ("seek", None, None), + ("add", "&", "foo"), + ("add", "foo", "&"), + ("cycle", "&", "foo"), + ("cycle", "foo", "&"), + ("multiply", "&", "23"), + ("multiply", "23", "&"), + ("multiply", "23", None), + ("set", "&", "foo"), + ("set", "foo", " "), + ("toggle", "&", None), + ("toggle", None, None), + ("set_position", "&", None), + ("set_position", None, None), + ("playlist_jump", "&", None), + ("playlist_jump", None, None), + ("playlist_remove", "&", None), + ("playlist_remove", None, None), + ("playlist_move", "&", "23"), + ("playlist_move", "23", "&"), + ("playlist_move", "23", None), + ("playlist_move_up", "&", None), + ("playlist_move_up", None, None), + ("loop_file", "&", None), + ("loop_file", None, None), + ("loop_playlist", "&", None), + ("add_volume", "&", None), + ("set_volume", "&", None), + ("add_sub_delay", "&", None), + ("set_sub_delay", "&", None), + ("add_audio_delay", "&", None), + ("set_audio_delay", "&", None), + ("speed_set", "&", None), + ("speed_adjust", "&", None), + ("add_chapter", "&", None), + ("loadfile", None, None), + ("loadfile", "http://foo", "invalid"), + ], + ) + def test_post_wrong_args(mpv_instance, snapshot, endpoint, arg, arg2): + send(endpoint, arg=arg, arg2=arg2, expect=400) + api = f"api/{endpoint}" + for a in [arg, arg2]: + if a is not None: + api += f"/{a}" + response = requests.post(get_uri(api)) + assert response.status_code == 400 + snapshot.assert_match(response.json()) + @staticmethod @pytest.mark.parametrize( "endpoint,arg,position", diff --git a/webui.lua b/webui.lua index 56a0918a..3c4fa5bc 100644 --- a/webui.lua +++ b/webui.lua @@ -389,7 +389,7 @@ local commands = { end, loadfile = function(uri, mode) - if uri == nil or type(uri) ~= "string" then + if uri == "" or type(uri) ~= "string" then return true, false, "No url provided!" end if mode ~= nil and