Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change Django Tests to pytests #133

Merged
merged 1 commit into from
Dec 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ before_script:
- ./manage.py migrate

script:
- python3.6 -m pytest -v vulnerabilities/tests/test_scrapers.py vulnerabilities/tests/test_api_data.py
- ./manage.py test vulnerabilities/tests
- pytest

notifications:
email: false
Expand Down
2 changes: 2 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[pytest]
DJANGO_SETTINGS_MODULE = vulnerablecode.settings
7 changes: 4 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ beautifulsoup4==4.7.1
lxml==4.3.3
django==2.2.8
djangorestframework==3.9.2
django-filter==2.1.0
django-filter==2.2.0
packageurl-python==0.8.7
semantic-version==2.8.2

# Tests
pytest==3.2.3
pytest==5.3.2
pytest-django==3.7.0
pycodestyle==2.5.0

# Deployment
gunicorn==19.7.1
whitenoise==3.3.1
whitenoise==5.0.1
dj_database_url==0.4.2
psycopg2==2.8.4
43 changes: 43 additions & 0 deletions vulnerabilities/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

import pytest
import os
import json


from vulnerabilities.api import PackageSerializer
from vulnerabilities.data_dump import debian_dump
from vulnerabilities.data_dump import ubuntu_dump
from vulnerabilities.data_dump import archlinux_dump
from vulnerabilities.scraper import archlinux
from vulnerabilities.scraper import debian
from vulnerabilities.scraper import ubuntu
from vulnerabilities.models import Package

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
TEST_DATA = os.path.join(BASE_DIR, 'test_data/')


@pytest.fixture
def setDebianData(db):
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
test_data = json.load(f)

extract_data = debian.extract_vulnerabilities(test_data)
debian_dump(extract_data)


@pytest.fixture
def setUbuntuData(db):
with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f:
test_data = f.read()

data = ubuntu.extract_cves(test_data)
ubuntu_dump(data)


@pytest.fixture
def setArchLinuxData(db):
with open(os.path.join(TEST_DATA, 'archlinux.json')) as f:
test_data = json.load(f)

archlinux_dump(test_data)
161 changes: 71 additions & 90 deletions vulnerabilities/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@

import json
import os
import pytest

from django.test import TestCase
from django.test import Client

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


class TestDebianResponse(TestCase):
@classmethod
def setUpTestData(cls):
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
test_data = json.load(f)
def test_debian_query_by_name(setDebianData):

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

Package.objects.create(
name='mimetex',
version='1.50-1.1',
type='deb',
namespace='ubuntu'
)

def test_query_by_name(self):
response = self.client.get('/api/packages/?name=mimetex', format='json').data

self.assertEqual(5, response['count'])

first_result = response['results'][0]
self.assertEqual('mimetex', first_result['name'])

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

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

def test_query_by_invalid_package_url(self):
url = '/api/packages/?package_url=invalid_purl'
response = self.client.get(url, format='json')
def test_debian_query_by_invalid_package_url(setDebianData):
client = Client()
url = '/api/packages/?package_url=invalid_purl'
response = client.get(url, format='json')

self.assertEqual(400, response.status_code)
self.assertIn('error', response.data)
error = response.data['error']
self.assertIn('invalid_purl', error)
assert 400 == response.status_code
assert 'error' in response.data
error = response.data['error']
assert 'invalid_purl' in error

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

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

first_result = response['results'][0]
self.assertEqual('mimetex', first_result['name'])
assert 2 == response['count']

versions = {r['version'] for r in response['results']}
self.assertIn('1.50-1.1', versions)
self.assertNotIn('1.74-1', versions)
first_result = response['results'][0]
assert 'mimetex' == first_result['name']
versions = {r['version'] for r in response['results']}
assert '1.50-1.1' in versions
assert '1.74-1' not in versions

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

self.assertEqual(3, response['count'])
def test_debian_query_by_package_url_without_namespace(setDebianData):

first_result = response['results'][0]
self.assertEqual('mimetex', first_result['name'])

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


class TestUbuntuResponse(TestCase):
def test_ubuntu_response(self):
with open(os.path.join(TEST_DATA, 'ubuntu_main.html')) as f:
test_data = f.read()

extract_data = ubuntu.extract_cves(test_data)
ubuntu_dump(extract_data)
response = self.client.get('/api/packages/?name=automake', format='json')
Package.objects.create(
name='mimetex',
version='1.50-1.1',
type='deb',
namespace='ubuntu'
)
client = Client()
url = '/api/packages/?package_url=pkg:deb/mimetex@1.50-1.1'
response = client.get(url, format='json').data

result = response.data.get('results')[0]
self.assertEqual('automake', result['name'])
self.assertEqual(None, result['version'])
self.assertEqual(1, len(result['vulnerabilities']))
assert 3 == response['count']

vuln = result['vulnerabilities'][0]
self.assertEqual(0, len(vuln['references']))
first_result = response['results'][0]
assert 'mimetex' == first_result['name']

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

class TestSerializers(TestCase):
@classmethod
def setUpTestData(cls):
with open(os.path.join(TEST_DATA, 'debian.json')) as f:
test_data = json.load(f)

extract_data = debian.extract_vulnerabilities(test_data)
debian_dump(extract_data)
def test_debian_package_serializer(setDebianData):
client = Client()
pk = Package.objects.filter(name="mimetex")
response = PackageSerializer(pk, many=True).data
print(response)
assert 4 == len(response)

def test_package_serializer(self):
pk = Package.objects.filter(name="mimetex")
response = PackageSerializer(pk, many=True).data
first_result = response[0]
assert 'mimetex' == first_result['name']

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

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

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

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