|
3 | 3 | from io import StringIO |
4 | 4 | from unittest.mock import patch |
5 | 5 |
|
| 6 | +import requests_mock |
6 | 7 | from django.apps import apps |
7 | 8 | from django.conf import settings |
8 | 9 | from django.contrib.auth.models import User |
|
11 | 12 | from django.test import LiveServerTestCase, TestCase |
12 | 13 | from django.test.utils import override_settings |
13 | 14 | from django.urls import reverse |
| 15 | +from requests.exceptions import ConnectionError |
14 | 16 |
|
15 | 17 | from linkcheck.linkcheck_settings import MAX_URL_LENGTH |
16 | 18 | from linkcheck.listeners import ( |
@@ -437,15 +439,25 @@ def test_external_check_404_incomplete_cert(self): |
437 | 439 | self.assertEqual(uv.redirect_to, '') |
438 | 440 | self.assertEqual(uv.type, 'external') |
439 | 441 |
|
440 | | - def test_external_check_unreachable(self): |
441 | | - uv = Url(url='https://invalid') |
| 442 | + @requests_mock.Mocker() |
| 443 | + def test_external_check_unreachable(self, mocker): |
| 444 | + exc = ConnectionError( |
| 445 | + "HTTPSConnectionPool(host='name-resolution-error.example.com', port=443): Max retries exceeded with url: / " |
| 446 | + "(Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0xdeadbeef>: " |
| 447 | + "Failed to resolve 'name-resolution-error.example.com' ([Errno -2] Name or service not known)\"))" |
| 448 | + ) |
| 449 | + mocked_url = 'https://name-resolution-error.example.com/' |
| 450 | + mocker.register_uri('HEAD', mocked_url, exc=exc), |
| 451 | + uv = Url(url=mocked_url) |
442 | 452 | uv.check_url() |
| 453 | + formatted_message = ( |
| 454 | + "Name Resolution Error: Failed to resolve 'name-resolution-error.example.com' " |
| 455 | + "([Errno -2] Name or service not known)" |
| 456 | + ) |
| 457 | + self.assertEqual(uv.message, formatted_message) |
| 458 | + self.assertEqual(uv.get_message, formatted_message) |
| 459 | + self.assertEqual(uv.error_message, formatted_message) |
443 | 460 | self.assertEqual(uv.status, False) |
444 | | - for attr in [uv.message, uv.get_message, uv.error_message]: |
445 | | - self.assertEqual( |
446 | | - attr, |
447 | | - "Name Resolution Error: Failed to resolve 'invalid' ([Errno -2] Name or service not known)", |
448 | | - ) |
449 | 461 | self.assertEqual(uv.anchor_message, '') |
450 | 462 | self.assertEqual(uv.ssl_status, None) |
451 | 463 | self.assertEqual(uv.ssl_message, 'SSL certificate could not be checked') |
@@ -484,27 +496,31 @@ def test_external_check_200_utf8_not_encoded(self): |
484 | 496 | self.assertEqual(uv.redirect_to, '') |
485 | 497 | self.assertEqual(uv.type, 'external') |
486 | 498 |
|
487 | | - def test_external_check_200_utf8_domain(self): |
488 | | - uv = Url(url='https://bafög.de/') |
| 499 | + @requests_mock.Mocker() |
| 500 | + def test_external_check_200_utf8_domain(self, mocker): |
| 501 | + mocker.register_uri('HEAD', 'https://xn--utf8-test--z5a0txc.example.com/', reason='OK'), |
| 502 | + uv = Url(url='https://utf8-test-äüö.example.com/') |
489 | 503 | uv.check_url() |
| 504 | + self.assertEqual(uv.message, '200 OK') |
490 | 505 | self.assertEqual(uv.status, True) |
491 | | - self.assertEqual(uv.message, '302 Found') |
492 | | - self.assertEqual(uv.get_message, 'Working temporary redirect') |
| 506 | + self.assertEqual(uv.get_message, 'Working external link') |
493 | 507 | self.assertEqual(uv.error_message, '') |
494 | 508 | self.assertEqual(uv.anchor_message, '') |
495 | 509 | self.assertEqual(uv.ssl_status, True) |
496 | 510 | self.assertEqual(uv.ssl_message, 'Valid SSL certificate') |
497 | | - self.assertEqual(uv.get_status_code_display(), '302 Found') |
498 | | - self.assertEqual(uv.get_redirect_status_code_display(), '200 OK') |
| 511 | + self.assertEqual(uv.get_status_code_display(), '200 OK') |
| 512 | + self.assertEqual(uv.get_redirect_status_code_display(), None) |
| 513 | + self.assertEqual(uv.redirect_to, '') |
499 | 514 | self.assertEqual(uv.type, 'external') |
500 | | - # The actual redirect URL might be subject to change |
501 | | - self.assertNotEqual(uv.redirect_to, '') |
502 | 515 |
|
503 | | - def test_external_check_200_punycode_domain(self): |
504 | | - uv = Url(url='https://www.xn--jobbrse-stellenangebote-blc.de/') |
| 516 | + @requests_mock.Mocker() |
| 517 | + def test_external_check_200_punycode_domain(self, mocker): |
| 518 | + punycode_domain = 'https://xn--utf8-test--z5a0txc.example.com/' |
| 519 | + mocker.register_uri('HEAD', punycode_domain, reason='OK'), |
| 520 | + uv = Url(url=punycode_domain) |
505 | 521 | uv.check_url() |
506 | | - self.assertEqual(uv.status, True) |
507 | 522 | self.assertEqual(uv.message, '200 OK') |
| 523 | + self.assertEqual(uv.status, True) |
508 | 524 | self.assertEqual(uv.get_message, 'Working external link') |
509 | 525 | self.assertEqual(uv.error_message, '') |
510 | 526 | self.assertEqual(uv.anchor_message, '') |
|
0 commit comments