File: test_web_cli.py

package info (click to toggle)
python-aiohttp 3.11.16-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 16,156 kB
  • sloc: python: 51,898; ansic: 20,843; makefile: 395; javascript: 31; sh: 3
file content (159 lines) | stat: -rw-r--r-- 5,028 bytes parent folder | download
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import sys
from typing import Any
from unittest import mock

import pytest

from aiohttp import web


def test_entry_func_empty(mocker) -> None:
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)
    argv = [""]

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("'entry-func' not in 'module:function' syntax")


def test_entry_func_only_module(mocker) -> None:
    argv = ["test"]
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("'entry-func' not in 'module:function' syntax")


def test_entry_func_only_function(mocker) -> None:
    argv = [":test"]
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("'entry-func' not in 'module:function' syntax")


def test_entry_func_only_separator(mocker) -> None:
    argv = [":"]
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("'entry-func' not in 'module:function' syntax")


def test_entry_func_relative_module(mocker) -> None:
    argv = [".a.b:c"]

    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)
    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("relative module names not supported")


def test_entry_func_non_existent_module(mocker) -> None:
    argv = ["alpha.beta:func"]

    mocker.patch("aiohttp.web.import_module", side_effect=ImportError("Test Error"))
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with("unable to import alpha.beta: Test Error")


def test_entry_func_non_existent_attribute(mocker) -> None:
    argv = ["alpha.beta:func"]
    import_module = mocker.patch("aiohttp.web.import_module")
    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)
    module = import_module("alpha.beta")
    del module.func

    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with(
        "module {!r} has no attribute {!r}".format("alpha.beta", "func")
    )


@pytest.mark.skipif(sys.platform.startswith("win32"), reason="Windows not Unix")
def test_path_no_host(mocker: Any, monkeypatch: Any) -> None:
    argv = "--path=test_path.sock alpha.beta:func".split()
    mocker.patch("aiohttp.web.import_module")

    run_app = mocker.patch("aiohttp.web.run_app")
    with pytest.raises(SystemExit):
        web.main(argv)

    run_app.assert_called_with(mock.ANY, path="test_path.sock", host=None, port=None)


@pytest.mark.skipif(sys.platform.startswith("win32"), reason="Windows not Unix")
def test_path_and_host(mocker: Any, monkeypatch: Any) -> None:
    argv = "--path=test_path.sock --host=localhost --port=8000 alpha.beta:func".split()
    mocker.patch("aiohttp.web.import_module")

    run_app = mocker.patch("aiohttp.web.run_app")
    with pytest.raises(SystemExit):
        web.main(argv)

    run_app.assert_called_with(
        mock.ANY, path="test_path.sock", host="localhost", port=8000
    )


def test_path_when_unsupported(mocker: Any, monkeypatch: Any) -> None:
    argv = "--path=test_path.sock alpha.beta:func".split()
    mocker.patch("aiohttp.web.import_module")
    monkeypatch.delattr("socket.AF_UNIX", raising=False)

    error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit)
    with pytest.raises(SystemExit):
        web.main(argv)

    error.assert_called_with(
        "file system paths not supported by your operating environment"
    )


def test_entry_func_call(mocker) -> None:
    mocker.patch("aiohttp.web.run_app")
    import_module = mocker.patch("aiohttp.web.import_module")
    argv = (
        "-H testhost -P 6666 --extra-optional-eins alpha.beta:func "
        "--extra-optional-zwei extra positional args"
    ).split()
    module = import_module("alpha.beta")

    with pytest.raises(SystemExit):
        web.main(argv)

    module.func.assert_called_with(
        ("--extra-optional-eins --extra-optional-zwei extra positional args").split()
    )


def test_running_application(mocker) -> None:
    run_app = mocker.patch("aiohttp.web.run_app")
    import_module = mocker.patch("aiohttp.web.import_module")
    exit = mocker.patch("aiohttp.web.ArgumentParser.exit", side_effect=SystemExit)
    argv = (
        "-H testhost -P 6666 --extra-optional-eins alpha.beta:func "
        "--extra-optional-zwei extra positional args"
    ).split()
    module = import_module("alpha.beta")
    app = module.func()

    with pytest.raises(SystemExit):
        web.main(argv)

    run_app.assert_called_with(app, host="testhost", port=6666, path=None)
    exit.assert_called_with(message="Stopped\n")