streamlink/tests/test_plugin_userinput.py

59 lines
2.6 KiB
Python

from unittest.mock import Mock, call, patch
import pytest
from streamlink.exceptions import FatalPluginError
from streamlink.session import Streamlink
from streamlink_cli.console import ConsoleUserInputRequester
from tests.plugin.testplugin import TestPlugin as _TestPlugin
def test_session():
console_input = ConsoleUserInputRequester(Mock())
session = Streamlink({"user-input-requester": console_input}, plugins_builtin=False)
assert session.get_option("user-input-requester") is console_input
class TestPluginUserInput:
@pytest.fixture()
def testplugin(self, session: Streamlink):
return _TestPlugin(session, "http://example.com/stream")
@pytest.fixture()
def console_input(self, request, session: Streamlink):
isatty: bool = request.param
with patch("streamlink_cli.console.sys.stdin.isatty", return_value=isatty):
mock_console = Mock()
mock_console.ask.return_value = "username"
mock_console.askpass.return_value = "password"
console_input = ConsoleUserInputRequester(mock_console)
session.set_option("user-input-requester", console_input)
yield console_input
def test_user_input_not_implemented(self, testplugin: _TestPlugin):
with pytest.raises(FatalPluginError) as cm:
testplugin.input_ask("test")
assert str(cm.value) == "This plugin requires user input, however it is not supported on this platform"
with pytest.raises(FatalPluginError) as cm:
testplugin.input_ask_password("test")
assert str(cm.value) == "This plugin requires user input, however it is not supported on this platform"
@pytest.mark.parametrize("console_input", [True], indirect=True)
def test_user_input_console(self, testplugin: _TestPlugin, console_input: ConsoleUserInputRequester):
assert testplugin.input_ask("username") == "username"
assert console_input.console.ask.call_args_list == [call("username: ")]
assert testplugin.input_ask_password("password") == "password"
assert console_input.console.askpass.call_args_list == [call("password: ")]
@pytest.mark.parametrize("console_input", [False], indirect=True)
def test_user_input_console_no_tty(self, testplugin: _TestPlugin, console_input: ConsoleUserInputRequester):
with pytest.raises(FatalPluginError) as cm:
testplugin.input_ask("username")
assert str(cm.value) == "User input error: no TTY available"
with pytest.raises(FatalPluginError) as cm:
testplugin.input_ask_password("username")
assert str(cm.value) == "User input error: no TTY available"