summaryrefslogtreecommitdiff
path: root/tests/extensions/test_overlapping_exceptions.py
blob: 005e0bcf94d0d33adf936c5574b2cf9f8c354aa1 (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
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE

"""Tests for the pylint checker in :mod:`pylint.extensions.overlapping_exceptions
"""

from os.path import dirname, join

import pytest

from pylint.extensions.overlapping_exceptions import OverlappingExceptionsChecker
from pylint.lint.pylinter import PyLinter


@pytest.fixture(scope="module")
def checker():
    return OverlappingExceptionsChecker


@pytest.fixture(scope="module")
def disable():
    return ["I"]


def test_overlapping_exceptions(linter: PyLinter) -> None:
    test = join(dirname(__file__), "data", "overlapping_exceptions.py")
    linter.check([test])
    msgs = linter.reporter.messages

    expected = [
        (13, "Overlapping exceptions (SomeException and SomeException are the same)"),
        (
            18,
            "Overlapping exceptions (SomeException is an ancestor class of SubclassException)",
        ),
        (23, "Overlapping exceptions (SomeException and AliasException are the same)"),
        (
            28,
            "Overlapping exceptions (AliasException is an ancestor class of SubclassException)",
        ),
        (34, "Overlapping exceptions (SomeException and AliasException are the same)"),
        (
            34,
            "Overlapping exceptions (SomeException is an ancestor class of SubclassException)",
        ),
        (
            34,
            "Overlapping exceptions (AliasException is an ancestor class of SubclassException)",
        ),
        (
            39,
            "Overlapping exceptions (ArithmeticError is an ancestor class of FloatingPointError)",
        ),
        (
            44,
            "Overlapping exceptions (ValueError is an ancestor class of UnicodeDecodeError)",
        ),
    ]

    assert len(msgs) == len(expected)
    for msg, exp in zip(msgs, expected):
        assert msg.msg_id == "W0714"
        assert msg.symbol == "overlapping-except"
        assert msg.category == "warning"
        assert (msg.line, msg.msg) == exp


def test_overlapping_exceptions_py33(linter: PyLinter) -> None:
    """From Python 3.3 both IOError and socket.error are aliases for OSError."""
    test = join(dirname(__file__), "data", "overlapping_exceptions_py33.py")
    linter.check([test])
    msgs = linter.reporter.messages

    expected = [
        (7, "Overlapping exceptions (IOError and OSError are the same)"),
        (12, "Overlapping exceptions (socket.error and OSError are the same)"),
        (
            17,
            "Overlapping exceptions (socket.error is an ancestor class of ConnectionError)",
        ),
    ]

    assert len(msgs) == len(expected)
    for msg, exp in zip(msgs, expected):
        assert msg.msg_id == "W0714"
        assert msg.symbol == "overlapping-except"
        assert msg.category == "warning"
        assert (msg.line, msg.msg) == exp