| # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html |
| # For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE |
| # Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt |
| |
| import pytest |
| from _pytest.recwarn import WarningsRecorder |
| |
| from astroid.decorators import deprecate_default_argument_values |
| |
| |
| class SomeClass: |
| @deprecate_default_argument_values(name="str") |
| def __init__(self, name=None, lineno=None): ... |
| |
| @deprecate_default_argument_values("3.2", name="str", var="int") |
| def func(self, name=None, var=None, type_annotation=None): ... |
| |
| |
| class TestDeprecationDecorators: |
| @staticmethod |
| def test_deprecated_default_argument_values_one_arg() -> None: |
| with pytest.warns(DeprecationWarning) as records: |
| # No argument passed for 'name' |
| SomeClass() |
| assert len(records) == 1 |
| assert "name" in records[0].message.args[0] |
| assert "'SomeClass.__init__'" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| # 'None' passed as argument for 'name' |
| SomeClass(None) |
| assert len(records) == 1 |
| assert "name" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| # 'None' passed as keyword argument for 'name' |
| SomeClass(name=None) |
| assert len(records) == 1 |
| assert "name" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| # No value passed for 'name' |
| SomeClass(lineno=42) |
| assert len(records) == 1 |
| assert "name" in records[0].message.args[0] |
| |
| @staticmethod |
| def test_deprecated_default_argument_values_two_args() -> None: |
| instance = SomeClass(name="") |
| |
| # No value of 'None' passed for both arguments |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func() |
| assert len(records) == 2 |
| assert "'SomeClass.func'" in records[0].message.args[0] |
| assert "astroid 3.2" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(None) |
| assert len(records) == 2 |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(name=None) |
| assert len(records) == 2 |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(var=None) |
| assert len(records) == 2 |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(name=None, var=None) |
| assert len(records) == 2 |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(type_annotation="") |
| assert len(records) == 2 |
| |
| # No value of 'None' for one argument |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(42) |
| assert len(records) == 1 |
| assert "var" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(name="") |
| assert len(records) == 1 |
| assert "var" in records[0].message.args[0] |
| |
| with pytest.warns(DeprecationWarning) as records: |
| instance.func(var=42) |
| assert len(records) == 1 |
| assert "name" in records[0].message.args[0] |
| |
| @staticmethod |
| def test_deprecated_default_argument_values_ok(recwarn: WarningsRecorder) -> None: |
| """No DeprecationWarning should be emitted |
| if all arguments are passed with not None values. |
| """ |
| instance = SomeClass(name="some_name") |
| instance.func(name="", var=42) |
| assert len(recwarn) == 0 |