SPB Git

spb/akos

Public
2.5 KB · 54 lines python
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
Files · da58f809c01c422e65c786b05d6ffa3079c9feba
Menu

Theme