summaryrefslogtreecommitdiff
path: root/tests/unit/test_application.py
blob: b95e3832f6f870b5a89a40206ad522390b196f3d (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
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
"""Tests for the Application class."""
import argparse
import sys
from unittest import mock

import pytest

from flake8.main import application as app


def options(**kwargs):
    """Generate argparse.Namespace for our Application."""
    kwargs.setdefault("verbose", 0)
    kwargs.setdefault("output_file", None)
    kwargs.setdefault("count", False)
    kwargs.setdefault("exit_zero", False)
    return argparse.Namespace(**kwargs)


@pytest.fixture
def application():
    """Create an application."""
    return app.Application()


@pytest.mark.parametrize(
    "result_count, catastrophic, exit_zero, value",
    [
        (0, False, False, False),
        (0, True, False, True),
        (2, False, False, True),
        (2, True, False, True),
        (0, True, True, True),
        (2, False, True, False),
        (2, True, True, True),
    ],
)
def test_exit_does_raise(
    result_count, catastrophic, exit_zero, value, application
):
    """Verify Application.exit doesn't raise SystemExit."""
    application.result_count = result_count
    application.catastrophic_failure = catastrophic
    application.options = options(exit_zero=exit_zero)

    with pytest.raises(SystemExit) as excinfo:
        application.exit()

    assert excinfo.value.args[0] is value


def test_warns_on_unknown_formatter_plugin_name(application):
    """Verify we log a warning with an unfound plugin."""
    default = mock.Mock()
    execute = default.execute
    application.formatting_plugins = {
        "default": default,
    }
    with mock.patch.object(app.LOG, "warning") as warning:
        assert execute is application.formatter_for("fake-plugin-name")

    assert warning.called is True
    assert warning.call_count == 1


def test_returns_specified_plugin(application):
    """Verify we get the plugin we want."""
    desired = mock.Mock()
    execute = desired.execute
    application.formatting_plugins = {
        "default": mock.Mock(),
        "desired": desired,
    }

    with mock.patch.object(app.LOG, "warning") as warning:
        assert execute is application.formatter_for("desired")

    assert warning.called is False


def test_prelim_opts_args(application):
    """Verify we get sensible prelim opts and args."""
    opts, args = application.parse_preliminary_options(
        ["--foo", "--verbose", "src", "setup.py", "--statistics", "--version"]
    )

    assert opts.verbose
    assert args == ["--foo", "src", "setup.py", "--statistics", "--version"]


def test_prelim_opts_ignore_help(application):
    """Verify -h/--help is not handled."""
    # GIVEN

    # WHEN
    _, args = application.parse_preliminary_options(["--help", "-h"])

    # THEN
    assert args == ["--help", "-h"]


def test_prelim_opts_handles_empty(application):
    """Verify empty argv lists are handled correctly."""
    irrelevant_args = ["myexe", "/path/to/foo"]
    with mock.patch.object(sys, "argv", irrelevant_args):
        opts, args = application.parse_preliminary_options([])

        assert args == []