Skip to content

Commit 9909f7e

Browse files
authored
Merge pull request #133 from sbs2001/develop
Change Django Tests to pytests
2 parents f55d2fb + 8072382 commit 9909f7e

9 files changed

Lines changed: 422 additions & 425 deletions

File tree

.travis.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ before_script:
1616
- ./manage.py migrate
1717

1818
script:
19-
- python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py
20-
- ./manage.py test vulnerabilities/tests
19+
- pytest
2120

2221
notifications:
2322
email: false

pytest.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[pytest]
2+
DJANGO_SETTINGS_MODULE = vulnerablecode.settings

requirements.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@ beautifulsoup4==4.7.1
44
lxml==4.3.3
55
django==2.2.8
66
djangorestframework==3.9.2
7-
django-filter==2.1.0
7+
django-filter==2.2.0
88
packageurl-python==0.8.7
99
semantic-version==2.8.2
1010

1111
# Tests
12-
pytest==3.2.3
12+
pytest==5.3.2
13+
pytest-django==3.7.0
1314
pycodestyle==2.5.0
1415

1516
# Deployment
1617
gunicorn==19.7.1
17-
whitenoise==3.3.1
18+
whitenoise==5.0.1
1819
dj_database_url==0.4.2
1920
psycopg2==2.8.4

vulnerabilities/tests/conftest.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
import pytest
3+
import os
4+
import json
5+
6+
7+
from vulnerabilities.api import PackageSerializer
8+
from vulnerabilities.data_dump import debian_dump
9+
from vulnerabilities.data_dump import ubuntu_dump
10+
from vulnerabilities.data_dump import archlinux_dump
11+
from vulnerabilities.scraper import archlinux
12+
from vulnerabilities.scraper import debian
13+
from vulnerabilities.scraper import ubuntu
14+
from vulnerabilities.models import Package
15+
16+
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
17+
TEST_DATA = os.path.join(BASE_DIR, 'test_data/')
18+
19+
20+
@pytest.fixture
21+
def setDebianData(db):
22+
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
23+
test_data = json.load(f)
24+
25+
extract_data = debian.extract_vulnerabilities(test_data)
26+
debian_dump(extract_data)
27+
28+
29+
@pytest.fixture
30+
def setUbuntuData(db):
31+
with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f:
32+
test_data = f.read()
33+
34+
data = ubuntu.extract_cves(test_data)
35+
ubuntu_dump(data)
36+
37+
38+
@pytest.fixture
39+
def setArchLinuxData(db):
40+
with open(os.path.join(TEST_DATA, 'archlinux.json')) as f:
41+
test_data = json.load(f)
42+
43+
archlinux_dump(test_data)

vulnerabilities/tests/test_api.py

Lines changed: 71 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323

2424
import json
2525
import os
26+
import pytest
2627

27-
from django.test import TestCase
28+
from django.test import Client
2829

2930
from vulnerabilities.api import PackageSerializer
3031
from vulnerabilities.data_dump import debian_dump
@@ -38,114 +39,94 @@
3839
TEST_DATA = os.path.join(BASE_DIR, 'test_data/')
3940

4041

41-
class TestDebianResponse(TestCase):
42-
@classmethod
43-
def setUpTestData(cls):
44-
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
45-
test_data = json.load(f)
42+
def test_debian_query_by_name(setDebianData):
4643

47-
extract_data = debian.extract_vulnerabilities(test_data)
48-
debian_dump(extract_data)
44+
client = Client()
45+
response = client.get('/api/packages/?name=mimetex', format='json').data
46+
assert 4 == response['count']
47+
first_result = response['results'][0]
48+
assert 'mimetex' == first_result['name']
49+
versions = {r['version'] for r in response['results']}
50+
assert '1.50-1.1' in versions
51+
assert '1.74-1' in versions
4952

50-
Package.objects.create(
51-
name='mimetex',
52-
version='1.50-1.1',
53-
type='deb',
54-
namespace='ubuntu'
55-
)
56-
57-
def test_query_by_name(self):
58-
response = self.client.get('/api/packages/?name=mimetex', format='json').data
59-
60-
self.assertEqual(5, response['count'])
61-
62-
first_result = response['results'][0]
63-
self.assertEqual('mimetex', first_result['name'])
64-
65-
versions = {r['version'] for r in response['results']}
66-
self.assertIn('1.50-1.1', versions)
67-
self.assertIn('1.74-1', versions)
53+
purls = {r['package_url'] for r in response['results']}
54+
assert 'pkg:deb/debian/mimetex@1.50-1.1?distro=jessie' in purls
55+
assert 'pkg:deb/debian/mimetex@1.74-1?distro=jessie' in purls
6856

69-
purls = {r['package_url'] for r in response['results']}
70-
self.assertIn('pkg:deb/debian/mimetex@1.50-1.1?distro=jessie', purls)
71-
self.assertIn('pkg:deb/debian/mimetex@1.74-1?distro=jessie', purls)
7257

73-
def test_query_by_invalid_package_url(self):
74-
url = '/api/packages/?package_url=invalid_purl'
75-
response = self.client.get(url, format='json')
58+
def test_debian_query_by_invalid_package_url(setDebianData):
59+
client = Client()
60+
url = '/api/packages/?package_url=invalid_purl'
61+
response = client.get(url, format='json')
7662

77-
self.assertEqual(400, response.status_code)
78-
self.assertIn('error', response.data)
79-
error = response.data['error']
80-
self.assertIn('invalid_purl', error)
63+
assert 400 == response.status_code
64+
assert 'error' in response.data
65+
error = response.data['error']
66+
assert 'invalid_purl' in error
8167

82-
def test_query_by_package_url(self):
83-
url = '/api/packages/?package_url=pkg:deb/debian/mimetex@1.50-1.1?distro=jessie'
84-
response = self.client.get(url, format='json').data
8568

86-
self.assertEqual(2, response['count'])
69+
def test_debian_query_by_package_url(setDebianData):
70+
client = Client()
71+
url = '/api/packages/?package_url=pkg:deb/debian/mimetex@1.50-1.1?distro=jessie'
72+
response = client.get(url, format='json').data
8773

88-
first_result = response['results'][0]
89-
self.assertEqual('mimetex', first_result['name'])
74+
assert 2 == response['count']
9075

91-
versions = {r['version'] for r in response['results']}
92-
self.assertIn('1.50-1.1', versions)
93-
self.assertNotIn('1.74-1', versions)
76+
first_result = response['results'][0]
77+
assert 'mimetex' == first_result['name']
78+
versions = {r['version'] for r in response['results']}
79+
assert '1.50-1.1' in versions
80+
assert '1.74-1' not in versions
9481

95-
def test_query_by_package_url_without_namespace(self):
96-
url = '/api/packages/?package_url=pkg:deb/mimetex@1.50-1.1'
97-
response = self.client.get(url, format='json').data
9882

99-
self.assertEqual(3, response['count'])
83+
def test_debian_query_by_package_url_without_namespace(setDebianData):
10084

101-
first_result = response['results'][0]
102-
self.assertEqual('mimetex', first_result['name'])
103-
104-
purls = {r['package_url'] for r in response['results']}
105-
self.assertIn('pkg:deb/debian/mimetex@1.50-1.1?distro=jessie', purls)
106-
self.assertIn('pkg:deb/ubuntu/mimetex@1.50-1.1', purls)
107-
108-
109-
class TestUbuntuResponse(TestCase):
110-
def test_ubuntu_response(self):
111-
with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f:
112-
test_data = f.read()
113-
114-
extract_data = ubuntu.extract_cves(test_data)
115-
ubuntu_dump(extract_data)
116-
response = self.client.get('/api/packages/?name=automake', format='json')
85+
Package.objects.create(
86+
name='mimetex',
87+
version='1.50-1.1',
88+
type='deb',
89+
namespace='ubuntu'
90+
)
91+
client = Client()
92+
url = '/api/packages/?package_url=pkg:deb/mimetex@1.50-1.1'
93+
response = client.get(url, format='json').data
11794

118-
result = response.data.get('results')[0]
119-
self.assertEqual('automake', result['name'])
120-
self.assertEqual(None, result['version'])
121-
self.assertEqual(1, len(result['vulnerabilities']))
95+
assert 3 == response['count']
12296

123-
vuln = result['vulnerabilities'][0]
124-
self.assertEqual(0, len(vuln['references']))
97+
first_result = response['results'][0]
98+
assert 'mimetex' == first_result['name']
12599

100+
purls = {r['package_url'] for r in response['results']}
101+
assert 'pkg:deb/debian/mimetex@1.50-1.1?distro=jessie' in purls
102+
assert 'pkg:deb/ubuntu/mimetex@1.50-1.1' in purls
126103

127-
class TestSerializers(TestCase):
128-
@classmethod
129-
def setUpTestData(cls):
130-
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
131-
test_data = json.load(f)
132104

133-
extract_data = debian.extract_vulnerabilities(test_data)
134-
debian_dump(extract_data)
105+
def test_debian_package_serializer(setDebianData):
106+
client = Client()
107+
pk = Package.objects.filter(name="mimetex")
108+
response = PackageSerializer(pk, many=True).data
109+
print(response)
110+
assert 4 == len(response)
135111

136-
def test_package_serializer(self):
137-
pk = Package.objects.filter(name="mimetex")
138-
response = PackageSerializer(pk, many=True).data
112+
first_result = response[0]
113+
assert 'mimetex' == first_result['name']
139114

140-
self.assertEqual(4, len(response))
115+
versions = {r['version'] for r in response}
116+
assert '1.50-1.1' in versions
117+
assert '1.74-1' in versions
141118

142-
first_result = response[0]
143-
self.assertEqual('mimetex', first_result['name'])
119+
purls = {r['package_url'] for r in response}
120+
assert 'pkg:deb/debian/mimetex@1.50-1.1?distro=jessie' in purls
121+
assert 'pkg:deb/debian/mimetex@1.74-1?distro=jessie' in purls
144122

145-
versions = {r['version'] for r in response}
146-
self.assertIn('1.50-1.1', versions)
147-
self.assertIn('1.74-1', versions)
148123

149-
purls = {r['package_url'] for r in response}
150-
self.assertIn('pkg:deb/debian/mimetex@1.50-1.1?distro=jessie', purls)
151-
self.assertIn('pkg:deb/debian/mimetex@1.74-1?distro=jessie', purls)
124+
def test_ubuntu_response(setUbuntuData):
125+
client = Client()
126+
response = client.get('/api/packages/?name=automake', format='json')
127+
result = response.data.get('results')[0]
128+
assert 'automake' == result['name']
129+
assert result['version'] is None
130+
assert 1 == len(result['vulnerabilities'])
131+
vuln = result['vulnerabilities'][0]
132+
assert 0 == len(vuln['references'])

0 commit comments

Comments
 (0)