"""Unit tests for tools.parse_functions_json / build_tools_list.""" import json from tools import build_tools_list, parse_functions_json def test_parse_empty_inputs(): assert parse_functions_json(None) == [] assert parse_functions_json("") == [] assert parse_functions_json(" ") == [] def test_parse_invalid_json(): assert parse_functions_json("not json") == [] def test_parse_dict_normalized_to_list(): payload = {"name": "ping", "parameters": {"type": "object"}} result = parse_functions_json(json.dumps(payload)) assert len(result) == 1 assert result[0]["name"] == "ping" def test_parse_typed_function_format(): payload = [{ "type": "function", "function": { "name": "get_weather", "description": "weather", "parameters": {"type": "object", "properties": {}}, }, }] result = parse_functions_json(json.dumps(payload)) assert result == [payload[0]["function"]] def test_parse_skips_invalid_entries(): payload = [ {"type": "function", "function": {}}, # missing name {"name": "good", "parameters": {}}, # ok "string-not-object", # not a dict ] result = parse_functions_json(json.dumps(payload)) assert [fn["name"] for fn in result] == ["good"] def test_build_tools_list_returns_none_when_empty(): assert build_tools_list("") is None assert build_tools_list("[]") is None def test_build_tools_list_wraps_in_function_envelope(): payload = [{"name": "ping", "parameters": {"type": "object"}}] tools = build_tools_list(json.dumps(payload)) assert tools is not None assert tools[0]["type"] == "function" assert tools[0]["function"]["name"] == "ping" def test_build_tools_list_parses_string_parameters(): payload = [{ "name": "ping", "parameters": json.dumps({"type": "object", "properties": {}}), }] tools = build_tools_list(json.dumps(payload)) assert tools is not None assert tools[0]["function"]["parameters"]["type"] == "object"