File: test_plugin_userinput.py

package info (click to toggle)
streamlink 8.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,564 kB
  • sloc: python: 51,188; sh: 184; makefile: 152
file content (80 lines) | stat: -rw-r--r-- 2,712 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from __future__ import annotations

from typing import TYPE_CHECKING
from unittest.mock import Mock, call

import pytest

from streamlink.exceptions import FatalPluginError
from streamlink_cli.console import ConsoleUserInputRequester
from tests.plugin.testplugin import TestPlugin as _TestPlugin


if TYPE_CHECKING:
    from streamlink.session import Streamlink


@pytest.fixture()
def console(request: pytest.FixtureRequest):
    param = getattr(request, "param", {})

    console = Mock()
    if not param.get("failure", False):
        console.ask.return_value = "username"
        console.ask_password.return_value = "password"
    else:
        console.ask.side_effect = OSError("No input TTY available")
        console.ask_password.side_effect = OSError("No input TTY available")

    return console


@pytest.fixture()
def session(session: Streamlink, console: Mock):
    user_input = ConsoleUserInputRequester(console)
    session.set_option("user-input-requester", user_input)

    return session


@pytest.fixture()
def testplugin(session: Streamlink):
    return _TestPlugin(session, "http://test.se/")


def test_session(session: Streamlink, console: Mock):
    user_input = session.get_option("user-input-requester")
    assert user_input
    assert user_input.console is console


def test_user_input_not_implemented(session: Streamlink, testplugin: _TestPlugin):
    session.set_option("user-input-requester", None)

    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", [{"failure": False}], indirect=True)
def test_user_input_console(console: Mock, testplugin: _TestPlugin):
    assert testplugin.input_ask("username") == "username"
    assert console.ask.call_args_list == [call("username: ")]

    assert testplugin.input_ask_password("password") == "password"
    assert console.ask_password.call_args_list == [call("password: ")]


@pytest.mark.parametrize("console", [{"failure": True}], indirect=True)
def test_user_input_console_no_tty(console: Mock, testplugin: _TestPlugin):
    with pytest.raises(FatalPluginError) as cm:
        testplugin.input_ask("username")
    assert str(cm.value) == "User input error: No input TTY available"

    with pytest.raises(FatalPluginError) as cm:
        testplugin.input_ask_password("username")
    assert str(cm.value) == "User input error: No input TTY available"