@@ -44,91 +44,106 @@ def test_unwrap_schema(extractor):
4444 assert result ["value" ] == "test"
4545
4646
47- @pytest .mark .parametrize (
48- "schema, expected" ,
49- [
50- ({"type" : "str" }, "str" ),
51- ({"type" : "list" , "items_schema" : {"type" : "str" }}, "list[str]" ),
52- ({"type" : "dict" , "keys_schema" : {"type" : "str" }, "values_schema" : {"type" : "int" }}, "dict[str, int]" ),
53- ({"type" : "union" , "choices" : [{"type" : "str" }, {"type" : "int" }]}, "union[str, int]" ),
54- ({"type" : "custom_type" }, "custom_type" ),
55- ({}, "unknown" ),
56- ]
57- )
58- def test_schema_type_to_str (extractor , schema , expected ):
59- assert extractor ._schema_type_to_str (schema ) == expected
60-
61-
62- @pytest .mark .parametrize (
63- "info, expected_type" ,
64- [
65- ({"schema" : {"type" : "str" }}, "str" ),
66- ({"schema" : {"type" : "nullable" , "schema" : {"type" : "int" }}}, "int" ),
67- ({"schema" : {"type" : "default" , "schema" : {"type" : "list" , "items_schema" : {"type" : "str" }}}}, "list[str]" ),
68- ]
69- )
70- def test_extract_param_type (extractor , info , expected_type ):
71- assert extractor ._extract_param_type (info ) == expected_type
72-
73-
74- def test_extract_all_tools (extractor ):
47+ @pytest .fixture
48+ def mock_tool_extractor (extractor ):
7549 with mock .patch ("generate_tool_specs.dir" , return_value = ["MockTool" ]), \
7650 mock .patch ("generate_tool_specs.getattr" , return_value = MockTool ):
7751 extractor .extract_all_tools ()
78-
7952 assert len (extractor .tools_spec ) == 1
80- tool_info = extractor .tools_spec [0 ]
81-
82- assert tool_info .keys () == {
83- "name" ,
84- "humanized_name" ,
85- "description" ,
86- "run_params" ,
87- "env_vars" ,
88- "init_params" ,
89- "package_dependencies" ,
90- }
91-
92- assert tool_info ["name" ] == "MockTool"
93- assert tool_info ["humanized_name" ] == "Mock Search Tool"
94- assert tool_info ["description" ] == "A tool that mocks search functionality"
53+ return extractor .tools_spec [0 ]
54+
55+ def test_extract_basic_tool_info (mock_tool_extractor ):
56+ tool_info = mock_tool_extractor
57+
58+ assert tool_info .keys () == {
59+ "name" ,
60+ "humanized_name" ,
61+ "description" ,
62+ "run_params_schema" ,
63+ "env_vars" ,
64+ "init_params_schema" ,
65+ "package_dependencies" ,
66+ }
9567
96- assert len (tool_info ["env_vars" ]) == 2
97- api_key_var , rate_limit_var = tool_info ["env_vars" ]
68+ assert tool_info ["name" ] == "MockTool"
69+ assert tool_info ["humanized_name" ] == "Mock Search Tool"
70+ assert tool_info ["description" ] == "A tool that mocks search functionality"
9871
99- assert api_key_var ["name" ] == "SERPER_API_KEY"
100- assert api_key_var ["description" ] == "API key for Serper"
101- assert api_key_var ["required" ] == True
102- assert api_key_var ["default" ] == None
72+ def test_extract_init_params_schema (mock_tool_extractor ):
73+ tool_info = mock_tool_extractor
74+ init_params_schema = tool_info ["init_params_schema" ]
10375
104- assert rate_limit_var ["name" ] == "API_RATE_LIMIT"
105- assert rate_limit_var ["description" ] == "API rate limit"
106- assert rate_limit_var ["required" ] == False
107- assert rate_limit_var ["default" ] == "100"
76+ assert init_params_schema .keys () == {
77+ "$defs" ,
78+ "properties" ,
79+ "title" ,
80+ "type" ,
81+ }
10882
109- assert len (tool_info ["run_params" ]) == 3
83+ another_parameter = init_params_schema ['properties' ]['another_parameter' ]
84+ assert another_parameter ["description" ] == ""
85+ assert another_parameter ["default" ] == "Another way to define a default value"
86+ assert another_parameter ["type" ] == "string"
87+
88+ my_parameter = init_params_schema ['properties' ]['my_parameter' ]
89+ assert my_parameter ["description" ] == "What a description"
90+ assert my_parameter ["default" ] == "This is default value"
91+ assert my_parameter ["type" ] == "string"
92+
93+ my_parameter_bool = init_params_schema ['properties' ]['my_parameter_bool' ]
94+ assert my_parameter_bool ["default" ] == False
95+ assert my_parameter_bool ["type" ] == "boolean"
96+
97+ def test_extract_env_vars (mock_tool_extractor ):
98+ tool_info = mock_tool_extractor
99+
100+ assert len (tool_info ["env_vars" ]) == 2
101+ api_key_var , rate_limit_var = tool_info ["env_vars" ]
102+ assert api_key_var ["name" ] == "SERPER_API_KEY"
103+ assert api_key_var ["description" ] == "API key for Serper"
104+ assert api_key_var ["required" ] == True
105+ assert api_key_var ["default" ] == None
106+
107+ assert rate_limit_var ["name" ] == "API_RATE_LIMIT"
108+ assert rate_limit_var ["description" ] == "API rate limit"
109+ assert rate_limit_var ["required" ] == False
110+ assert rate_limit_var ["default" ] == "100"
111+
112+ def test_extract_run_params_schema (mock_tool_extractor ):
113+ tool_info = mock_tool_extractor
114+
115+ run_params_schema = tool_info ["run_params_schema" ]
116+ assert run_params_schema .keys () == {
117+ "properties" ,
118+ "required" ,
119+ "title" ,
120+ "type" ,
121+ }
110122
111- params = {p ["name" ]: p for p in tool_info ["run_params" ]}
112- assert params ["query" ]["description" ] == "The query parameter"
113- assert params ["query" ]["type" ] == "str"
114- assert params ["query" ]["default" ] == ""
123+ query_param = run_params_schema ["properties" ]["query" ]
124+ assert query_param ["description" ] == "The query parameter"
125+ assert query_param ["type" ] == "string"
115126
116- assert params ["count" ]["type" ] == "int"
117- assert params ["count" ]["default" ] == 5
127+ count_param = run_params_schema ["properties" ]["count" ]
128+ assert count_param ["type" ] == "integer"
129+ assert count_param ["default" ] == 5
118130
119- assert params ["filters" ]["description" ] == "Optional filters to apply"
120- assert params ["filters" ]["type" ] == "list[str]"
121- assert params ["filters" ]["default" ] == ""
131+ filters_param = run_params_schema ["properties" ]["filters" ]
132+ assert filters_param ["description" ] == "Optional filters to apply"
133+ assert filters_param ["default" ] == None
134+ assert filters_param ['anyOf' ] == [{'items' : {'type' : 'string' }, 'type' : 'array' }, {'type' : 'null' }]
122135
123- assert tool_info ["package_dependencies" ] == ["this-is-a-required-package" , "another-required-package" ]
136+ def test_extract_package_dependencies (mock_tool_extractor ):
137+ tool_info = mock_tool_extractor
138+ assert tool_info ["package_dependencies" ] == ["this-is-a-required-package" , "another-required-package" ]
124139
125140
126141def test_save_to_json (extractor , tmp_path ):
127142 extractor .tools_spec = [{
128143 "name" : "TestTool" ,
129144 "humanized_name" : "Test Tool" ,
130145 "description" : "A test tool" ,
131- "run_params " : [
146+ "run_params_schema " : [
132147 {"name" : "param1" , "description" : "Test parameter" , "type" : "str" }
133148 ]
134149 }]
@@ -144,20 +159,4 @@ def test_save_to_json(extractor, tmp_path):
144159 assert "tools" in data
145160 assert len (data ["tools" ]) == 1
146161 assert data ["tools" ][0 ]["humanized_name" ] == "Test Tool"
147- assert data ["tools" ][0 ]["run_params" ][0 ]["name" ] == "param1"
148-
149-
150- @pytest .mark .integration
151- def test_full_extraction_process ():
152- extractor = ToolSpecExtractor ()
153- specs = extractor .extract_all_tools ()
154-
155- assert len (specs ) > 0
156-
157- for tool in specs :
158- assert "name" in tool
159- assert "humanized_name" in tool and tool ["humanized_name" ]
160- assert "description" in tool
161- assert isinstance (tool ["run_params" ], list )
162- for param in tool ["run_params" ]:
163- assert "name" in param and param ["name" ]
162+ assert data ["tools" ][0 ]["run_params_schema" ][0 ]["name" ] == "param1"
0 commit comments