Skip to content

Commit a768ecd

Browse files
committed
Improve tests
1 parent 7fe0a28 commit a768ecd

File tree

3 files changed

+112
-16
lines changed

3 files changed

+112
-16
lines changed

astroid/brain/helpers.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from __future__ import annotations
66

77
from collections.abc import Callable
8-
98
from typing import TYPE_CHECKING
109

1110
from astroid.exceptions import InferenceError

tests/brain/test_attr.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -232,44 +232,56 @@ class Foo:
232232

233233
def test_attrs_with_class_var_annotation(self) -> None:
234234
cases = {
235-
"from_import": """
235+
"with-subscript": """
236236
import attrs
237237
from typing import ClassVar
238238
239239
@attrs.define
240240
class Foo:
241241
bar: ClassVar[int] = 1
242-
baz: int = 1
243242
Foo()
244243
""",
245-
"module_import": """
244+
"no-subscript": """
246245
import attrs
247-
import typing
246+
from typing import ClassVar
247+
248+
@attrs.define
249+
class Foo:
250+
bar: ClassVar = 1
251+
Foo()
252+
""",
253+
}
254+
255+
for name, code in cases.items():
256+
with self.subTest(case=name):
257+
instance = next(astroid.extract_node(code).infer())
258+
self.assertIsInstance(instance.getattr("bar")[0], nodes.AssignName)
259+
self.assertNotIn("bar", instance.instance_attrs)
260+
261+
def test_attrs_without_class_var_annotation(self) -> None:
262+
cases = {
263+
"wrong-name": """
264+
import attrs
265+
from typing import Final
248266
249267
@attrs.define
250268
class Foo:
251-
bar: typing.ClassVar[int] = 1
252-
baz: int = 1
269+
bar: Final[int] = 1
253270
Foo()
254271
""",
255-
"no_subscript": """
272+
"classvar-not-outermost": """
256273
import attrs
257274
from typing import ClassVar
258275
259276
@attrs.define
260277
class Foo:
261-
bar: ClassVar = 1
262-
baz: int = 1
278+
bar: list[ClassVar[int]] = []
263279
Foo()
264280
""",
265281
}
266282

267283
for name, code in cases.items():
268284
with self.subTest(case=name):
269285
instance = next(astroid.extract_node(code).infer())
270-
271-
self.assertIsInstance(instance.getattr("bar")[0], nodes.AssignName)
272-
self.assertIsInstance(instance.getattr("baz")[0], nodes.Unknown)
273-
274-
self.assertNotIn("bar", instance.instance_attrs)
275-
self.assertIn("baz", instance.instance_attrs)
286+
self.assertIsInstance(instance.getattr("bar")[0], nodes.Unknown)
287+
self.assertIn("bar", instance.instance_attrs)

tests/brain/test_helpers.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
2+
# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
3+
# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt
4+
5+
import pytest
6+
7+
from astroid import extract_node, nodes
8+
from astroid.brain.helpers import is_class_var
9+
10+
11+
@pytest.mark.parametrize(
12+
"code",
13+
[
14+
pytest.param(
15+
"""
16+
from typing import ClassVar
17+
18+
foo: ClassVar[int]
19+
""",
20+
id="from-import",
21+
),
22+
pytest.param(
23+
"""
24+
from typing import ClassVar
25+
26+
foo: ClassVar
27+
""",
28+
id="bare-classvar",
29+
),
30+
pytest.param(
31+
"""
32+
import typing
33+
34+
foo: typing.ClassVar[int]
35+
""",
36+
id="module-import",
37+
),
38+
],
39+
)
40+
def test_is_class_var_returns_true(code):
41+
node = extract_node(code)
42+
assert isinstance(node, nodes.AnnAssign)
43+
assert is_class_var(node.annotation)
44+
45+
46+
@pytest.mark.parametrize(
47+
"code",
48+
[
49+
pytest.param(
50+
"""
51+
from typing import Final
52+
53+
foo: Final[int]
54+
""",
55+
id="wrong-name",
56+
),
57+
pytest.param(
58+
"""
59+
from typing import ClassVar
60+
61+
foo: list[ClassVar[int]]
62+
""",
63+
id="classvar-not-outermost",
64+
),
65+
pytest.param(
66+
"""
67+
from typing import ClassVar
68+
ClassVar = int
69+
70+
foo: ClassVar
71+
""",
72+
id="shadowed-name",
73+
),
74+
pytest.param(
75+
"""
76+
foo: ClassVar[int]
77+
""",
78+
id="missing-import",
79+
),
80+
],
81+
)
82+
def test_is_class_var_returns_false(code):
83+
node = extract_node(code)
84+
assert isinstance(node, nodes.AnnAssign)
85+
assert not is_class_var(node.annotation)

0 commit comments

Comments
 (0)