ZIm/crates/languages/src/python/runnables.scm
Ben Kunkle d03d8ccec1
python: Fix identification of runnable tests within decorated test classes (#29688)
Closes #29486

Release Notes:

- python: Fixed identification of runnable test functions within
decorated pytest classes
2025-04-30 17:26:30 +00:00

151 lines
4.3 KiB
Scheme

; subclasses of unittest.TestCase or TestCase
(
(class_definition
name: (identifier) @run @_unittest_class_name
superclasses: (argument_list
[(identifier) @_superclass
(attribute (identifier) @_superclass)]
)
(#eq? @_superclass "TestCase")
) @_python-unittest-class
(#set! tag python-unittest-class)
)
; test methods whose names start with `test` in a TestCase
(
(class_definition
name: (identifier) @_unittest_class_name
superclasses: (argument_list
[(identifier) @_superclass
(attribute (identifier) @_superclass)]
)
(#eq? @_superclass "TestCase")
body: (block
(function_definition
name: (identifier) @run @_unittest_method_name
(#match? @_unittest_method_name "^test.*")
) @_python-unittest-method
(#set! tag python-unittest-method)
)
)
)
; pytest functions
(
(module
(function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_")
) @_python-pytest-method
)
(#set! tag python-pytest-method)
)
; decorated pytest functions
(
(module
(decorated_definition
(decorator)+ @_decorator
definition: (function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_")
)
) @_python-pytest-method
)
(#set! tag python-pytest-method)
)
; pytest classes
(
(module
(class_definition
name: (identifier) @run @_pytest_class_name
(#match? @_pytest_class_name "^Test")
)
(#set! tag python-pytest-class)
)
)
; decorated pytest classes
(
(module
(decorated_definition
(decorator)+ @_decorator
definition: (class_definition
name: (identifier) @run @_pytest_class_name
(#match? @_pytest_class_name "^Test")
)
)
(#set! tag python-pytest-class)
)
)
; pytest class methods
(
(module
(class_definition
name: (identifier) @_pytest_class_name
(#match? @_pytest_class_name "^Test")
body: (block
[(decorated_definition
(decorator)+ @_decorator
definition: (function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_")
)
)
(function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test")
)
] @_python-pytest-method)
(#set! tag python-pytest-method)
)
)
)
; decorated pytest class methods
(
(module
(decorated_definition
(decorator)+ @_decorator
definition: (class_definition
name: (identifier) @_pytest_class_name
(#match? @_pytest_class_name "^Test")
body: (block
[(decorated_definition
(decorator)+ @_decorator
definition: (function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_")
)
)
(function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test")
)
] @_python-pytest-method)
(#set! tag python-pytest-method)
)
)
)
)
; module main method
(
(module
(if_statement
condition: (comparison_operator
(identifier) @run @_lhs
operators: "=="
(string) @_rhs
)
(#eq? @_lhs "__name__")
(#match? @_rhs "^[\"']__main__[\"']$")
(#set! tag python-module-main-method)
)
)
)