"""Reguły codemod z pakietu APM - deterministyczna część migracji.""" from agentic_codemod.apm.loader import load_apm_context from agentic_codemod.workflow.codemod import apply_ruleset, load_rulesets def _ruleset(repo_root): ctx = load_apm_context(repo_root) rulesets = load_rulesets([ref.path for ref in ctx.skills.values()], "acme-sdk") assert rulesets, "pakiet APM musi dostarczać reguły dla acme-sdk" return rulesets[0] def test_reguly_sa_ladowane_z_referencji_skilla(repo_root): ruleset = _ruleset(repo_root) assert ruleset.package == "acme-sdk" assert {rule.id for rule in ruleset.rules} >= {"import-client", "constructor", "send-message"} def test_dry_run_nie_zmienia_plikow(repo_root, acme_app): before = (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8") result = apply_ruleset(acme_app, _ruleset(repo_root), dry_run=True) assert result.changed_files == ["src/acme_app/notifier.py"] assert (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8") == before def test_migracja_usuwa_stare_api(repo_root, acme_app): apply_ruleset(acme_app, _ruleset(repo_root)) content = (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8") assert "AcmeClient(api_key=api_key, base_url=endpoint)" in content assert "client.messages.create(recipient=" in content assert "client.send(" not in content assert ".close()" not in content assert 'result["id"]' not in content def test_reguly_nie_dotykaja_vendorowanego_sdk(repo_root, acme_app): before = (acme_app / "stubs/acme/__init__.py").read_text(encoding="utf-8") apply_ruleset(acme_app, _ruleset(repo_root)) assert (acme_app / "stubs/acme/__init__.py").read_text(encoding="utf-8") == before def test_ponowne_uruchomienie_jest_idempotentne(repo_root, acme_app): ruleset = _ruleset(repo_root) apply_ruleset(acme_app, ruleset) after_first = (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8") second = apply_ruleset(acme_app, ruleset) assert second.changed_files == [] assert (acme_app / "src/acme_app/notifier.py").read_text(encoding="utf-8") == after_first