summaryrefslogtreecommitdiffstats
path: root/tests/test_exit_status.py
blob: 02fd2f1fe5035d698ea9e5928d712a04316e99d9 (plain)
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
from unittest import mock

from httpie.status import ExitStatus
from .utils import MockEnvironment, http, HTTP_OK


def test_keyboard_interrupt_during_arg_parsing_exit_status(httpbin):
    with mock.patch('httpie.cli.definition.parser.parse_args',
                    side_effect=KeyboardInterrupt()):
        r = http('GET', httpbin + '/get', tolerate_error_exit_status=True)
        assert r.exit_status == ExitStatus.ERROR_CTRL_C


def test_keyboard_interrupt_in_program_exit_status(httpbin):
    with mock.patch('httpie.core.program',
                    side_effect=KeyboardInterrupt()):
        r = http('GET', httpbin + '/get', tolerate_error_exit_status=True)
        assert r.exit_status == ExitStatus.ERROR_CTRL_C


def test_ok_response_exits_0(httpbin):
    r = http('GET', httpbin + '/get')
    assert HTTP_OK in r
    assert r.exit_status == ExitStatus.SUCCESS


def test_error_response_exits_0_without_check_status(httpbin):
    r = http('GET', httpbin + '/status/500')
    assert '500 INTERNAL SERVER ERROR' in r
    assert r.exit_status == ExitStatus.SUCCESS
    assert not r.stderr


def test_timeout_exit_status(httpbin):

    r = http('--timeout=0.01', 'GET', httpbin + '/delay/0.5',
             tolerate_error_exit_status=True)
    assert r.exit_status == ExitStatus.ERROR_TIMEOUT


def test_3xx_check_status_exits_3_and_stderr_when_stdout_redirected(
        httpbin):
    env = MockEnvironment(stdout_isatty=False)
    r = http('--check-status', '--headers',
             'GET', httpbin + '/status/301',
             env=env, tolerate_error_exit_status=True)
    assert '301 MOVED PERMANENTLY' in r
    assert r.exit_status == ExitStatus.ERROR_HTTP_3XX
    assert '301 moved permanently' in r.stderr.lower()


def test_3xx_check_status_redirects_allowed_exits_0(httpbin):
    r = http('--check-status', '--follow',
             'GET', httpbin + '/status/301',
             tolerate_error_exit_status=True)
    # The redirect will be followed so 200 is expected.
    assert HTTP_OK in r
    assert r.exit_status == ExitStatus.SUCCESS


def test_4xx_check_status_exits_4(httpbin):
    r = http('--check-status', 'GET', httpbin + '/status/401',
             tolerate_error_exit_status=True)
    assert '401 UNAUTHORIZED' in r
    assert r.exit_status == ExitStatus.ERROR_HTTP_4XX
    # Also stderr should be empty since stdout isn't redirected.
    assert not r.stderr


def test_5xx_check_status_exits_5(httpbin):
    r = http('--check-status', 'GET', httpbin + '/status/500',
             tolerate_error_exit_status=True)
    assert '500 INTERNAL SERVER ERROR' in r
    assert r.exit_status == ExitStatus.ERROR_HTTP_5XX