Skip to content

Commit 378d4b0

Browse files
committed
mirrors: convert tests to pytest
1 parent 54c331c commit 378d4b0

11 files changed

+456
-430
lines changed

mirrors/tests/__init__.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +0,0 @@
1-
from mirrors.models import MirrorUrl, MirrorProtocol, Mirror
2-
3-
4-
def create_mirror_url(name='mirror1', country='US',
5-
protocol='http', url='https://archlinux.org/'):
6-
mirror = Mirror.objects.create(name=name,
7-
admin_email='[email protected]')
8-
mirror_protocol = MirrorProtocol.objects.create(protocol=protocol)
9-
mirror_url = MirrorUrl.objects.create(url=url,
10-
protocol=mirror_protocol,
11-
mirror=mirror,
12-
country=country)
13-
return mirror_url

mirrors/tests/conftest.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import pytest
2+
3+
from mirrors.models import CheckLocation, MirrorLog, MirrorUrl, MirrorProtocol, Mirror
4+
5+
6+
NAME = 'mirror1'
7+
ADMIN_EMAIL = '[email protected]'
8+
HOSTNAME = 'archlinux.org'
9+
SOURCE_IP = '127.0.0.1'
10+
COUNTRY = 'DE'
11+
PROTOCOL = 'https'
12+
URL = '{}://{}'.format(PROTOCOL, HOSTNAME)
13+
14+
15+
@pytest.fixture
16+
def mirror(db, name=NAME, admin_email=ADMIN_EMAIL):
17+
mirror = Mirror.objects.create(name=name,
18+
admin_email=admin_email)
19+
yield mirror
20+
mirror.delete()
21+
22+
23+
@pytest.fixture
24+
def checklocation(db, hostname=HOSTNAME, source_ip=SOURCE_IP, country=COUNTRY):
25+
checkloc = CheckLocation.objects.create(hostname=hostname,
26+
source_ip=source_ip,
27+
country=country)
28+
yield checkloc
29+
checkloc.delete()
30+
31+
32+
@pytest.fixture
33+
def mirrorprotocol(db, protocol=PROTOCOL):
34+
mirror_protocol = MirrorProtocol.objects.create(protocol=protocol)
35+
yield mirror_protocol
36+
mirror_protocol.delete()
37+
38+
39+
@pytest.fixture
40+
def mirrorurl(db, mirror, mirrorprotocol, country=COUNTRY,
41+
url=URL):
42+
mirror_url = MirrorUrl.objects.create(url=url,
43+
protocol=mirrorprotocol,
44+
mirror=mirror,
45+
country=country)
46+
yield mirror_url
47+
mirror_url.delete()
48+
49+
50+
@pytest.fixture
51+
def create_mirrorurl(db, mirror, mirrorprotocol):
52+
mirrors = []
53+
54+
def _create_mirrorurl(country=COUNTRY, url=URL):
55+
mirror_url = MirrorUrl.objects.create(url=url,
56+
protocol=mirrorprotocol,
57+
mirror=mirror,
58+
country=country)
59+
mirrors.append(mirror_url)
60+
return mirror_url
61+
62+
yield _create_mirrorurl
63+
64+
for mirror in mirrors:
65+
mirror.delete()
66+
67+
68+
@pytest.fixture
69+
def create_mirrorlog(db, mirrorurl, checklocation):
70+
mirrorlogs = []
71+
72+
def _create_mirrorlog(check_time, last_sync, duration=1, error=''):
73+
mirror_log = MirrorLog.objects.create(url=mirrorurl,
74+
location=checklocation,
75+
check_time=check_time,
76+
last_sync=last_sync,
77+
duration=duration,
78+
error=error)
79+
return mirror_log
80+
81+
yield _create_mirrorlog
82+
83+
for mirrorlog in mirrorlogs:
84+
mirrorlog.delete()

mirrors/tests/test_mirrorcheck.py

Lines changed: 125 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -6,150 +6,134 @@
66
from ssl import CertificateError
77
from socket import timeout, error
88

9+
import pytest
910

1011
from django.utils.timezone import now
1112
from datetime import timedelta
1213

13-
14-
from django.test import TestCase
1514
from django.core.management import call_command
1615

17-
18-
from mirrors.tests import create_mirror_url
19-
from mirrors.models import MirrorLog, CheckLocation
20-
21-
22-
class MirrorCheckTest(TestCase):
23-
def setUp(self):
24-
self.mirror_url = create_mirror_url()
25-
26-
def tearDown(self):
27-
self.mirror_url.delete()
28-
29-
@mock.patch('urllib.request.Request')
30-
@mock.patch('urllib.request.urlopen')
31-
def test_invalid(self, urlopen, Request):
32-
urlopen.return_value.read.return_value = 'data'
33-
Request.get_host.return_value = 'archlinux.org'
34-
Request.type.return_value = 'https'
35-
36-
call_command('mirrorcheck')
37-
mirrorlog = MirrorLog.objects.first()
38-
self.assertNotEqual(mirrorlog.error, '')
39-
self.assertEqual(mirrorlog.is_success, False)
40-
41-
@mock.patch('urllib.request.Request')
42-
@mock.patch('urllib.request.urlopen')
43-
def test_valid(self, urlopen, Request):
44-
urlopen.return_value.read.return_value = str(int(time.time()))
45-
Request.get_host.return_value = 'archlinux.org'
46-
Request.type.return_value = 'https'
47-
48-
call_command('mirrorcheck')
49-
mirrorlog = MirrorLog.objects.first()
50-
self.assertEqual(mirrorlog.error, '')
51-
self.assertEqual(mirrorlog.is_success, True)
52-
53-
@mock.patch('urllib.request.Request')
54-
@mock.patch('urllib.request.urlopen')
55-
def test_valid_olddate(self, urlopen, Request):
56-
urlopen.return_value.read.return_value = str(int(time.time()))
57-
Request.get_host.return_value = 'archlinux.org'
58-
Request.type.return_value = 'https'
59-
60-
date = now() - timedelta(days=600)
61-
MirrorLog.objects.create(url=self.mirror_url, check_time=date)
62-
call_command('mirrorcheck')
63-
self.assertEqual(len(MirrorLog.objects.all()), 1)
64-
65-
@mock.patch('urllib.request.Request')
66-
@mock.patch('urllib.request.urlopen')
67-
def test_not_found(self, urlopen, Request):
68-
excp = HTTPError('https://archlinux.org/404.txt', 404, 'Not Found', '', None)
69-
urlopen.return_value.read.side_effect = excp
70-
Request.get_host.return_value = 'archlinux.org'
71-
Request.type.return_value = 'https'
72-
73-
call_command('mirrorcheck')
74-
mirrorlog = MirrorLog.objects.first()
75-
self.assertEqual(mirrorlog.error, str(excp))
76-
self.assertEqual(mirrorlog.is_success, False)
77-
78-
@mock.patch('urllib.request.Request')
79-
@mock.patch('urllib.request.urlopen')
80-
def test_not_found_variant(self, urlopen, Request):
81-
excp = BadStatusLine('')
82-
urlopen.return_value.read.side_effect = excp
83-
Request.get_host.return_value = 'archlinux.org'
84-
Request.type.return_value = 'https'
85-
86-
call_command('mirrorcheck')
87-
mirrorlog = MirrorLog.objects.first()
88-
self.assertIn('Exception in processing', mirrorlog.error)
89-
self.assertEqual(mirrorlog.is_success, False)
90-
91-
@mock.patch('urllib.request.Request')
92-
@mock.patch('urllib.request.urlopen')
93-
def test_cert_error(self, urlopen, Request):
94-
excp = CertificateError('certificate error')
95-
urlopen.return_value.read.side_effect = excp
96-
Request.get_host.return_value = 'archlinux.org'
97-
Request.type.return_value = 'https'
98-
99-
call_command('mirrorcheck')
100-
mirrorlog = MirrorLog.objects.first()
101-
self.assertIn('certificate error', mirrorlog.error)
102-
self.assertEqual(mirrorlog.is_success, False)
103-
104-
@mock.patch('urllib.request.Request')
105-
@mock.patch('urllib.request.urlopen')
106-
def test_general_httpexception(self, urlopen, Request):
107-
excp = URLError('550 No such file', '550.txt')
108-
urlopen.return_value.read.side_effect = excp
109-
Request.get_host.return_value = 'archlinux.org'
110-
Request.type.return_value = 'https'
111-
112-
call_command('mirrorcheck')
113-
mirrorlog = MirrorLog.objects.first()
114-
self.assertIn(excp.reason, mirrorlog.error)
115-
self.assertEqual(mirrorlog.is_success, False)
116-
117-
@mock.patch('urllib.request.Request')
118-
@mock.patch('urllib.request.urlopen')
119-
def test_socket_timeout(self, urlopen, Request):
120-
excp = timeout('timeout')
121-
urlopen.return_value.read.side_effect = excp
122-
Request.get_host.return_value = 'archlinux.org'
123-
Request.type.return_value = 'https'
124-
125-
call_command('mirrorcheck')
126-
mirrorlog = MirrorLog.objects.first()
127-
self.assertEqual('Connection timed out.', mirrorlog.error)
128-
self.assertEqual(mirrorlog.is_success, False)
129-
130-
@mock.patch('urllib.request.Request')
131-
@mock.patch('urllib.request.urlopen')
132-
def test_socket_error(self, urlopen, Request):
133-
excp = error('error')
134-
urlopen.return_value.read.side_effect = excp
135-
Request.get_host.return_value = 'archlinux.org'
136-
Request.type.return_value = 'https'
137-
138-
call_command('mirrorcheck')
139-
mirrorlog = MirrorLog.objects.first()
140-
self.assertEqual(str(excp), mirrorlog.error)
141-
self.assertEqual(mirrorlog.is_success, False)
142-
143-
def test_checklocation(self):
144-
with self.assertRaises(CheckLocation.DoesNotExist) as e:
145-
call_command('mirrorcheck', '-l', '9999999')
146-
self.assertEqual('CheckLocation matching query does not exist.', str(e.exception))
147-
148-
def test_checklocation_model(self):
149-
checkloc = CheckLocation.objects.create(hostname='archlinux.org',
150-
source_ip='1.1.1.1')
151-
with mock.patch('mirrors.management.commands.mirrorcheck.logger') as logger:
152-
call_command('mirrorcheck', '-l', f'{checkloc.id}')
153-
logger.info.assert_called()
154-
155-
checkloc.delete()
16+
from mirrors.models import CheckLocation, MirrorLog
17+
from mirrors.tests.conftest import HOSTNAME, PROTOCOL
18+
19+
20+
def mocked_request(urlopen, Request, return_value):
21+
urlopen.return_value.read.return_value = return_value
22+
Request.get_host.return_value = HOSTNAME
23+
Request.type.return_value = PROTOCOL
24+
25+
26+
def mocked_request_exception(urlopen, Request, excp):
27+
urlopen.return_value.read.side_effect = excp
28+
Request.get_host.return_value = HOSTNAME
29+
Request.type.return_value = PROTOCOL
30+
31+
32+
@mock.patch('urllib.request.Request')
33+
@mock.patch('urllib.request.urlopen')
34+
def test_invalid(urlopen, Request, mirrorurl):
35+
mocked_request(urlopen, Request, 'data')
36+
call_command('mirrorcheck')
37+
mirrorlog = MirrorLog.objects.first()
38+
assert mirrorlog.error != ''
39+
assert not mirrorlog.is_success
40+
41+
42+
@mock.patch('urllib.request.Request')
43+
@mock.patch('urllib.request.urlopen')
44+
def test_valid(urlopen, Request, mirrorurl):
45+
mocked_request(urlopen, Request, str(int(time.time())))
46+
call_command('mirrorcheck')
47+
mirrorlog = MirrorLog.objects.first()
48+
assert mirrorlog.error == ''
49+
assert mirrorlog.is_success
50+
51+
52+
@mock.patch('urllib.request.Request')
53+
@mock.patch('urllib.request.urlopen')
54+
def test_valid_olddate(urlopen, Request, mirrorurl):
55+
mocked_request(urlopen, Request, str(int(time.time())))
56+
date = now() - timedelta(days=600)
57+
MirrorLog.objects.create(url=mirrorurl, check_time=date)
58+
call_command('mirrorcheck')
59+
assert len(MirrorLog.objects.all()) == 1
60+
61+
62+
@mock.patch('urllib.request.Request')
63+
@mock.patch('urllib.request.urlopen')
64+
def test_not_found(urlopen, Request, mirrorurl):
65+
excp = HTTPError('https://archlinux.org/404.txt', 404, 'Not Found', '', None)
66+
mocked_request_exception(urlopen, Request, excp)
67+
call_command('mirrorcheck')
68+
mirrorlog = MirrorLog.objects.first()
69+
assert mirrorlog.error == str(excp)
70+
assert not mirrorlog.is_success
71+
72+
73+
@mock.patch('urllib.request.Request')
74+
@mock.patch('urllib.request.urlopen')
75+
def test_not_found_variant(urlopen, Request, mirrorurl):
76+
excp = BadStatusLine('')
77+
mocked_request_exception(urlopen, Request, excp)
78+
call_command('mirrorcheck')
79+
mirrorlog = MirrorLog.objects.first()
80+
assert 'Exception in processing' in mirrorlog.error
81+
assert not mirrorlog.is_success
82+
83+
84+
@mock.patch('urllib.request.Request')
85+
@mock.patch('urllib.request.urlopen')
86+
def test_cert_error(urlopen, Request, mirrorurl):
87+
excp = CertificateError('certificate error')
88+
mocked_request_exception(urlopen, Request, excp)
89+
call_command('mirrorcheck')
90+
mirrorlog = MirrorLog.objects.first()
91+
assert 'certificate error' in mirrorlog.error
92+
assert not mirrorlog.is_success
93+
94+
95+
@mock.patch('urllib.request.Request')
96+
@mock.patch('urllib.request.urlopen')
97+
def test_general_httpexception(urlopen, Request, mirrorurl):
98+
excp = URLError('550 No such file', '550.txt')
99+
mocked_request_exception(urlopen, Request, excp)
100+
call_command('mirrorcheck')
101+
mirrorlog = MirrorLog.objects.first()
102+
assert excp.reason in mirrorlog.error
103+
assert not mirrorlog.is_success
104+
105+
106+
@mock.patch('urllib.request.Request')
107+
@mock.patch('urllib.request.urlopen')
108+
def test_socket_timeout(urlopen, Request, mirrorurl):
109+
excp = timeout('timeout')
110+
mocked_request_exception(urlopen, Request, excp)
111+
112+
call_command('mirrorcheck')
113+
mirrorlog = MirrorLog.objects.first()
114+
assert 'Connection timed out.' in mirrorlog.error
115+
assert not mirrorlog.is_success
116+
117+
118+
@mock.patch('urllib.request.Request')
119+
@mock.patch('urllib.request.urlopen')
120+
def test_socket_error(urlopen, Request, mirrorurl):
121+
excp = error('error')
122+
mocked_request_exception(urlopen, Request, excp)
123+
124+
call_command('mirrorcheck')
125+
mirrorlog = MirrorLog.objects.first()
126+
assert str(excp) in mirrorlog.error
127+
assert not mirrorlog.is_success
128+
129+
130+
def test_checklocation_fail(db):
131+
with pytest.raises(CheckLocation.DoesNotExist) as e:
132+
call_command('mirrorcheck', '-l', '1')
133+
assert 'CheckLocation matching query does not exist.' == str(e.value)
134+
135+
136+
def test_checklocation_model(checklocation):
137+
with mock.patch('mirrors.management.commands.mirrorcheck.logger') as logger:
138+
call_command('mirrorcheck', '-l', '1')
139+
logger.info.assert_called()

0 commit comments

Comments
 (0)