Skip to main content
Glama

URL Reputation and Validity Checker

by prismon
test_validators.cpython-313-pytest-8.3.5.pyc61.2 kB
� ��7h�5���SrSSKrSSKJs Jr SSKrSSKJ r J r J r J r SSK r SSKrSSKJr SSKJr SSKJrJrJr "SS5rg) zUnit tests for validators.py�N)�Mock� AsyncMock�patch� MagicMock)�datetime�� URLValidator)�URLValidationResult�ConfidenceLevel�ValidationLevelc��\rSrSrSr\R S5r\R S5rSr Sr \RRS5r Sr\RRS 5r\RRS 5r\RRS 5r\RRS 5r\RRS 5r\RRS5r\RRS5r\RRS5r\RRS5r\RRS5rSrSrSrSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%S r&S!r'S"r(\RRS#5r)\RRS$5r*S%r+g&)'�TestURLValidator�zTest suite for URLValidator.c��[SSS9$)zCreate a URLValidator instance.�$@zTest-Agent/1.0��timeout� user_agentr)�selfs �L/home/josh/Projects/reputation-and-validity-checker/tests/test_validators.py� validator�TestURLValidator.validators���D�5E�F�F�c�r�[5nSUlSUlSUlSS0UlSUl/UlU$)zCreate a mock httpx response.��� Test contentz Test content� content-type� text/html�https://example.com)r� status_code�content�text�headers�url�history)r�responses r�mock_httpx_response�$TestURLValidator.mock_httpx_responsesC���6��"���*���&�� �*�K�8���,�� �����rc� �[5nURnSo2U:HoD(d�[R"SU4SX#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=pCURnS o2U:HoD(d�[R"SU4S X#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=pCURnSo2ULoD(d�[R"S U4S X#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=pCg) z!Test URLValidator initialization.r��==�z/%(py2)s {%(py2)s = %(py0)s.timeout } == %(py5)sr��py0�py2�py5�assert %(py7)s�py7NzURL-Reputation-Checker/1.0�z2%(py2)s {%(py2)s = %(py0)s.user_agent } == %(py5)s��is)z.%(py2)s {%(py2)s = %(py0)s.client } is %(py5)s) r r� @pytest_ar�_call_reprcompare� @py_builtins�locals�_should_repr_global_name� _saferepr�AssertionError�_format_explanationr�client�rr� @py_assert1� @py_assert4� @py_assert3� @py_format6� @py_format8s r� test_init�TestURLValidator.test_init%se�� �N� �� � �(�D�(�D�(�(�(�(�(� �(�(�(�(�(�(�y�(�(�(�(�y�(�(�(� �(�(�(�D�(�(�(�(�(�(�(��#�#�C�'C�C�'C�C�C�C�C�C�#�C�C�C�C�C�C�y�C�C�C�C�y�C�C�C�#�C�C�C�'C�C�C�C�C�C�C�C����'�4�'�4�'�'�'�'�'��'�'�'�'�'�'�y�'�'�'�'�y�'�'�'��'�'�'�4�'�'�'�'�'�'�'rc�t�[SSS9nURnSo2U:HoD(d�[R"SU4SX#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n[[R"U55eS =n=pCURnSo2U:HoD(d�[R"SU4S X#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n[[R"U55eS =n=pCg ) z8Test URLValidator initialization with custom parameters.g@z Custom-Agentrr*r,rr-r1r2Nr3) r rr6r7r8r9r:r;r<r=rr?s r�test_init_custom_params�(TestURLValidator.test_init_custom_params,s��� ���H� �� � �'�C�'�C�'�'�'�'�'� �'�'�'�'�'�'�y�'�'�'�'�y�'�'�'� �'�'�'�C�'�'�'�'�'�'�'��#�#�5�~�5�~�5�5�5�5�5�#�5�5�5�5�5�5�y�5�5�5�5�y�5�5�5�#�5�5�5�~�5�5�5�5�5�5�5rc ��L# �[5IShv�N nURnSo2ULoD(d�[R"SU4SX#45S[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=pCURn[Rn[Xx5o�(GdUSS [R "5;d[R "[5(a[R"[5OS S[R "5;d[R "U5(a[R"U5OS[R"U5S [R "5;d[R "[5(a[R"[5OS [R"U5[R"U 5S .-n [[R"U 55eS=n=p�SSS5IShv�N gGNtN!,IShv�N (df  g=f7f) zTest async context manager.N)�is not)z2%(py2)s {%(py2)s = %(py0)s.client } is not %(py5)srr-r1r2zrassert %(py8)s {%(py8)s = %(py0)s(%(py3)s {%(py3)s = %(py1)s.client }, %(py6)s {%(py6)s = %(py4)s.AsyncClient }) }� isinstance�httpx)r.�py1�py3�py4�py6�py8) r r>r6r7r8r9r:r;r<r=rM� AsyncClientrL) rrr@rArBrCrD� @py_assert2� @py_assert5� @py_assert7� @py_format9s r�test_context_manager�%TestURLValidator.test_context_manager2sS��� �>�>�Y��#�#� /�4� /�4�/� /� /� /� /�#� /� /� /� /� /� /�9� /� /� /� /�9� /� /� /�#� /� /� /�4� /� /� /� /� /� /� /�'�.�.� B��0A�0A� B�:�.�B� B�B� B� B� B� B� B� B�:� B� B� B� B�:� B� B� B� B� B� B�i� B� B� B� B�i� B� B� B�.� B� B� B� B� B� B�� B� B� B� B�� B� B� B�0A� B� B� B�B� B� B� B� B� B� B�"�>�>�>�>�>�sE�J$�J�J$�IJ �4 J$�?J�J$�J$� J!�J � J!�J$c� �URnSo2"U5nSoTULof(d�[R"SU4SXE45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n[[R"U55eS =n=n=n=peURnS o2"U5nSoTULof(d�[R"SU4SXE45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n[[R"U55eS =n=n=n=peURnS o2"U5nS oTULof(d�[R"SU4SXE45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n[[R"U55eS =n=n=n=peURnS o2"U5nS oTULof(d�[R"SU4SXE45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n[[R"U55eS =n=n=n=peURnSo2"U5nSoTULof(d�[R"SU4SXE45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n[[R"U55eS =n=n=n=peg )zTest URL format validation.rTr4)zR%(py6)s {%(py6)s = %(py2)s {%(py2)s = %(py0)s.is_valid_url }(%(py4)s) } is %(py9)sr)r.r/rPrQ�py9zassert %(py11)s�py11Nzhttp://test.com/pathz not-a-urlF�zftp://example.com) � is_valid_urlr6r7r8r9r:r;r<r=) rrr@rBrU� @py_assert8rV� @py_format10� @py_format12s r�test_is_valid_url�"TestURLValidator.test_is_valid_url:s���%�%�D�&;�D�%�&;�<�D��D��D�D�D�D�D�<�D�D�D�D�D�D�y�D�D�D�D�y�D�D�D�%�D�D�D�&;�D�D�D�<�D�D�D��D�D�D�D�D�D�D��%�%�E�&<�E�%�&<�=�E��E��E�E�E�E�E�=�E�E�E�E�E�E�y�E�E�E�E�y�E�E�E�%�E�E�E�&<�E�E�E�=�E�E�E��E�E�E�E�E�E�E��%�%�;�k�;�%�k�2�;�e�;�e�;�;�;�;�;�2�;�;�;�;�;�;�y�;�;�;�;�y�;�;�;�%�;�;�;�k�;�;�;�2�;�;�;�e�;�;�;�;�;�;�;��%�%�2�b�2�%�b�)�2�U�2�U�2�2�2�2�2�)�2�2�2�2�2�2�y�2�2�2�2�y�2�2�2�%�2�2�2�b�2�2�2�)�2�2�2�U�2�2�2�2�2�2�2��%�%�B�&9�B�%�&9�:�B�d�B�d�B�B�B�B�B�:�B�B�B�B�B�B�y�B�B�B�B�y�B�B�B�%�B�B�B�&9�B�B�B�:�B�B�B�d�B�B�B�B�B�B�B�Brc�� # �UIShv�N URS5IShv�N nSSS5IShv�N [W[5o3(Gd+SS[R"5;d[ R "[5(a[ R"[5OSS[R"5;d[ R "U5(a[ R"U5OSS[R"5;d[ R "[5(a[ R"[5OS[ R"U5S.-n[[ R"U55eSnURnSoeULo3(d�[ R"S U4S XV45S[R"5;d[ R "U5(a[ R"U5OS[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS=n=p6URnSoeU:Ho3(d�[ R"SU4SXV45S[R"5;d[ R "U5(a[ R"U5OS[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS=n=p6So�RoiU;o�(d�[ R"SU 4SX�45[ R"U 5S[R"5;d[ R "U5(a[ R"U5OS[ R"U5S.-nS S U0-n[[ R"U55eS=n =p�URn[R o�U :Ho3(Gd [ R"SU4SX[45S[R"5;d[ R "U5(a[ R"U5OS[ R"U5S[R"5;d[ R "[5(a[ R"[5OS[ R"U 5S.-n SSU 0-n [[ R"U 55eS=n=p;gGN/GNGN !,IShv�N (df  GN"=f7f)z'Test check_url with invalid URL format.Nznot-a-valid-urlz5assert %(py4)s {%(py4)s = %(py0)s(%(py1)s, %(py2)s) }rL�resultr )r.rNr/rPFr4�z0%(py2)s {%(py2)s = %(py0)s.is_valid } is %(py5)sr-r1r2rr*�z3%(py2)s {%(py2)s = %(py0)s.status_code } == %(py5)szInvalid URL format��in�z0%(py1)s in %(py5)s {%(py5)s = %(py3)s.warnings }�rNrOr0�zR%(py2)s {%(py2)s = %(py0)s.confidence_level } == %(py6)s {%(py6)s = %(py4)s.HIGH }r �r.r/rPrQ�assert %(py8)srR)� check_urlrLr r8r9r6r:r;r<r=�is_validr7r �warnings�confidence_levelr �HIGH)rrrerB� @py_format5r@rArCrD� @py_assert0rTrU� @py_format7rWs r�test_check_url_invalid_format�.TestURLValidator.test_check_url_invalid_formatBs�����9�$�.�.�/@�A�A�F��9��&�"5�6�6�6�6�6�6�6�6�6�z�6�6�6�6�z�6�6�6�6�6�6�&�6�6�6�6�&�6�6�6�6�6�6�"5�6�6�6�6�"5�6�6�6�6�6�6�6�6�6�6����'�%�'�%�'�'�'�'�'��'�'�'�'�'�'�v�'�'�'�'�v�'�'�'��'�'�'�%�'�'�'�'�'�'�'��!�!�&�Q�&�Q�&�&�&�&�&�!�&�&�&�&�&�&�v�&�&�&�&�v�&�&�&�!�&�&�&�Q�&�&�&�&�&�&�&�#�6���6��6�6�6�6�6�#�6�6�6�#�6�6�6�6�6�6�v�6�6�6�6�v�6�6�6��6�6�6�6�6�6�6��&�&�>�/�*>�*>�>�*>�>�>�>�>�>�&�>�>�>�>�>�>�v�>�>�>�>�v�>�>�>�&�>�>�>�>�>�>�/�>�>�>�>�/�>�>�>�*>�>�>�>�>�>�>�>��A��9�9�9�sR�U�T8�U�U�T;�U� U�T>�TU�;U�>U�U�U � U�Uc��~ # �[5nX#RlX1lUR S[ R 5IShv�N nURnSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n [[R"U 55eS=n=pvUR nS oeU:How(d�[R"S U4S XV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n [[R"U 55eS=n=pvUR"nS n [%U 5o�U :How(Gd"[R"S U4SX[45S[R"5;d[R"U5(a[R"U5OS[R"U5S[R"5;d[R"[$5(a[R"[$5OS[R"U 5[R"U 5S.-n SSU 0-n [[R"U 55eS=n=n=p�UR&nSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n [[R"U 55eS=n=pvUR(SnSo~U:Ho�(do[R"S U4SX�45[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=p�UR(SnSo~U:Ho�(do[R"S U4SX�45[R"U5[R"U5S.-nSSU0-n[[R"U55eS=n=p�gGN�7f)z%Test basic validation of a valid URL.rNTr4rfrer-r1r2rr*rgr)zT%(py2)s {%(py2)s = %(py0)s.content_length } == %(py8)s {%(py8)s = %(py4)s(%(py6)s) }�len)r.r/rPrQrR�assert %(py10)s�py10�z1%(py2)s {%(py2)s = %(py0)s.ssl_valid } is %(py5)s� final_url�z%(py1)s == %(py4)s�rNrP�assert %(py6)srQ�redirect_countr)r�get� return_valuer>ror �BASICrpr6r7r8r9r:r;r<r=r �content_lengthrz� ssl_valid�metadata)rrr'� mock_clientrer@rArBrCrDrUrVrW� @py_format11rurTrtrvs r�test_check_url_basic_valid�+TestURLValidator.test_check_url_basic_validNs���� �k� �':���$�&�� �*�*�+@�/�BW�BW�X�X�����&�$�&�$�&�&�&�&�&��&�&�&�&�&�&�v�&�&�&�&�v�&�&�&��&�&�&�$�&�&�&�&�&�&�&��!�!�(�S�(�S�(�(�(�(�(�!�(�(�(�(�(�(�v�(�(�(�(�v�(�(�(�!�(�(�(�S�(�(�(�(�(�(�(��$�$�<�O�<��O�(<�<�(<�<�<�<�<�<�$�<�<�<�<�<�<�v�<�<�<�<�v�<�<�<�$�<�<�<�<�<�<��<�<�<�<��<�<�<�O�<�<�<�(<�<�<�<�<�<�<�<����'�4�'�4�'�'�'�'�'��'�'�'�'�'�'�v�'�'�'�'�v�'�'�'��'�'�'�4�'�'�'�'�'�'�'����{�+�D�/D�D�/D�D�D�D�D�D�+�D�D�D�+�D�D�D�/D�D�D�D�D�D�D�D����/�0�5�A�5�A�5�5�5�5�5�0�5�5�5�0�5�5�5�A�5�5�5�5�5�5�5�Y�s�AT=�T:�S4T=c��Z# �[5nSUlX#RlX1lUR S[ R5IShv�N nURnSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nSS U0-n [[R "U 55eS=n=pvgN�7f) z(Test validation of HTTP (non-HTTPS) URL.zhttp://example.comNFr4r}rer-r1r2)rr$r�r�r>ror r�r�r6r7r8r9r:r;r<r=� rrr'r�rer@rArBrCrDs r�test_check_url_http�$TestURLValidator.test_check_url_http^s���� �k� �"6���':���$�&�� �*�*�+?��AV�AV�W�W�����(�5�(�5�(�(�(�(�(��(�(�(�(�(�(�v�(�(�(�(�v�(�(�(��(�(�(�5�(�(�(�(�(�(�(�X�s�A D+� D)�CD+c��~ # �[5n[R"S5URlX!lUR S5IShv�N nURnSoTULof(d�[R"SU4SXE45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n[[R"U55eS=n=peUR nS oTU:Hof(d�[R"S U4S XE45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n[[R"U55eS=n=peUR"oAR$o�U :Hof(Gd[R"S U4SXI45S[R"5;d[R"U5(a[R"U5OS[R"U5S[R"5;d[R"U5(a[R"U5OS[R"U 5S.-n SSU 0-n [[R"U 55eS=n=piSo�R&o\U;o�(d�[R"SU 4SX�45[R"U 5S[R"5;d[R"U5(a[R"U5OS[R"U5S.-nS S U0-n[[R"U55eS=n =p�UR(n[*R,o�U :Hof(Gd [R"S U4SXI45S[R"5;d[R"U5(a[R"U5OS[R"U5S[R"5;d[R"[*5(a[R"[*5OS[R"U 5S.-n SSU 0-n [[R"U 55eS=n=pigGN�7f)z!Test URL validation with timeout.�TimeoutrNFr4rfrer-r1r2rr*rg)zR%(py2)s {%(py2)s = %(py0)s.response_time } == %(py6)s {%(py6)s = %(py4)s.timeout }rrmrnrRzRequest timeoutrhrjrkrlr )rrM�TimeoutExceptionr�� side_effectr>rorpr6r7r8r9r:r;r<r=r � response_timerrqrrr rs)rrr�rer@rArBrCrDrUrvrWrurTs r�test_check_url_timeout�'TestURLValidator.test_check_url_timeoutjs���� �k� �&+�&<�&<�Y�&G� ���#�&�� �*�*�+@�A�A�����'�%�'�%�'�'�'�'�'��'�'�'�'�'�'�v�'�'�'�'�v�'�'�'��'�'�'�%�'�'�'�'�'�'�'��!�!�&�Q�&�Q�&�&�&�&�&�!�&�&�&�&�&�&�v�&�&�&�&�v�&�&�&�!�&�&�&�Q�&�&�&�&�&�&�&��#�#�8�'8�'8�8�'8�8�8�8�8�8�#�8�8�8�8�8�8�v�8�8�8�8�v�8�8�8�#�8�8�8�8�8�8�y�8�8�8�8�y�8�8�8�'8�8�8�8�8�8�8�8� �3�O�O�3�O�3�3�3�3�3� �3�3�3� �3�3�3�3�3�3�F�3�3�3�3�F�3�3�3�O�3�3�3�3�3�3�3��&�&�>�/�*>�*>�>�*>�>�>�>�>�>�&�>�>�>�>�>�>�v�>�>�>�>�v�>�>�>�&�>�>�>�>�>�>�/�>�>�>�>�/�>�>�>�*>�>�>�>�>�>�>�>� B�s�A T=� T:� S.T=c���# �[5n[S5URlX!lUR S5IShv�N nUR nSoTULof(d�[R"SU4SXE45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n[[R"U55eS=n=peS o�RoYU;o�(d�[R"S U 4S X�45[R"U 5S[R"5;d[R"U5(a[R"U5OS[R"U5S.-nS S U0-n[[R"U55eS=n =p�gGN�7f)z+Test URL validation with general exception.z Network errorrNFr4rfrer-r1r2zRequest failed: Network errorrhrjrk)r� Exceptionr�r�r>rorpr6r7r8r9r:r;r<r=rq) rrr�rer@rArBrCrDrurTs r�test_check_url_exception�)TestURLValidator.test_check_url_exceptionys��� �k� �&/��&@� ���#�&�� �*�*�+@�A�A�����'�%�'�%�'�'�'�'�'��'�'�'�'�'�'�v�'�'�'�'�v�'�'�'��'�'�'�%�'�'�'�'�'�'�'�.�A�/�/�A�/�A�A�A�A�A�.�A�A�A�.�A�A�A�A�A�A�&�A�A�A�A�&�A�A�A�/�A�A�A�A�A�A�A�B�s�?G6�G3�F2G6c��# �[5n[5[5/UlSUlX#RlX1lURS5IShv�N nURSnSoeU:How(do[R"SU4SXV45[R"U5[R"U5S.-nSS U0-n [[R"U 55eS=n=pvURS nS oeU:How(do[R"SU4SXV45[R"U5[R"U5S.-nSS U0-n [[R"U 55eS=n=pvgGN$7f) z#Test URL validation with redirects.zhttps://www.example.comrNr~r*rr�r�rQr��)rrr%r$r�r�r>ror�r6r7r;r<r=) rrr'r�rerurBrTrtrvs r�test_check_url_redirect�(TestURLValidator.test_check_url_redirect�s���� �k� �'+�v�t�v�&6��#�";���':���$�&�� �*�*�+@�A�A�����{�+�H�/H�H�/H�H�H�H�H�H�+�H�H�H�+�H�H�H�/H�H�H�H�H�H�H�H����/�0�5�A�5�A�5�5�5�5�5�0�5�5�5�0�5�5�5�A�5�5�5�5�5�5�5�B�s�AE>�E;�D$E>c��# �[5nSUlX#RlX1l[SS9UlUR S[R5IShv�N nURnSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S .-nS S U0-n [![R""U 55eS=n=pvUR$n ['U 5nS o�U :Ho�(Gd"[R"S U 4SXk45S[R"5;d[R"[&5(a[R"[&5OSS[R"5;d[R"U5(a[R"U5OS[R"U 5[R"U5[R"U 5S.-n SSU 0-n[![R""U55eS=n =n=p�gGN)7f)zTest standard level validation.zJ<html><body>Valid content with sufficient length for testing</body></html>T)r�rNr4rfrer-r1r2rr*)zN%(py5)s {%(py5)s = %(py0)s(%(py3)s {%(py3)s = %(py1)s.warnings }) } == %(py8)srz)r.rNrOr0rRr{r|)rr"r�r�r>� _validate_sslror �STANDARDrpr6r7r8r9r:r;r<r=rqrz)rrr'r�rer@rArBrCrDrTrV� @py_assert6rWr�s r�test_check_url_standard_level�.TestURLValidator.test_check_url_standard_level�sm��� �k� �#o�� �':���$�&��"+��">� �� �*�*�+@�/�BZ�BZ�[�[�����&�$�&�$�&�&�&�&�&��&�&�&�&�&�&�v�&�&�&�&�v�&�&�&��&�&�&�$�&�&�&�&�&�&�&��?�?�(�s�?�#�(�q�(�q�(�(�(�(�(�#�(�(�(�(�(�(�s�(�(�(�(�s�(�(�(�(�(�(�6�(�(�(�(�6�(�(�(�?�(�(�(�#�(�(�(�q�(�(�(�(�(�(�(� \�s�AJ�J�H)Jc��T# �[5nSUlX#RlX1lUR UR[ R5IShv�N nSUR5n[U5of(d�SS[R"5;d[R"[5(a[R"[5OS[R"U5[R"U5S.-n[[R "U55eS=pVgN�7f)z$Test comprehensive level validation.z5https://example.com/blog/2024/03/15/ai-research-paperNc3�,# �UH nSU;v� M g7f�zAI hallucinationsN���.0�ws r� <genexpr>�FTestURLValidator.test_check_url_comprehensive_level.<locals>.<genexpr>�s���E�_��&�!�+�_����,assert %(py4)s {%(py4)s = %(py0)s(%(py2)s) }�any�r.r/rP)rr$r�r�r>ror � COMPREHENSIVErqr�r8r9r6r:r;r<r=)rrr'r�rer@rBrts r�"test_check_url_comprehensive_level�3TestURLValidator.test_check_url_comprehensive_level�s���� �k� �"Y���':���$�&�� �*�*�+>�+B�+B�O�Da�Da�b�b��F�V�_�_�E�E�s�E�E�E�E�E�E�E�E�E�E�s�E�E�E�E�s�E�E�E�E�E�E�E�E�E�E�E�E�E�E�c�s�AD(�D&�CD(c��H# �[S5n[5n[5n[5UlX44UlUR S5IShv�N nSoeULow(d�[ R"SU4SXV45S[R"5;d[ R"U5(a[ R"U5OS[ R"U5S.-nS S U0-n [[ R"U 55eS=pvSSS5 gN�!,(df  g=f7f) z*Test SSL validation for valid certificate.�asyncio.open_connectionrNTr4�z%(py0)s is %(py3)sre�r.rO�assert %(py5)sr0)rrr� wait_closedr�r�r6r7r8r9r:r;r<r=) rr� mock_open� mock_reader� mock_writerrerTr@� @py_format4rCs r�test_validate_ssl_valid�(TestURLValidator.test_validate_ssl_valid�s�����,� -���&�K��&�K�&/�k�K� #�&1�%?�I� "�$�2�2�3H�I�I�F�!� !�T�>� !� !� !� !�6� !� !� !� !� !� !�6� !� !� !� !�6� !� !� !�T� !� !� !� !� !� !� !�.� -� J� .� -�s0� D"�AD�D�B7D� D"�D� D�D"c��# �[S[S5S9 URS5IShv�N nSo2ULoD(d�[R"SU4SX#45S [ R "5;d[R"U5(a[R"U5OS [R"U5S .-nS S U0-n[[R"U55eS=pCSSS5 gN�!,(df  g=f7f) z,Test SSL validation for invalid certificate.r�z SSL error)r�rNFr4r�rer�r�r0) rr�r�r6r7r8r9r:r;r<r=)rrrerTr@r�rCs r�test_validate_ssl_invalid�*TestURLValidator.test_validate_ssl_invalid�s�����,�)�K�:P� Q�$�2�2�3H�I�I�F�"� "�U�?� "� "� "� "�6� "� "� "� "� "� "�6� "� "� "� "�6� "� "� "�U� "� "� "� "� "� "� "�R� Q�I�R� Q�s-�C?�C.�C,�B7C.�# C?�,C.�. C<�8C?c��URSSS05nSU5n[U5oD(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=p4g) z*Test content validation for short content.�Shortrrc3�,# �UH nSU;v� M g7f)zVery short contentNr�r�s rr��?TestURLValidator.test_validate_content_short.<locals>.<genexpr>�s���?�h��'�1�,�h�r�r�r�r�N� �_validate_contentr�r8r9r6r:r;r<r=�rrrqr@rBrts r�test_validate_content_short�,TestURLValidator.test_validate_content_short�s~���.�.�w���8U�V��?�h�?�?�s�?�?�?�?�?�?�?�?�?�?�s�?�?�?�?�s�?�?�?�?�?�?�?�?�?�?�?�?�?�?rc��SnURUSS05nSU5n[U5oU(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=pEg) z)Test content validation for parking page.z;<html><body><h1>This domain is for sale!</h1></body></html>rrc3�,# �UH nSU;v� M g7f)z parking pageNr�r�s rr��FTestURLValidator.test_validate_content_parking_page.<locals>.<genexpr>�s���9��1�>�Q�&��r�r�r�r�Nr��rrr!rqr@rBrts r�"test_validate_content_parking_page�3TestURLValidator.test_validate_content_parking_page�s���O���.�.�w���8U�V��9��9�9�s�9�9�9�9�9�9�9�9�9�9�s�9�9�9�9�s�9�9�9�9�9�9�9�9�9�9�9�9�9�9rc��SnURUSS05nSU5n[U5oU(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=pEg) z)Test content validation for invalid HTML.z<div>No html or body tags</div>rrc3�,# �UH nSU;v� M g7f)zInvalid HTML structureNr�r�s rr��FTestURLValidator.test_validate_content_invalid_html.<locals>.<genexpr>�s���C�(�Q�+�q�0�(�r�r�r�r�Nr�r�s r�"test_validate_content_invalid_html�3TestURLValidator.test_validate_content_invalid_html�s���3���.�.�w���8U�V��C�(�C�C�s�C�C�C�C�C�C�C�C�C�C�s�C�C�C�C�s�C�C�C�C�C�C�C�C�C�C�C�C�C�Crc��SnURUSS05n[U5nSoTU:Hof(Gd [R"SU4SXE45S[R "5;d[R "[5(a[R"[5OSS[R "5;d[R "U5(a[R"U5OS[R"U5[R"U5S .-nS S U0-n[[R"U55eS =n=peg ) z*Test content validation for valid content.z[<html><body><h1>Welcome</h1><p>This is a valid website with real content.</p></body></html>rrrr*)z0%(py3)s {%(py3)s = %(py0)s(%(py1)s) } == %(py6)srzrq)r.rNrOrQrnrRN) r�rzr6r7r8r9r:r;r<r=) rrr!rqrTrUrArvrWs r�test_validate_content_valid�,TestURLValidator.test_validate_content_valid�s���o���.�.�w���8U�V���8�}�!��!��!�!�!�!�!�}�!�!�!�!�!�!�s�!�!�!�!�s�!�!�!�!�!�!�8�!�!�!�!�8�!�!�!�}�!�!�!��!�!�!�!�!�!�!rc��URSS5nSU5n[U5oD(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=p4g)z,Test detection of AI hallucination patterns.z>https://example.com/blog/2024/03/15/groundbreaking-ai-researchr]c3�,# �UH nSU;v� M g7fr�r�r�s rr��STestURLValidator.test_check_suspicious_patterns_ai_hallucination.<locals>.<genexpr>�s���>�X��&�!�+�X�r�r�r�r�N� �_check_suspicious_patternsr�r8r9r6r:r;r<r=r�s r�/test_check_suspicious_patterns_ai_hallucination�@TestURLValidator.test_check_suspicious_patterns_ai_hallucination�s���7�7� L� � ��?�X�>�>�s�>�>�>�>�>�>�>�>�>�>�s�>�>�>�>�s�>�>�>�>�>�>�>�>�>�>�>�>�>�>rc��URSS5nSU5n[U5oD(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=p4g)z!Test detection of deep URL paths.z#https://example.com/a/b/c/d/e/f/g/hr]c3�,# �UH nSU;v� M g7f)z deep URL pathNr�r�s rr��LTestURLValidator.test_check_suspicious_patterns_deep_path.<locals>.<genexpr>�����:��A�?�a�'��r�r�r�r�Nr�r�s r�(test_check_suspicious_patterns_deep_path�9TestURLValidator.test_check_suspicious_patterns_deep_path�s���7�7� 1� � ��;��:�:�s�:�:�:�:�:�:�:�:�:�:�s�:�:�:�:�s�:�:�:�:�:�:�:�:�:�:�:�:�:�:rc��URSS5nSU5n[U5oD(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=p4g)z'Test detection of excessive subdomains.zhttps://a.b.c.d.example.comr]c3�,# �UH nSU;v� M g7f)zExcessive subdomainsNr�r�s rr��WTestURLValidator.test_check_suspicious_patterns_excessive_subdomains.<locals>.<genexpr>�s���A��1�)�Q�.��r�r�r�r�Nr�r�s r�3test_check_suspicious_patterns_excessive_subdomains�DTestURLValidator.test_check_suspicious_patterns_excessive_subdomains�s����7�7� )� � ��B��A�A�s�A�A�A�A�A�A�A�A�A�A�s�A�A�A�A�s�A�A�A�A�A�A�A�A�A�A�A�A�A�Arc��URSS5nSU5n[U5oD(d�SS[R"5;d[R "[5(a[R "[5OS[R "U5[R "U5S.-n[[R"U55eS=p4g)z Test detection of typosquatting.zhttps://gihub.comr]c3�,# �UH nSU;v� M g7f)� typosquattingNr�r�s rr��PTestURLValidator.test_check_suspicious_patterns_typosquatting.<locals>.<genexpr>�r�r�r�r�r�Nr�r�s r�,test_check_suspicious_patterns_typosquatting�=TestURLValidator.test_check_suspicious_patterns_typosquatting�s���7�7� � � ��;��:�:�s�:�:�:�:�:�:�:�:�:�:�s�:�:�:�:�s�:�:�:�:�:�:�:�:�:�:�:�:�:�:rc ���URnSnSoB"X45nSoeULow(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvURnS nS oB"X45nSoeULow(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvURnS nSoB"X45nSoeULow(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvg )z1Test typosquatting detection for similar domains.z gihub.com� github.comTr4�za%(py8)s {%(py8)s = %(py2)s {%(py2)s = %(py0)s._is_typosquatting }(%(py4)s, %(py6)s) } is %(py11)sr�r.r/rPrQrRr\�assert %(py13)s�py13Nz gogle.comz google.comz amazom.comz amazon.com� �_is_typosquattingr6r7r8r9r:r;r<r=� rrr@rBrUrV� @py_assert10� @py_assert9ra� @py_format14s r�test_is_typosquatting_similar�.TestURLValidator.test_is_typosquatting_similar�s ���*�*�M�;�M� �M�*�;�E�M��M��M�M�M�M�M�E�M�M�M�M�M�M�y�M�M�M�M�y�M�M�M�*�M�M�M�;�M�M�M� �M�M�M�E�M�M�M��M�M�M�M�M�M�M�M��*�*�M�;�M� �M�*�;�E�M��M��M�M�M�M�M�E�M�M�M�M�M�M�y�M�M�M�M�y�M�M�M�*�M�M�M�;�M�M�M� �M�M�M�E�M�M�M��M�M�M�M�M�M�M�M��*�*�N�<�N��N�*�<�F�N�$�N�$�N�N�N�N�N�F�N�N�N�N�N�N�y�N�N�N�N�y�N�N�N�*�N�N�N�<�N�N�N��N�N�N�F�N�N�N�$�N�N�N�N�N�N�N�Nrc �P�URnSnSoB"X45nSoeULow(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSSU0-n [[R"U 55eS =n=n=n=n=pvg ) z3Test typosquatting detection for identical domains.r�Fr4r�rr�r�r�Nr�r�s r�test_is_typosquatting_identical�0TestURLValidator.test_is_typosquatting_identicals����*�*�O�<�O��O�*�<�F�O�%�O�%�O�O�O�O�O�F�O�O�O�O�O�O�y�O�O�O�O�y�O�O�O�*�O�O�O�<�O�O�O��O�O�O�F�O�O�O�%�O�O�O�O�O�O�O�Orc �P�URnSnSoB"X45nSoeULow(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvg ) z3Test typosquatting detection for different domains.z example.comr�Fr4r�rr�r�r�Nr�r�s r�test_is_typosquatting_different�0TestURLValidator.test_is_typosquatting_differents����*�*�P�=�P�,�P�*�=�G�P�5�P�5�P�P�P�P�P�G�P�P�P�P�P�P�y�P�P�P�P�y�P�P�P�*�P�P�P�=�P�P�P�,�P�P�P�G�P�P�P�5�P�P�P�P�P�P�P�Prc �< �URnSnSoB"X45nSoeU:How(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvURnS nS oB"X45nSoeU:How(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvURnS nSoB"X45nSoeU:How(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvURnSnSoB"X45nSoeU:How(d�[R"SU4SXV45S[R"5;d[R "U5(a[R "U5OS[R "U5[R "U5[R "U5[R "U5[R "U5S.-nSS U0-n [[R"U 55eS =n=n=n=n=pvg )z&Test Levenshtein distance calculation.�kitten�sitting�r*)ze%(py8)s {%(py8)s = %(py2)s {%(py2)s = %(py0)s._levenshtein_distance }(%(py4)s, %(py6)s) } == %(py11)srr�r�r�N�saturday�sundayr]�abcr) �_levenshtein_distancer6r7r8r9r:r;r<r=r�s r�test_levenshtein_distance�*TestURLValidator.test_levenshtein_distances����.�.�H�x�H��H�.�x�C�H�q�H�q�H�H�H�H�H�C�H�H�H�H�H�H�y�H�H�H�H�y�H�H�H�.�H�H�H�x�H�H�H��H�H�H�C�H�H�H�q�H�H�H�H�H�H�H�H��.�.�I�z�I�8�I�.�z�D�I��I��I�I�I�I�I�D�I�I�I�I�I�I�y�I�I�I�I�y�I�I�I�.�I�I�I�z�I�I�I�8�I�I�I�D�I�I�I��I�I�I�I�I�I�I�I��.�.�>�r�>�5�>�.�r�9�>�Q�>�Q�>�>�>�>�>�9�>�>�>�>�>�>�y�>�>�>�>�y�>�>�>�.�>�>�>�r�>�>�>�5�>�>�>�9�>�>�>�Q�>�>�>�>�>�>�>�>��.�.�A�u�A�e�A�.�u�<�A��A��A�A�A�A�A�<�A�A�A�A�A�A�y�A�A�A�A�y�A�A�A�.�A�A�A�u�A�A�A�e�A�A�A�<�A�A�A��A�A�A�A�A�A�A�Arc�N�URS/S9n[Ro2U:HoD(d�[R"SU4SX#45S[ R "5;d[R"U5(a[R"U5OSS[ R "5;d[R"[5(a[R"[5OS[R"U5S.-nSS U0-n[[R"U55eS =pCg ) z/Test confidence determination for invalid URLs.F�rprqr*�z,%(py0)s == %(py4)s {%(py4)s = %(py2)s.HIGH }� confidencer r�r�rQN� �_determine_confidencer rsr6r7r8r9r:r;r<r=�rrrrBr@rtrvs r�!test_determine_confidence_invalid�2TestURLValidator.test_determine_confidence_invalids����4�4�e�b�4�Q� �,�1�1�1�1�1�1�1�1�1�z�1�1�1�1�1�1�z�1�1�1�1�z�1�1�1�1�1�1�_�1�1�1�1�_�1�1�1�1�1�1�1�1�1�1�1rc�N�URS/S9n[Ro2U:HoD(d�[R"SU4SX#45S[ R "5;d[R"U5(a[R"U5OSS[ R "5;d[R"[5(a[R"[5OS[R"U5S.-nSS U0-n[[R"U55eS =pCg ) z/Test confidence determination with no warnings.Trr*rrr r�r�rQNrrs r�%test_determine_confidence_no_warnings�6TestURLValidator.test_determine_confidence_no_warningss����4�4�d�R�4�P� �,�1�1�1�1�1�1�1�1�1�z�1�1�1�1�1�1�z�1�1�1�1�z�1�1�1�1�1�1�_�1�1�1�1�_�1�1�1�1�1�1�1�1�1�1�1rc�R�URSSS/S9n[Ro2U:HoD(d�[R"SU4SX#45S[ R "5;d[R"U5(a[R"U5OSS[ R "5;d[R"[5(a[R"[5OS[R"U5S .-nS S U0-n[[R"U55eS =pCg ) z0Test confidence determination with few warnings.T� Warning 1� Warning 2rr*)z.%(py0)s == %(py4)s {%(py4)s = %(py2)s.MEDIUM }rr r�r�rQN) rr �MEDIUMr6r7r8r9r:r;r<r=rs r�&test_determine_confidence_few_warnings�7TestURLValidator.test_determine_confidence_few_warningss����4�4�d�k�[f�Mg�4�h� �,�3�3�3�3�3�3�3�3�3�z�3�3�3�3�3�3�z�3�3�3�3�z�3�3�3�3�3�3�_�3�3�3�3�_�3�3�3�3�3�3�3�3�3�3�3rc�R�URS/SQS9n[Ro2U:HoD(d�[R"SU4SX#45S[ R "5;d[R"U5(a[R"U5OSS[ R "5;d[R"[5(a[R"[5OS[R"U5S.-nS S U0-n[[R"U55eS =pCg ) z1Test confidence determination with many warnings.T)rr z Warning 3z Warning 4rr*)z+%(py0)s == %(py4)s {%(py4)s = %(py2)s.LOW }rr r�r�rQN) rr �LOWr6r7r8r9r:r;r<r=rs r�'test_determine_confidence_many_warnings�8TestURLValidator.test_determine_confidence_many_warningss����4�4��I�5� � �-�0�0�0�0�0�0�0�0�0�z�0�0�0�0�0�0�z�0�0�0�0�z�0�0�0�0�0�0�_�0�0�0�0�_�0�0�0�0�0�0�0�0�0�0�0rc���# �[5nSUlX#RlX1lUR S5IShv�N nUR nSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n [[R"U 55eS=n=pvURnSoeU:How(d�[R"S U4S XV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n [[R"U 55eS=n=pvgGN�7f) z4Test validation with non-200 but valid status codes.i-rNTr4rfrer-r1r2r*rg�rr r�r�r>rorpr6r7r8r9r:r;r<r=r�s r�#test_check_url_non_200_valid_status�4TestURLValidator.test_check_url_non_200_valid_status&s#��� �k� �*-��'�':���$�&�� �*�*�+@�A�A�����&�$�&�$�&�&�&�&�&��&�&�&�&�&�&�v�&�&�&�&�v�&�&�&��&�&�&�$�&�&�&�&�&�&�&��!�!�(�S�(�S�(�(�(�(�(�!�(�(�(�(�(�(�v�(�(�(�(�v�(�(�(�!�(�(�(�S�(�(�(�(�(�(�(�B���<G4�G1�F3G4c���# �[5nSUlX#RlX1lUR S5IShv�N nUR nSoeULow(d�[R"SU4SXV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n [[R"U 55eS=n=pvURnSoeU:How(d�[R"S U4S XV45S[R"5;d[R"U5(a[R"U5OS[R"U5[R"U5S.-nS S U0-n [[R"U 55eS=n=pvgGN�7f) z*Test validation with invalid status codes.i�rNFr4rfrer-r1r2r*rgr)r�s r�test_check_url_invalid_status�.TestURLValidator.test_check_url_invalid_status3s#��� �k� �*-��'�':���$�&�� �*�*�+@�A�A�����'�%�'�%�'�'�'�'�'��'�'�'�'�'�'�v�'�'�'�'�v�'�'�'��'�'�'�%�'�'�'�'�'�'�'��!�!�(�S�(�S�(�(�(�(�(�!�(�(�(�(�(�(�v�(�(�(�(�v�(�(�(�!�(�(�(�S�(�(�(�(�(�(�(�B�r,r�N),�__name__� __module__� __qualname__�__firstlineno__�__doc__�pytest�fixturerr'rErH�mark�asynciorXrbrwr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrr"r&r*r.�__static_attributes__r�rrrrs(��&� �^�^�G��G� �^�^� �� �(�6�  �[�[���C��C�C� �[�[��� ?�� ?� �[�[��� 6�� 6� �[�[��� )�� )� �[�[��� ?�� ?� �[�[��� B�� B� �[�[��� 6�� 6� �[�[��� )�� )� �[�[��� F�� F� �[�[��� "�� "� �[�[���#��#� @� :� D� "� ?�;�B�;�O� P�Q�B�2� 2� 4� 1� �[�[��� )�� )� �[�[��� )�� )rr)r4�builtinsr8�_pytest.assertion.rewrite� assertion�rewriter6r5� unittest.mockrrrrrM�timer�!url_reputation_checker.validatorsr �url_reputation_checker.modelsr r r rr�rr�<module>rBs7��"��� �;�;� � ��:���m)�m)r

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/prismon/reputation-checker-mcp'

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