Skip to content

Commit ad3a4b4

Browse files
committed
Create tests for API changes #504
Signed-off-by: Jono Yang <[email protected]>
1 parent c23b526 commit ad3a4b4

File tree

4 files changed

+86
-86
lines changed

4 files changed

+86
-86
lines changed

minecode/models.py

-5
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,14 @@
88
#
99

1010
from datetime import timedelta
11-
from contextlib import suppress
1211
import logging
1312
import sys
1413
import uuid
1514

1615
from django.conf import settings
17-
from django.contrib.auth.models import AbstractUser
18-
from django.contrib.auth.models import BaseUserManager
19-
from django.contrib.auth.models import Group
2016
from django.db import models
2117
from django.utils import timezone
2218

23-
from rest_framework.authtoken.models import Token
2419
import django_rq
2520

2621
from minecode import map_router

minecode/tests/test_api.py

+79-71
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
import os
1212

1313
from django.contrib.auth.models import Group, User
14+
from django.core import signing
1415
from django.test import TestCase
1516
from rest_framework import status
1617
from rest_framework.test import APIClient
1718

1819
from minecode.models import ScannableURI
20+
from minecode.utils import get_webhook_url
1921
from minecode.utils_test import JsonBasedTesting
2022
from packagedb.models import Package, Resource
2123

@@ -34,6 +36,7 @@ def setUp(self):
3436
self.scan_queue_worker_auth = f"Token {self.scan_queue_worker_user.auth_token.key}"
3537
self.scan_queue_worker_client = APIClient(enforce_csrf_checks=True)
3638
self.scan_queue_worker_client.credentials(HTTP_AUTHORIZATION=self.scan_queue_worker_auth)
39+
self.scan_queue_worker_user_id_str = str(self.scan_queue_worker_user.id)
3740

3841
# create a staff user
3942
self.staff_user = User.objects.create_user(
@@ -120,126 +123,79 @@ def test_api_scannable_uri_list_endpoint(self):
120123
self.assertEqual(3, response.data.get('count'))
121124

122125
def test_api_scannable_uri_get_next_download_url(self):
126+
def check_webhook_url(self, webhook_url):
127+
webhook_url = response.data.get('webhook_url')
128+
key = webhook_url.rstrip('/').split('/')[-1]
129+
self.assertIn('/api/scan_queue/index_package_scan/', webhook_url)
130+
self.assertEqual(signing.loads(key), str(self.scan_queue_worker_user.id))
131+
123132
response = self.scan_queue_worker_client.get('/api/scan_queue/get_next_download_url/')
124133
self.assertEqual(response.status_code, status.HTTP_200_OK)
125134
self.assertEqual(response.data.get('scannable_uri_uuid'), self.scannable_uri1.uuid)
126135
self.assertEqual(response.data.get('download_url'), self.scannable_uri1.uri)
136+
check_webhook_url(self, response.data.get('webhook_url'))
127137

128138
response = self.scan_queue_worker_client.get('/api/scan_queue/get_next_download_url/')
129139
self.assertEqual(response.status_code, status.HTTP_200_OK)
130140
self.assertEqual(response.data.get('scannable_uri_uuid'), self.scannable_uri2.uuid)
131141
self.assertEqual(response.data.get('download_url'), self.scannable_uri2.uri)
142+
check_webhook_url(self, response.data.get('webhook_url'))
132143

133144
response = self.scan_queue_worker_client.get('/api/scan_queue/get_next_download_url/')
134145
self.assertEqual(response.status_code, status.HTTP_200_OK)
135146
self.assertEqual(response.data.get('scannable_uri_uuid'), self.scannable_uri3.uuid)
136147
self.assertEqual(response.data.get('download_url'), self.scannable_uri3.uri)
148+
check_webhook_url(self, response.data.get('webhook_url'))
137149

138150
response = self.scan_queue_worker_client.get('/api/scan_queue/get_next_download_url/')
139151
self.assertEqual(response.status_code, status.HTTP_200_OK)
140152
self.assertEqual(response.data.get('scannable_uri_uuid'), '')
141153
self.assertEqual(response.data.get('download_url'), '')
154+
self.assertEqual(response.data.get('webhook_url'), '')
142155

143156
response = self.staff_client.get('/api/scan_queue/get_next_download_url/')
144157
self.assertEqual(response.status_code, status.HTTP_200_OK)
145158
self.assertEqual(response.data.get('scannable_uri_uuid'), '')
146159
self.assertEqual(response.data.get('download_url'), '')
160+
self.assertEqual(response.data.get('webhook_url'), '')
147161

148162
def test_api_scannable_uri_update_status(self):
163+
scannable_uri1_uuid = self.scannable_uri1.uuid
164+
scannable_uri2_uuid = self.scannable_uri2.uuid
165+
scannable_uri1_update_status_url = f'/api/scan_queue/{scannable_uri1_uuid}/update_status/'
166+
scannable_uri2_update_status_url = f'/api/scan_queue/{scannable_uri2_uuid}/update_status/'
167+
149168
self.assertEqual(ScannableURI.SCAN_NEW, self.scannable_uri1.scan_status)
150169
data = {
151-
"scannable_uri_uuid": self.scannable_uri1.uuid,
170+
"scannable_uri_uuid": scannable_uri1_uuid,
152171
"scan_status": 'failed',
153172
'scan_log': 'scan_log',
154173
}
155-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
174+
response = self.scan_queue_worker_client.post(scannable_uri1_update_status_url, data=data)
156175
self.assertEqual(response.status_code, status.HTTP_200_OK)
157176
self.scannable_uri1.refresh_from_db()
158177
self.assertEqual(ScannableURI.SCAN_FAILED, self.scannable_uri1.scan_status)
159178
self.assertEqual('scan_log', self.scannable_uri1.scan_error)
160179

161-
self.assertFalse(self.package2.md5)
162-
self.assertFalse(self.package2.sha1)
163-
self.assertFalse(self.package2.sha256)
164-
self.assertFalse(self.package2.sha512)
165-
self.assertFalse(self.package2.size)
166-
self.assertFalse(self.package2.declared_license_expression)
167-
self.assertFalse(self.package2.copyright)
168-
self.assertEqual(0, Resource.objects.all().count())
169-
scan_file_location = self.get_test_loc('scancodeio/get_scan_data.json')
170-
summary_file_location = self.get_test_loc('scancodeio/scan_summary_response.json')
171-
project_extra_data = {
172-
'md5': 'md5',
173-
'sha1': 'sha1',
174-
'sha256': 'sha256',
175-
'sha512': 'sha512',
176-
'size': 100,
177-
}
178-
with open(scan_file_location) as scan_file:
179-
with open(summary_file_location) as summary_file:
180-
data = {
181-
"scannable_uri_uuid": self.scannable_uri2.uuid,
182-
"scan_status": 'scanned',
183-
'project_extra_data': json.dumps(project_extra_data),
184-
'scan_results_file': scan_file,
185-
'scan_summary_file': summary_file,
186-
}
187-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
188-
self.assertEqual(response.status_code, status.HTTP_200_OK)
189-
self.scannable_uri2.refresh_from_db()
190-
self.assertEqual(ScannableURI.SCAN_INDEXED, self.scannable_uri2.scan_status)
191-
self.package2.refresh_from_db()
192-
self.assertEqual('md5', self.package2.md5)
193-
self.assertEqual('sha1', self.package2.sha1)
194-
self.assertEqual('sha256', self.package2.sha256)
195-
self.assertEqual('sha512', self.package2.sha512)
196-
self.assertEqual(100, self.package2.size)
197-
self.assertEqual('apache-2.0', self.package2.declared_license_expression)
198-
self.assertEqual('Copyright (c) Apache Software Foundation', self.package2.copyright)
199-
self.assertFalse(self.scannable_uri2.scan_error)
200-
self.assertEqual(64, Resource.objects.all().count())
201-
202-
data = {}
203-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
204-
expected_response = {'error': 'missing scannable_uri_uuid'}
205-
self.assertEqual(expected_response, response.data)
206-
207180
data = {
208-
'scannable_uri_uuid': self.scannable_uri2.uuid,
209181
'scan_status': ''
210182
}
211-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
183+
response = self.scan_queue_worker_client.post(scannable_uri2_update_status_url, data=data)
212184
expected_response = {'error': 'missing scan_status'}
213185
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
214186
self.assertEqual(expected_response, response.data)
215187

216188
data = {
217-
'scannable_uri_uuid': self.scannable_uri2.uuid,
218189
'scan_status': 'invalid'
219190
}
220-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
191+
response = self.scan_queue_worker_client.post(scannable_uri2_update_status_url, data=data)
221192
expected_response = {'error': 'invalid scan_status: invalid'}
222193
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
223194
self.assertEqual(expected_response, response.data)
224195

225-
data = {
226-
'scannable_uri_uuid': 'asdf',
227-
'scan_status': 'scanned'
228-
}
229-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
230-
expected_response = {'error': 'invalid scannable_uri_uuid: asdf'}
231-
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
232-
self.assertEqual(expected_response, response.data)
233-
234-
# Test that staff user can use endpoint
235-
data = {
236-
'scannable_uri_uuid': 'asdf',
237-
'scan_status': 'scanned'
238-
}
239-
response = self.staff_client.post('/api/scan_queue/update_status/', data=data)
240-
expected_response = {'error': 'invalid scannable_uri_uuid: asdf'}
241-
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
242-
self.assertEqual(expected_response, response.data)
196+
data = {}
197+
response = self.scan_queue_worker_client.post('/api/scan_queue/asdf/', data=data)
198+
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
243199

244200
def test_api_scannable_uri_update_status_update_finished_scannable_uri(self):
245201
scannable_uri_uuid = self.scannable_uri3.uuid
@@ -255,11 +211,63 @@ def test_api_scannable_uri_update_status_update_finished_scannable_uri(self):
255211
'scannable_uri_uuid': scannable_uri_uuid,
256212
'scan_status': 'scanned'
257213
}
258-
response = self.scan_queue_worker_client.post('/api/scan_queue/update_status/', data=data)
214+
response = self.scan_queue_worker_client.post(
215+
f'/api/scan_queue/{scannable_uri_uuid}/update_status/', data=data
216+
)
259217
expected_response = {
260218
'error': 'cannot update status for scannable_uri '
261219
f'{self.scannable_uri3.uuid}: scannable_uri has finished '
262220
f'with status "{ScannableURI.SCAN_STATUSES_BY_CODE[scan_status]}"'
263221
}
264222
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
265223
self.assertEqual(expected_response, response.data)
224+
225+
def test_api_scannable_uri_index_package_scan(self):
226+
self.assertFalse(self.package2.md5)
227+
self.assertFalse(self.package2.sha1)
228+
self.assertFalse(self.package2.sha256)
229+
self.assertFalse(self.package2.sha512)
230+
self.assertFalse(self.package2.size)
231+
self.assertFalse(self.package2.declared_license_expression)
232+
self.assertFalse(self.package2.copyright)
233+
self.assertEqual(0, Resource.objects.all().count())
234+
scan_file_location = self.get_test_loc('scancodeio/get_scan_data.json')
235+
summary_file_location = self.get_test_loc('scancodeio/scan_summary_response.json')
236+
project_extra_data = {
237+
'scannable_uri_uuid': self.scannable_uri2.uuid,
238+
'md5': 'md5',
239+
'sha1': 'sha1',
240+
'sha256': 'sha256',
241+
'sha512': 'sha512',
242+
'size': 100,
243+
}
244+
with (
245+
open(scan_file_location) as scan_file,
246+
open(summary_file_location) as summary_file
247+
):
248+
results = json.load(scan_file)
249+
summary = json.load(summary_file)
250+
data = {
251+
'project': {
252+
'extra_data': project_extra_data,
253+
},
254+
'results': results,
255+
'summary': summary,
256+
}
257+
258+
webhook_url = get_webhook_url('index_package_scan', self.scan_queue_worker_user.id)
259+
260+
response = self.scan_queue_worker_client.post(webhook_url, data=data, format='json')
261+
self.assertEqual(response.status_code, status.HTTP_200_OK)
262+
self.scannable_uri2.refresh_from_db()
263+
self.assertEqual(ScannableURI.SCAN_INDEXED, self.scannable_uri2.scan_status)
264+
self.package2.refresh_from_db()
265+
self.assertEqual('md5', self.package2.md5)
266+
self.assertEqual('sha1', self.package2.sha1)
267+
self.assertEqual('sha256', self.package2.sha256)
268+
self.assertEqual('sha512', self.package2.sha512)
269+
self.assertEqual(100, self.package2.size)
270+
self.assertEqual('apache-2.0', self.package2.declared_license_expression)
271+
self.assertEqual('Copyright (c) Apache Software Foundation', self.package2.copyright)
272+
self.assertFalse(self.scannable_uri2.scan_error)
273+
self.assertEqual(64, Resource.objects.all().count())

minecode/tests/test_tasks.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,11 @@ def test_minecode_tasks_process_scan_results(self, mock_delete):
5555
self.assertEqual(0, self.package1.resources.count())
5656
scan_file_location = self.get_test_loc('scancodeio/get_scan_data.json')
5757
summary_file_location = self.get_test_loc('scancodeio/scan_summary_response.json')
58-
project_extra_data = json.dumps(self.project_extra_data1)
5958
tasks.process_scan_results(
6059
self.scannable_uri1.uuid,
6160
scan_results_location=scan_file_location,
6261
scan_summary_location=summary_file_location,
63-
project_extra_data=project_extra_data,
62+
project_extra_data=self.project_extra_data1,
6463
)
6564
self.package1.refresh_from_db()
6665
self.assertEqual('md5', self.package1.md5)

minecode/tests/test_utils.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414

1515
from packagedcode import models as scan_models
1616

17+
from minecode import utils
1718
from minecode.utils_test import JsonBasedTesting
18-
from minecode.utils import is_int
19-
from minecode.utils import stringify_null_purl_fields
20-
from minecode.utils import validate_uuid
2119

2220

2321
class UtilsTest(JsonBasedTesting, DjangoTestCase):
@@ -28,7 +26,7 @@ def test_stringify_null_purl_fields_with_missing_purl_fields(self):
2826
'type': None
2927
}
3028

31-
stringify_null_purl_fields(common_data)
29+
utils.stringify_null_purl_fields(common_data)
3230

3331
self.assertEqual(1, len(common_data))
3432
self.assertEqual('', common_data['type'])
@@ -43,7 +41,7 @@ def test_stringify_null_purl_fields(self):
4341
'subpath': None
4442
}
4543

46-
stringify_null_purl_fields(common_data)
44+
utils.stringify_null_purl_fields(common_data)
4745

4846
for d in common_data:
4947
self.assertIsNotNone(common_data[d])
@@ -65,8 +63,8 @@ def test_set_purl(self):
6563
self.assertEqual(None, package.subpath)
6664

6765
def test_is_int(self):
68-
self.assertTrue(is_int(0))
69-
self.assertFalse(is_int('a'))
66+
self.assertTrue(utils.is_int(0))
67+
self.assertFalse(utils.is_int('a'))
7068

7169
def test_validate_uuid(self):
7270
invalid_uuid1 = 'invalid'
@@ -78,4 +76,4 @@ def test_validate_uuid(self):
7876
[invalid_uuid2, False],
7977
[valid_uuid, True],
8078
]:
81-
self.assertEqual(expected_result, validate_uuid(uuid))
79+
self.assertEqual(expected_result, utils.validate_uuid(uuid))

0 commit comments

Comments
 (0)