1import json2from akos.compiler import codegen_python, codegen_ts, codegen_mcp, openapi, probe, scan3from tests.conftest import SPEC456def _contract():7 return openapi.parse(json.dumps(SPEC).replace("{port}", "9"), source_url="http://127.0.0.1:9/openapi.json")8910def test_openapi_parse_resolves_refs_and_pagination():11 c = _contract()12 ops = {e["operation_id"]: e for e in c["endpoints"]}13 assert set(ops) == {"listItems", "ratesByYear", "secure"}14 assert ops["listItems"]["pagination"]["style"] == "page"15 assert ops["listItems"]["response_schema"]["properties"]["items"]["items"]["properties"]["name"]["type"] == "string"16 assert c["license"]["name"] == "CC0-1.0" and c["base_url"] == "http://127.0.0.1:9"17 assert any(v["unit"] == "USD" for v in c["variables"])181920def test_generated_python_client_is_valid_and_scans_clean():21 c = _contract()22 src = codegen_python.generate(c, akp_id="mock.data", version=1, contract_hash="a" * 64, credential_env=None)23 compile(src, "client.py", "exec")24 res = scan.scan_python(src)25 assert res["ok"], res["findings"]26 assert "CREDENTIAL_ENV = None" in src and "BASE_URL = 'http://127.0.0.1:9'" in src27 assert "rm -rf" in src # injection text is carried as data (escaped string), never executed28 tests = codegen_python.generate_tests(c, akp_id="mock.data", fixtures={"listItems": {"query": {"page": 1}, "body": "{}"}})29 for name, s in tests.items():30 compile(s, name, "exec"); assert scan.scan_python(s, name)["ok"]313233def test_scan_rejects_dangerous_code():34 bad = "import subprocess\nsubprocess.run(['ls'])\neval('1')\nimport os\nos.system('x')\nopen('f','w')\n"35 r = scan.scan_python(bad)36 assert not r["ok"] and len(r["findings"]) >= 4373839def test_ts_and_mcp_generation():40 c = _contract()41 ts = codegen_ts.generate(c, akp_id="mock.data", version=1, contract_hash="b" * 64, credential_env="AKOS_CRED_X")42 assert "export class Client" in ts and "listItems(" in ts43 m = codegen_mcp.generate(c, akp_id="mock.data", version=1, opaque=False)44 assert len(m["tools"]) == 3 and m["tools"][1]["inputSchema"]["required"] == ["year"]454647def test_probe_inference_marks_inferred():48 body = json.dumps([{"meta": 1}, [{"a": 1, "b": "x"}, {"a": 2, "b": None}]]).encode()49 c = probe.contract_from_probe("https://example.org/v2/data?x=1", "GET", 200, body, "application/json")50 e = c["endpoints"][0]51 assert e["inferred"] and e["parameters"][0]["name"] == "x"52 assert e["response_schema"]["type"] == "array"53 assert probe.merge({"type": "integer"}, {"type": "number"}) == {"type": "number"}54