test_invalid_experimental_decorator.py
1 from pathlib import Path 2 3 from clint.config import Config 4 from clint.index import SymbolIndex 5 from clint.linter import Position, Range, lint_file 6 from clint.rules.invalid_experimental_decorator import InvalidExperimentalDecorator 7 8 9 def test_invalid_experimental_decorator(index: SymbolIndex) -> None: 10 code = """ 11 from mlflow.utils.annotations import experimental 12 13 # Bad - no arguments 14 @experimental 15 def bad_function1(): 16 pass 17 18 # Bad - no version argument 19 @experimental() 20 def bad_function2(): 21 pass 22 23 # Bad - invalid version format 24 @experimental(version="invalid") 25 def bad_function3(): 26 pass 27 28 # Bad - pre-release version 29 @experimental(version="1.0.0rc1") 30 def bad_function4(): 31 pass 32 33 # Bad - non-string version 34 @experimental(version=123) 35 def bad_function5(): 36 pass 37 38 # Good - valid semantic version 39 @experimental(version="1.2.3") 40 def good_function1(): 41 pass 42 43 # Good - valid semantic version with multiple parts 44 @experimental(version="2.0.0") 45 def good_function2(): 46 pass 47 """ 48 config = Config(select={InvalidExperimentalDecorator.name}) 49 violations = lint_file(Path("test.py"), code, config, index) 50 assert len(violations) == 5 51 assert all(isinstance(v.rule, InvalidExperimentalDecorator) for v in violations) 52 assert violations[0].range == Range(Position(4, 1)) # @experimental without args 53 assert violations[1].range == Range(Position(9, 1)) # @experimental() without version 54 assert violations[2].range == Range(Position(14, 1)) # invalid version format 55 assert violations[3].range == Range(Position(19, 1)) # pre-release version 56 assert violations[4].range == Range(Position(24, 1)) # non-string version