Skip to content

Commit a322248

Browse files
timobrembeckclaudep
authored andcommitted
Use requests_mock for punycode domain tests
1 parent 6a60a24 commit a322248

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
python -m pip install --upgrade pip
2929
python -m pip install --upgrade django~=${{ matrix.django-version }}
3030
python -m pip install --upgrade requests
31+
python -m pip install --upgrade requests_mock
3132
3233
- name: Run tests
3334
run: python runtests.py

linkcheck/tests/test_linkcheck.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from io import StringIO
44
from unittest.mock import patch
55

6+
import requests_mock
67
from django.apps import apps
78
from django.conf import settings
89
from django.contrib.auth.models import User
@@ -11,6 +12,7 @@
1112
from django.test import LiveServerTestCase, TestCase
1213
from django.test.utils import override_settings
1314
from django.urls import reverse
15+
from requests.exceptions import ConnectionError
1416

1517
from linkcheck.linkcheck_settings import MAX_URL_LENGTH
1618
from linkcheck.listeners import (
@@ -437,15 +439,25 @@ def test_external_check_404_incomplete_cert(self):
437439
self.assertEqual(uv.redirect_to, '')
438440
self.assertEqual(uv.type, 'external')
439441

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)
442452
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)
443460
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-
)
449461
self.assertEqual(uv.anchor_message, '')
450462
self.assertEqual(uv.ssl_status, None)
451463
self.assertEqual(uv.ssl_message, 'SSL certificate could not be checked')
@@ -484,27 +496,31 @@ def test_external_check_200_utf8_not_encoded(self):
484496
self.assertEqual(uv.redirect_to, '')
485497
self.assertEqual(uv.type, 'external')
486498

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/')
489503
uv.check_url()
504+
self.assertEqual(uv.message, '200 OK')
490505
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')
493507
self.assertEqual(uv.error_message, '')
494508
self.assertEqual(uv.anchor_message, '')
495509
self.assertEqual(uv.ssl_status, True)
496510
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, '')
499514
self.assertEqual(uv.type, 'external')
500-
# The actual redirect URL might be subject to change
501-
self.assertNotEqual(uv.redirect_to, '')
502515

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)
505521
uv.check_url()
506-
self.assertEqual(uv.status, True)
507522
self.assertEqual(uv.message, '200 OK')
523+
self.assertEqual(uv.status, True)
508524
self.assertEqual(uv.get_message, 'Working external link')
509525
self.assertEqual(uv.error_message, '')
510526
self.assertEqual(uv.anchor_message, '')

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ dev = [
5353
"flake8",
5454
"isort",
5555
"pre-commit",
56+
"requests_mock",
5657
]
5758

5859
[tool.setuptools]

0 commit comments

Comments
 (0)