@@ -219,5 +219,46 @@ def test_ignores_runtime_subpackage_and_org_path(self) -> None:
219219 self .assertEqual (gen .audit (self .root , self .versions ), [])
220220
221221
222+ class PythonPinOperatorTests (_RepoTestCase ):
223+ def test_audit_flags_non_exact_operator (self ) -> None :
224+ # Correct version, floor operator: the version-drift audit is clean, but
225+ # the operator policy is violated (AAASM-4704).
226+ _in_sync_tree (self .root )
227+ _write (
228+ self .root ,
229+ "python/ex/pyproject.toml" ,
230+ 'dependencies = [\n "agent-assembly>=0.0.1rc5",\n ]\n ' ,
231+ )
232+ problems = gen .audit (self .root , self .versions )
233+ self .assertEqual (len (problems ), 1 )
234+ self .assertIn ("python/ex/pyproject.toml:2" , problems [0 ])
235+ self .assertIn ("operator" , problems [0 ])
236+
237+ def test_audit_passes_on_exact_operator (self ) -> None :
238+ _in_sync_tree (self .root ) # every python pin is ``==``
239+ self .assertEqual (gen .audit (self .root , self .versions ), [])
240+
241+ def test_operator_exemption_is_honored (self ) -> None :
242+ _in_sync_tree (self .root )
243+ _write (
244+ self .root ,
245+ "python/ex/pyproject.toml" ,
246+ 'dependencies = [\n "agent-assembly>=0.0.1rc5",'
247+ " # sdk-version-exempt\n ]\n " ,
248+ )
249+ self .assertEqual (gen .audit (self .root , self .versions ), [])
250+
251+ def test_rewriter_normalizes_operator_to_exact (self ) -> None :
252+ path = _write (
253+ self .root ,
254+ "python/ex/pyproject.toml" ,
255+ 'dependencies = [\n "agent-assembly>=0.0.1rc3",\n ]\n ' ,
256+ )
257+ changed = gen .rewrite_python_manifest (path , self .versions .python )
258+ self .assertTrue (changed )
259+ self .assertIn ('"agent-assembly==0.0.1rc5"' , path .read_text ())
260+ self .assertNotIn (">=" , path .read_text ())
261+
262+
222263if __name__ == "__main__" :
223264 unittest .main ()
0 commit comments