/ dev / clint / tests / rules / test_invalid_experimental_decorator.py
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