Skip to main content
Glama
test_utility_functions.cpython-312-pytest-8.4.0.pyc39.6 kB
� PiEh�7� ��dZddlZddlmcmZddlZddlm Z m Z m Z ddl Z ddl Z e jjde jj!e jj!e jj!e����Gd�d�ZGd�d�ZGd�d �ZGd �d �ZGd �d �ZGd�d�Zy)z4Unit tests for utility functions in mcp_hub modules.�N)�Mock�patch� MagicMockc��eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z d�Z e d �e d �d ���Z e d �d ��Z y )�TestUtilityFunctionsz,Test utility functions from mcp_hub modules.c�F�ddlm}|dd�|dd�|dd�y)z%Test validation of non-empty strings.r��validate_non_empty_string�test� test_fieldz whitespace �123N)� mcp_hub.utilsr )�selfr s �QC:\Users\User\PythonProjects\mcp_hub_project\tests\unit\test_utility_functions.py�&test_validate_non_empty_string_successz;TestUtilityFunctions.test_validate_non_empty_string_successs&��;� "�&�,�7�!�"2�L�A�!�%��6�c�N�ddlm}ddlm}t j |�5|dd�ddd�t j |�5|dd�ddd�t j |�5|dd�ddd�y#1swY�XxYw#1swY�=xYw#1swYyxYw)z*Test validation failure for empty strings.rr ��ValidationError�r Nz )rr �mcp_hub.exceptionsr�pytest�raises)rr rs r�&test_validate_non_empty_string_failurez;TestUtilityFunctions.test_validate_non_empty_string_failures���;�6��]�]�?� +� 8� %�b�,� 7� 8��]�]�?� +� ;� %�e�\� :� ;��]�]�?� +� :� %�d�L� 9� :� :�  8� 8�� ;� ;�� :� :�s#� B� B�0 B�B �B�B$c���ddlm}ddl}d}||�}ddd�}||k(}|s�tjd|fd ||f�d t j �vstj|�rtj|�nd tj|�d �z}d d |iz}ttj|���dx}}d} || �}ddi}||k(}|s�tjd|fd ||f�d t j �vstj|�rtj|�nd tj|�d �z}d d |iz}ttj|���dx}}y)zTest JSON extraction from text.r��extract_json_from_textNz{"key": "value", "number": 123}�value�{)�key�number��==�z%(py0)s == %(py3)s�result��py0�py3�assert %(py5)s�py5z4Some text before {"extracted": true} some text after� extractedT) rr�json� @pytest_ar�_call_reprcompare� @py_builtins�locals�_should_repr_global_name� _saferepr�AssertionError�_format_explanation) rrr,� json_textr%� @py_assert2� @py_assert1� @py_format4� @py_format6� mixed_texts r�#test_extract_json_from_text_successz8TestUtilityFunctions.test_extract_json_from_text_success's���8��6� �'� �2��!(�C�8�8�v�8�8�8�8�8�v�8�8�8�8�8�8�8�v�8�8�8�v�8�8�8�8�8�8�8�8�8�8�8�L� �'� �3��%�t�,�,�v�,�,�,�,�,�v�,�,�,�,�,�,�,�v�,�,�,�v�,�,�,�,�,�,�,�,�,�,�,rc��ddlm}ddl}tj|j �5|d�ddd�tj|j �5|d�ddd�y#1swY�:xYw#1swYyxYw)zTest JSON extraction failure.rrNzInvalid JSON textzNo JSON here at all)rrr,rr�JSONDecodeError)rrr,s r�#test_extract_json_from_text_failurez8TestUtilityFunctions.test_extract_json_from_text_failure6sq��8���]�]�4�/�/� 0� 8� "�#6� 7� 8��]�]�4�/�/� 0� :� "�#8� 9� :� :� 8� 8�� :� :�s� A,� A8�,A5�8Bc�L�ddlm}d}||�}d}||v}|s�tjd|fd||f�tj|�dt j �vstj|�rtj|�ndd�z}d d |iz}ttj|���d x}}d }||v}|s�tjd|fd||f�tj|�dt j �vstj|�rtj|�ndd�z}d d |iz}ttj|���d x}}d }||v}|s�tjd|fd||f�tj|�dt j �vstj|�rtj|�ndd�z}d d |iz}ttj|���d x}}d}||v}|s�tjd|fd||f�tj|�dt j �vstj|�rtj|�ndd�z}d d |iz}ttj|���d x}}y )zTest URL extraction from text.r)�extract_urls_from_textz� Check out https://example.com and http://test.org. Also visit https://github.com/user/repo and ftp://files.example.com Email me at user@example.com (should not be extracted as URL) zhttps://example.com��in�z%(py1)s in %(py3)s�urls��py1r(r)r*Nzhttp://test.orgzhttps://github.com/user/repozuser@example.com)�not in)z%(py1)s not in %(py3)s) rr@r-r.r2r/r0r1r3r4)rr@�textrD� @py_assert0r6r8r9s r�test_extract_urls_from_textz0TestUtilityFunctions.test_extract_urls_from_textBs���8� �� &�d�+��%�,�$��,�,�,�,�$��,�,�,�$�,�,�,�,�,�,��,�,�,��,�,�,�,�,�,�,� �(� �D�(�(�(�(� �D�(�(�(� �(�(�(�(�(�(�D�(�(�(�D�(�(�(�(�(�(�(�-�5�-��5�5�5�5�-��5�5�5�-�5�5�5�5�5�5��5�5�5��5�5�5�5�5�5�5�"�-�!��-�-�-�-�!��-�-�-�!�-�-�-�-�-�-��-�-�-��-�-�-�-�-�-�-rc�|�ddlm}td�5}t�}d|_d|_||_|d�}d}||v}|s�tjd|fd ||f�tj|�d tj�vstj|�rtj|�nd d �z}d d |iz}ttj|���dx}}d}||v}|s�tjd|fd ||f�tj|�d tj�vstj|�rtj|�nd d �z}d d |iz}ttj|���dx}}d}||v}|s�tjd|fd ||f�tj|�d tj�vstj|�rtj|�nd d �z}d d |iz}ttj|���dx}}ddd�y#1swYyxYw)zTest APA citation creation.r��create_apa_citation� requests.get��aC <html> <head> <title>Test Article Title</title> <meta name="author" content="John Doe"> <meta name="description" content="Test description"> </head> <body>Content</body> </html> zhttps://example.com/articlezTest Article TitlerArC�citationrEr)r*N� example.com�2025)rrMrr� status_coderH� return_valuer-r.r2r/r0r1r3r4) rrM�mock_get� mock_responserPrIr6r8r9s r� test_create_apa_citation_successz5TestUtilityFunctions.test_create_apa_citation_successWsd��5� �>� "� &�h� �F�M�(+�M� %� "�M� �%2�H� !�+�+H�I�H�(� 3�'�8�3� 3� 3� 3�'�8� 3� 3� 3�'� 3� 3� 3� 3� 3� 3�8� 3� 3� 3�8� 3� 3� 3� 3� 3� 3� 3� � ,�=�H�,� ,� ,� ,�=�H� ,� ,� ,�=� ,� ,� ,� ,� ,� ,�H� ,� ,� ,�H� ,� ,� ,� ,� ,� ,� ,�� %�6�X�%� %� %� %�6�X� %� %� %�6� %� %� %� %� %� %�X� %� %� %�X� %� %� %� %� %� %� %�- &� &� &�s �HH2�2H;c���ddlm}td�5}td�|_|d�}d}||v}|s�t j d|fd||f�t j|�d tj�vst j|�rt j|�nd d �z}d d |iz}tt j|���d x}}g}d}||v} | }| sd} | |v} | }|�sXt j d| fd||f�t j|�d tj�vst j|�rt j|�nd d�z}dd|iz} |j| �| s�t j d fd |f�t j| �d tj�vst j|�rt j|�nd d�z} dd| iz}|j|�t j|d�iz}dd|iz}tt j|���d x}x}x}x} x} } d d d �y #1swYy xYw)z)Test APA citation creation with failures.rrLrNz Network errorzhttps://example.com/unreachablerQrArCrPrEr)r*N� Retrieved�Access)z%(py3)s in %(py5)s)r(r*�%(py7)s�py7)z%(py10)s in %(py12)s)�py10�py12�%(py14)s�py14��assert %(py17)s�py17)rrMr� Exception� side_effectr-r.r2r/r0r1r3r4�append�_format_boolop)rrMrUrPrIr6r8r9r7� @py_assert4� @py_assert9� @py_assert11� @py_format8� @py_format13� @py_format15� @py_format16� @py_format18s r� test_create_apa_citation_failurez5TestUtilityFunctions.test_create_apa_citation_failuressb��5� �>� "� C�h�#,�_�#=�H� �+�+L�M�H�!� ,�=�H�,� ,� ,� ,�=�H� ,� ,� ,�=� ,� ,� ,� ,� ,� ,�H� ,� ,� ,�H� ,� ,� ,� ,� ,� ,� ,� B�;� B�;�(�*� B�h� B�h�(�.B� B� B� B� B�;�(� B� B� B�;� B� B� B� B� B� B�(� B� B� B�(� B� B� B� B� B� B� B�h�(� B� B� B�h� B� B� B� B� B� B�(� B� B� B�(� B� B� B� B� B� B� B� B� B� B� B� B� B� B� C� C� C�s �H9I�Izmcp_hub.utils.openai.OpenAIz!mcp_hub.utils.anthropic.Anthropicc��ddlm}t�}||_t�}t�g|_d|jdj _||jjj_td�5}d|_ d|_ |ddd d �gd � �}d}||k(} | s�tjd | fd||f�dtj �vstj"|�rtj$|�ndtj$|�d�z} dd| iz} t'tj(| ���dx} }|jjjj+�ddd�y#1swYyxYw)z Test LLM completion with OpenAI.r��make_llm_completionzOpenAI response�mcp_hub.config.api_config�openai�test-keyz gpt-3.5-turbo�user�Test��role�content�ffffff�?��model�messages� temperaturer"r$r%r&r)r*N)rrsrrT�choices�messager{�chat� completions�creater� llm_provider�openai_api_keyr-r.r/r0r1r2r3r4�assert_called_once) r�mock_anthropic� mock_openairs� mock_clientrV� mock_configr%r6r7r8r9s r�test_make_llm_completion_openaiz4TestUtilityFunctions.test_make_llm_completion_openai�s+�� 6��f� �#.� � ��� �!%��� ��3D� ���a� �(�(�0�;H� ���$�$�+�+�8� �.� /� E�;�'/�K� $�)3�K� &�)�%�#)�f�=�>���F�/� .�6�.�.� .� .� .�6�.� .� .� .� .� .� .�6� .� .� .�6� .� .� .�.� .� .� .� .� .� .� .� � � � (� (� /� /� B� B� D� E� E� E�s �C2E;�;Fc���ddlm}t�}||_t�}t�g|_d|jd_||j j_td�5}d|_ d|_ |ddd d �gd � �}d}||k(}|s�tjd |fd||f�dtj�vstj|�rtj |�ndtj |�d�z} dd| iz} t#tj$| ���dx}}|j jj'�ddd�y#1swYyxYw)z#Test LLM completion with Anthropic.rrrzAnthropic responsert� anthropicrvzclaude-3-sonnet-20240229rwrxryr|r}r"r$r%r&r)r*N)rrsrrTr{rHrr�rr��anthropic_api_keyr-r.r/r0r1r2r3r4r�) rr�rsr�rVr�r%r6r7r8r9s r�"test_make_llm_completion_anthropicz7TestUtilityFunctions.test_make_llm_completion_anthropic�s�� 6��f� �&1��#��� �!%��� ��(<� ���a� �%�3@� ���#�#�0� �.� /� =�;�'2�K� $�,6�K� )�)�0�#)�f�=�>���F�2� 1�6�1�1� 1� 1� 1�6�1� 1� 1� 1� 1� 1� 1�6� 1� 1� 1�6� 1� 1� 1�1� 1� 1� 1� 1� 1� 1� 1� � � � '� '� :� :� <� =� =� =�s �,C(E�E&N)�__name__� __module__� __qualname__�__doc__rrr;r>rJrWrprr�r��rrrr sm��6�7� :� -� :�.�*&�8 C� � (�)� � .�/�E�0�*�E�8 � .�/�=�0�=rrc�(�eZdZdZd�Zd�Zd�Zd�Zy)�TestExceptionHandlingzTest custom exception classes.c�b�ddlm}|dd�}|j}d}||k(}|s�tjd|fd||f�dt j �vstj|�rtj|�ndtj|�tj|�d�z}d d |iz}ttj|���d x}x}}|j}d}||k(}|s�tjd|fd ||f�dt j �vstj|�rtj|�ndtj|�tj|�d�z}d d |iz}ttj|���d x}x}}t|�}d } || k(}|s�tjd|fd|| f�dt j �vstjt�rtjt�nddt j �vstj|�rtj|�ndtj|�tj| �d�z} dd| iz} ttj| ���d x}x}} y )z!Test APIError exception creation.r)�APIError� test_service�Test error messager")z/%(py2)s {%(py2)s = %(py0)s.service } == %(py5)s�error�r'�py2r*�assert %(py7)sr\N)z/%(py2)s {%(py2)s = %(py0)s.message } == %(py5)sz-API Error in test_service: Test error message�z0%(py3)s {%(py3)s = %(py0)s(%(py1)s) } == %(py6)s�str�r'rFr(�py6�assert %(py8)s�py8) rr��servicer-r.r/r0r1r2r3r4r�r�) rr�r�r7rh� @py_assert3r9rkr6� @py_assert5� @py_format7� @py_format9s r�test_api_error_creationz-TestExceptionHandling.test_api_error_creation�s���/���)=�>���}�}�.��.�}��.�.�.�.�}��.�.�.�.�.�.�u�.�.�.�u�.�.�.�}�.�.�.��.�.�.�.�.�.�.��}�}�4� 4�4�}� 4�4�4�4�4�}� 4�4�4�4�4�4�4�u�4�4�4�u�4�4�4�}�4�4�4� 4�4�4�4�4�4�4�4��5�z�L�L�L�z�L�L�L�L�L�z�L�L�L�L�L�L�L�s�L�L�L�s�L�L�L�L�L�L�5�L�L�L�5�L�L�L�z�L�L�L�L�L�L�L�L�L�L�Lrc�@�ddlm}|d�}t|�}d}||k(}|s�tjd|fd||f�dt j �vstjt�rtjt�nddt j �vstj|�rtj|�ndtj|�tj|�d �z}d d |iz}ttj|���d x}x}}y ) z(Test ValidationError exception creation.rrzInvalid input formatz&Validation Error: Invalid input formatr"r�r�r�r�r�r�N) rrr�r-r.r/r0r1r2r3r4)rrr�r6r�rhr�r�s r�test_validation_error_creationz4TestExceptionHandling.test_validation_error_creation�s���6�� 6�7���5�z�E�E�E�z�E�E�E�E�E�z�E�E�E�E�E�E�E�s�E�E�E�s�E�E�E�E�E�E�5�E�E�E�5�E�E�E�z�E�E�E�E�E�E�E�E�E�E�Erc�@�ddlm}|d�}t|�}d}||k(}|s�tjd|fd||f�dt j �vstjt�rtjt�nddt j �vstj|�rtj|�ndtj|�tj|�d �z}d d |iz}ttj|���d x}x}}y ) z,Test CodeGenerationError exception creation.r)�CodeGenerationErrorzFailed to generate codez.Code Generation Error: Failed to generate coder"r�r�r�r�r�r�N) rr�r�r-r.r/r0r1r2r3r4)rr�r�r6r�rhr�r�s r�#test_code_generation_error_creationz9TestExceptionHandling.test_code_generation_error_creation�s���:�#�$=�>���5�z�M�M�M�z�M�M�M�M�M�z�M�M�M�M�M�M�M�s�M�M�M�s�M�M�M�M�M�M�5�M�M�M�5�M�M�M�z�M�M�M�M�M�M�M�M�M�M�Mrc�@�ddlm}|d�}t|�}d}||k(}|s�tjd|fd||f�dt j �vstjt�rtjt�nddt j �vstj|�rtj|�ndtj|�tj|�d �z}d d |iz}ttj|���d x}x}}y ) z+Test CodeExecutionError exception creation.r)�CodeExecutionErrorzRuntime error in codez+Code Execution Error: Runtime error in coder"r�r�r�r�r�r�N) rr�r�r-r.r/r0r1r2r3r4)rr�r�r6r�rhr�r�s r�"test_code_execution_error_creationz8TestExceptionHandling.test_code_execution_error_creation�s���9�"�#:�;���5�z�J�J�J�z�J�J�J�J�J�z�J�J�J�J�J�J�J�s�J�J�J�s�J�J�J�J�J�J�5�J�J�J�5�J�J�J�z�J�J�J�J�J�J�J�J�J�J�JrN)r�r�r�r�r�r�r�r�r�rrr�r��s��(�M�F�N�Krr�c�"�eZdZdZd�Zd�Zd�Zy)�TestConfigurationManagementzTest configuration management.c�F�ddlm}|ddd��}|j}d}||k(}|s�tjd|fd||f�d t j �vstj|�rtj|�nd tj|�tj|�d �z}d d |iz}ttj|���d x}x}}|j}d}||k(}|s�tjd|fd||f�d t j �vstj|�rtj|�nd tj|�tj|�d �z}d d |iz}ttj|���d x}x}}y )zTest APIConfig initialization.r)� APIConfig� test_providerz tvly-test-keyrv)r��tavily_api_key�nebius_api_keyr")z4%(py2)s {%(py2)s = %(py0)s.llm_provider } == %(py5)s�configr�r�r\N)z6%(py2)s {%(py2)s = %(py0)s.tavily_api_key } == %(py5)s) �mcp_hub.configr�r�r-r.r/r0r1r2r3r4r�)rr�r�r7rhr�r9rks r�test_api_config_initializationz:TestConfigurationManagement.test_api_config_initialization�s��,��(�*�%� �� �"�"�5�o�5�"�o�5�5�5�5�"�o�5�5�5�5�5�5�v�5�5�5�v�5�5�5�"�5�5�5�o�5�5�5�5�5�5�5��$�$�7��7�$��7�7�7�7�$��7�7�7�7�7�7�v�7�7�7�v�7�7�7�$�7�7�7��7�7�7�7�7�7�7rc�h�ddlm}|�}|jdd�}|jdd�}|jdd�}d}||u}|s�tjd|fd ||f�d t j �vstj|�rtj|�nd tj|�d �z}d d |iz} ttj| ���dx}}d}||u}|s�tjd|fd ||f�dt j �vstj|�rtj|�ndtj|�d �z}d d |iz} ttj| ���dx}}d}||u}|s�tjd|fd ||f�dt j �vstj|�rtj|�ndtj|�d �z}d d |iz} ttj| ���dx}}y)z1Test model configuration for different providers.r)� ModelConfig�question_enhancer�nebiusrur�N��is not�z%(py0)s is not %(py3)s� nebius_modelr&r)r*� openai_model�anthropic_model) r�r��get_model_for_providerr-r.r/r0r1r2r3r4) rr�r�r�r�r�r6r7r8r9s r�$test_model_config_provider_selectionz@TestConfigurationManagement.test_model_config_provider_selection�sR��.�����4�4�5H�(�S� ��4�4�5H�(�S� � �7�7�8K�[�Y��#'�'�|�4�'�'�'�'�|�4�'�'�'�'�'�'�|�'�'�'�|�'�'�'�4�'�'�'�'�'�'�'�#'�'�|�4�'�'�'�'�|�4�'�'�'�'�'�'�|�'�'�'�|�'�'�'�4�'�'�'�'�'�'�'�&*�*��d�*�*�*�*��d�*�*�*�*�*�*��*�*�*��*�*�*�d�*�*�*�*�*�*�*rc�z�ddlm}|�}|j}d}||k(}|s�tjd|fd||f�dt j �vstj|�rtj|�ndtj|�tj|�d�z}dd |iz}ttj|���d x}x}}|j}d }||k\}|s�tjd |fd ||f�dt j �vstj|�rtj|�ndtj|�tj|�d�z}dd |iz}ttj|���d x}x}}|j}d }||k\}|s�tjd |fd||f�dt j �vstj|�rtj|�ndtj|�tj|�d�z}dd |iz}ttj|���d x}x}}d}|j} || k} d} | | k}| r|s�tjd| |fd|| | f�tj|�dt j �vstj|�rtj|�ndtj| �tj| �d�z} dd| iz} ttj| ���d x}x} x}x} } d}|j} || k} d} | | k}| r|s�tjd| |fd|| | f�tj|�dt j �vstj|�rtj|�ndtj| �tj| �d�z} dd| iz} ttj| ���d x}x} x}x} } y )z(Test application configuration defaults.r)� AppConfigzmy-sandbox-appr")z6%(py2)s {%(py2)s = %(py0)s.modal_app_name } == %(py5)sr�r�r�r\Nra��>=)z:%(py2)s {%(py2)s = %(py0)s.max_search_results } >= %(py5)s)zD%(py2)s {%(py2)s = %(py0)s.max_code_generation_attempts } >= %(py5)sgg�?)�<=r�)z7%(py1)s <= %(py6)s {%(py6)s = %(py4)s.llm_temperature }z7%(py6)s {%(py6)s = %(py4)s.llm_temperature } <= %(py8)s)rF�py4r�r��assert %(py10)sr])z<%(py1)s <= %(py6)s {%(py6)s = %(py4)s.code_gen_temperature }z<%(py6)s {%(py6)s = %(py4)s.code_gen_temperature } <= %(py8)s)r�r��modal_app_namer-r.r/r0r1r2r3r4�max_search_results�max_code_generation_attempts�llm_temperature�code_gen_temperature)rr�r�r7rhr�r9rkrIr�r6� @py_assert7r�� @py_format11s r�test_app_config_defaultsz4TestConfigurationManagement.test_app_config_defaultss���,�����$�$�8�(8�8�$�(8�8�8�8�8�$�(8�8�8�8�8�8�8�v�8�8�8�v�8�8�8�$�8�8�8�(8�8�8�8�8�8�8�8��(�(�-�A�-�(�A�-�-�-�-�(�A�-�-�-�-�-�-�v�-�-�-�v�-�-�-�(�-�-�-�A�-�-�-�-�-�-�-��2�2�7�a�7�2�a�7�7�7�7�2�a�7�7�7�7�7�7�v�7�7�7�v�7�7�7�2�7�7�7�a�7�7�7�7�7�7�7��3�f�,�,�3�s�,�3�3��3�,��3�3�3�3�3�s�,��3�3�3�s�3�3�3�3�3�3�f�3�3�3�f�3�3�3�,�3�3�3��3�3�3�3�3�3�3��8�f�1�1�8�s�1�8�8�S�8�1�S�8�8�8�8�8�s�1�S�8�8�8�s�8�8�8�8�8�8�f�8�8�8�f�8�8�8�1�8�8�8�S�8�8�8�8�8�8�8�8rN)r�r�r�r�r�r�r�r�rrr�r��s��(� 8� +�$ 9rr�c�(�eZdZdZd�Zd�Zd�Zd�Zy)�TestLoggingConfigurationzTest logging configuration.c���ddlm}d}||u}|s�tjd|fd||f�dt j �vstj |�rtj|�ndtj|�d�z}dd |iz}ttj|���dx}}|j}d }||k(}|s�tjd |fd ||f�dt j �vstj |�rtj|�ndtj|�tj|�d �z}dd|iz}ttj|���dx}x}}y)zTest logger instance creation.r��loggerNr�r�r�r&r)r*�mcp_hubr")z,%(py2)s {%(py2)s = %(py0)s.name } == %(py5)sr�r�r\) �mcp_hub.logging_configr�r-r.r/r0r1r2r3r4�name) rr�r6r7r8r9rhr�rks r�test_logger_creationz-TestLoggingConfiguration.test_logger_creations���1�!�!�v�T�!�!�!�!�v�T�!�!�!�!�!�!�v�!�!�!�v�!�!�!�T�!�!�!�!�!�!�!��{�{�'�i�'�{�i�'�'�'�'�{�i�'�'�'�'�'�'�v�'�'�'�v�'�'�'�{�'�'�'�i�'�'�'�'�'�'�'rc�>�ddlm}ddl}|j}|j}||k}|s�t j d|fd||f�dtj�vst j|�rt j|�ndt j|�dtj�vst j|�rt j|�ndt j|�d�z}d d |iz}tt j|���dx}x}}y) z Test logger level configuration.rr�N)r�)zG%(py2)s {%(py2)s = %(py0)s.level } <= %(py6)s {%(py6)s = %(py4)s.INFO }r��logging)r'r�r�r�r�r�) r�r�r��level�INFOr-r.r/r0r1r2r3r4)rr�r�r7r�r�r�r�s r�test_logger_level_settingz2TestLoggingConfiguration.test_logger_level_settings���1���|�|�+�w�|�|�+�|�|�+�+�+�+�|�|�+�+�+�+�+�+�v�+�+�+�v�+�+�+�|�+�+�+�+�+�+�w�+�+�+�w�+�+�+�|�+�+�+�+�+�+�+rc�v�ddlm}|j}t|�}d}||k\}|�s t j d|fd||f�dt j�vst jt�rt jt�nddt j�vst j|�rt j|�ndt j|�t j|�t j|�d�z}d d |iz}tt j|���d x}x}x}}y ) z#Test logger handlers configuration.rr�rar�)zN%(py5)s {%(py5)s = %(py0)s(%(py3)s {%(py3)s = %(py1)s.handlers }) } >= %(py8)s�lenr�)r'rFr(r*r�r�r]N) r�r��handlersr�r-r.r/r0r1r2r3r4)rr�r6rhr�� @py_assert6r�r�s r�test_logger_handlersz-TestLoggingConfiguration.test_logger_handlers&s���1��?�?�(�s�?�#�(�q�(�#�q�(�(�(�(�#�q�(�(�(�(�(�(�s�(�(�(�s�(�(�(�(�(�(�6�(�(�(�6�(�(�(�?�(�(�(�#�(�(�(�q�(�(�(�(�(�(�(rc��ddlm}ddl}td�5}|j d�|j d�|j d�ddd�y#1swYyxYw)z"Test actual logging functionality.rr�Nzlogging.StreamHandlerzTest info messagezTest warning messager�)r�r�r�r�info�warningr�)rr�r�� mock_handlers r�test_logging_functionalityz3TestLoggingConfiguration.test_logging_functionality-sO��1�� �*� +� /�|� �K�K�+� ,� �N�N�1� 2� �L�L�-� .�  /� /� /�s �4A�AN)r�r�r�r�r�r�r�r�r�rrr�r�s��%�(�,�)� /rr�c�2�eZdZdZed�d��Zd�Zy)�TestPerformanceMonitoringz*Test performance monitoring functionality.�%mcp_hub.performance_monitoring.psutilc�<�ddlm}|�}d}||u}|s�tjd|fd||f�dt j �vstj |�rtj|�ndtj|�d�z}dd |iz}ttj|���dx}}d }t||�}|s�d d t j �vstj t�rtjt�nd dt j �vstj |�rtj|�ndtj|�tj|�d �z}ttj|���dx}}y)z&Test metrics collector initialization.r��MetricsCollectorNr�r�� collectorr&r)r*�metricsz5assert %(py5)s {%(py5)s = %(py0)s(%(py1)s, %(py3)s) }�hasattr)r'rFr(r*) �mcp_hub.performance_monitoringr�r-r.r/r0r1r2r3r4r�) r� mock_psutilr�r�r6r7r8r9rhs r�%test_metrics_collector_initializationz?TestPerformanceMonitoring.test_metrics_collector_initialization>s��� D�$�&� � $�$�y��$�$�$�$�y��$�$�$�$�$�$�y�$�$�$�y�$�$�$��$�$�$�$�$�$�$�"+�,�w�y�)�,�,�,�,�,�,�,�,�w�,�,�,�w�,�,�,�,�,�,�y�,�,�,�y�,�,�,�)�,�,�,�,�,�,�,�,�,�,rc�.�td�5ddlm}|�}|jddddi�|j dd ddi�d }|s8d d t j |�iz}tt j|���d }d d d �y #1swYy xYw)z$Test metric recording functionality.r�rr�� test_metricg�?�tagr� test_counterraTzassert %(py1)srFN) rr�r�� record_metric�increment_counterr-r2r3r4)rr�r�rI� @py_format2s r�test_metrics_recordingz0TestPerformanceMonitoring.test_metrics_recordingGsv�� �:� ;� � G�(�*�I� � #� #�M�3���8H� I� � '� '���E�7�;K� L��K�4�K�K�K�4�K�K�K�K�K� � � �s �A6B � BN)r�r�r�r�rr�rr�rrr�r�;s"��4� � 2�3�-�4�-� rr�c��eZdZdZed�ed�d���Zed�ed�ed�d����Zy) �TestCacheUtilitieszTest caching utilities.z os.makedirszos.path.existsc��d|_ddlm}|d�}d}||u}|s�tjd|fd||f�dt j �vstj|�rtj|�ndtj|�d �z}d d |iz}ttj|���dx}}|j�y) z"Test cache manager initialization.Fr�� CacheManager� test_cacheNr�r�� cache_managerr&r)r*) rT�mcp_hub.cache_utilsr r-r.r/r0r1r2r3r4r�) r� mock_exists� mock_makedirsr r r6r7r8r9s r�!test_cache_manager_initializationz4TestCacheUtilities.test_cache_manager_initializationYs~��$)� � �4�$�\�2� �$(�(�}�D�(�(�(�(�}�D�(�(�(�(�(�(�}�(�(�(�}�(�(�(�D�(�(�(�(�(�(�(��(�(�*rz pickle.dumpz pickle.loadc�|�ddlm}d|_d|_|d�}|jddd� �|j d�}g}d }||u} | } | sd } || u} | } | �sXt j d | fd ||f�d tj�vst j|�rt j|�nd t j|�d�z} dd| iz}|j|�| s�t j d fd| f�d tj�vst j|�rt j|�nd t j| �d�z}dd|iz}|j|�t j|d�iz}dd|iz}tt j|���d x} x}x} x}x} } y )z"Test cache set and get operations.rr T� cached_valuer �test_key� test_valuei,)�ttlNr�)z%(py2)s is not %(py5)sr)r�r*r[r\)�is)z%(py9)s is %(py12)s)�py9r^r_r`rarbrc)r r rT�set�getr-r.r/r0r1r2rfrgr3r4)r� mock_load� mock_dumprr r rr7rhr�rIrj� @py_assert10r9rkrlrmrnros r�test_cache_operationsz(TestCacheUtilities.test_cache_operationses�� 5�#'� � �!/� ��$�\�2� � ���*�l���<��!�!�*�-�� 2�D�1�u�D� �1�T�1�E�T�M�1�1�1�1�u�D�1�1�1�1�1�1�u�1�1�1�u�1�1�1�D�1�1�1�1�1�1�1�E�T�1�1�1�1�1�1�E�1�1�1�E�1�1�1�T�1�1�1�1�1�1�1�1�1�1�1�1�1�1rN)r�r�r�r�rrrr�rrrrVs^��!� �=�� � ��+���+� � �� �=�� �=��2����2rr)r��builtinsr/�_pytest.assertion.rewrite� assertion�rewriter-r� unittest.mockrrr�sys�os�path�insert�dirname�__file__rr�r�r�r�rr�rr�<module>r)s���:��� �0�0� � �������2�7�7�?�?�2�7�7�?�?�2�7�7�?�?�8�3L�#M�N�O�o=�o=�d#K�#K�L-9�-9�`"/�"/�N��6"2�"2r

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CodeHalwell/gradio-mcp-agent-hack'

If you have feedback or need assistance with the MCP directory API, please join our Discord server