Skip to content

Commit

Permalink
Merge pull request #506 from nexB/505-collect-api-status-code
Browse files Browse the repository at this point in the history
Update collect API status codes
  • Loading branch information
JonoYang committed Jul 22, 2024
2 parents 14115c0 + 150d0a3 commit 25baac1
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 11 deletions.
7 changes: 7 additions & 0 deletions minecode/tests/test_maven.py
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,13 @@ def test_get_pom_text(self, regen=FIXTURES_REGEN):
f.write(pom_contents)
self.assertEqual(self.expected_pom_contents, pom_contents)

pom_contents = maven_visitor.get_pom_text(
namespace='',
name='does-not-exist',
version='1.0',
)
self.assertFalse(pom_contents)

def test_get_package_sha1(self):
sha1 = maven_visitor.get_package_sha1(self.scan_package)
expected_sha1 = '60c708f55deeb7c5dfce8a7886ef09cbc1388eca'
Expand Down
2 changes: 2 additions & 0 deletions minecode/visitors/maven.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ def get_pom_text(namespace, name, version, qualifiers={}, base_url=MAVEN_BASE_UR
qualifiers=qualifiers,
base_url=base_url,
)
if not urls:
return
# Get and parse POM info
pom_url = urls['api_data_url']
# TODO: manage different types of errors (404, etc.)
Expand Down
22 changes: 11 additions & 11 deletions packagedb/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,13 +250,13 @@ def filter_by_checksums(self, request, *args, **kwargs):
response_data = {
'status': f'Unsupported field(s) given: {unsupported_fields_str}'
}
return Response(response_data)
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

if not data:
response_data = {
'status': 'No values provided'
}
return Response(response_data)
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

lookups = Q()
for field, value in data.items():
Expand Down Expand Up @@ -467,14 +467,14 @@ def filter_by_checksums(self, request, *args, **kwargs):
response_data = {
'status': f'Unsupported field(s) given: {unsupported_fields_str}'
}
return Response(response_data)
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

enhance_package_data = data.pop('enhance_package_data', False)
if not data:
response_data = {
'status': 'No values provided'
}
return Response(response_data)
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

lookups = Q()
for field, value in data.items():
Expand Down Expand Up @@ -546,7 +546,7 @@ def create(self, request):
serializer = UpdatePackagesSerializer(data=request.data)

if not serializer.is_valid():
return Response({'errors': serializer.errors}, status=400)
return Response({'errors': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

validated_data = serializer.validated_data
packages = validated_data.get('purls', [])
Expand Down Expand Up @@ -812,7 +812,7 @@ def list(self, request, format=None):
return Response(
{'errors': serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
)

validated_data = serializer.validated_data
purl = validated_data.get('purl')
Expand Down Expand Up @@ -847,7 +847,7 @@ def list(self, request, format=None):
message = {
'status': f'error(s) occurred when fetching metadata for {purl}: {errors}'
}
return Response(message)
return Response(message, status=status.HTTP_400_BAD_REQUEST)
for package in packages:
get_source_package_and_add_to_package_set(package)

Expand Down Expand Up @@ -960,7 +960,7 @@ def _reindex_package(package, reindexed_packages, **kwargs):
serializer = self.serializer_class(data=request.data)

if not serializer.is_valid():
return Response({'errors': serializer.errors}, status=400)
return Response({'errors': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

validated_data = serializer.validated_data
packages = validated_data.get('packages', [])
Expand Down Expand Up @@ -1065,7 +1065,7 @@ def reindex_metadata(self, request, *args, **kwargs):
return Response(
{'errors': serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
)

validated_data = serializer.validated_data
purl = validated_data.get('purl')
Expand Down Expand Up @@ -1097,7 +1097,7 @@ def reindex_metadata(self, request, *args, **kwargs):
message = {
'status': f'error(s) occurred when fetching metadata for {purl}: {errors}'
}
return Response(message)
return Response(message, status=status.HTTP_400_BAD_REQUEST)

serializer = PackageAPISerializer(packages, many=True, context={'request': request})
return Response(serializer.data)
Expand Down Expand Up @@ -1169,7 +1169,7 @@ def list(self, request):
package_url = PackageURL.from_string(purl)
except ValueError:
serializer = PurlValidateResponseSerializer(response, context={'request': request})
return Response(serializer.data)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

response['valid'] = True
response["message"] = message_valid
Expand Down
67 changes: 67 additions & 0 deletions packagedb/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,19 @@ def test_api_resource_filter_by_checksums(self):
expected = self.get_test_loc('api/resource-filter_by_checksums-expected.json')
self.check_expected_results(response.data['results'], expected, fields_to_remove=["url", "uuid", "package"], regen=FIXTURES_REGEN)

data = {
'does-not-exist': 'dne'
}
response = self.client.post('/api/resources/filter_by_checksums/', data=data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = 'Unsupported field(s) given: does-not-exist'
self.assertEqual(expected_status, response.data['status'])

data = {}
response = self.client.post('/api/resources/filter_by_checksums/', data=data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = 'No values provided'
self.assertEqual(expected_status, response.data['status'])

class PackageApiTestCase(JsonBasedTesting, TestCase):
test_data_dir = os.path.join(os.path.dirname(__file__), 'testfiles')
Expand Down Expand Up @@ -485,6 +498,19 @@ def test_package_api_filter_by_checksums(self):
expected = self.get_test_loc('api/package-filter_by_checksums-enhanced-package-data-expected.json')
self.check_expected_results(enhanced_response.data['results'], expected, fields_to_remove=["url", "uuid", "resources", "package_sets", "history"], regen=FIXTURES_REGEN)

data = {
'does-not-exist': 'dne'
}
response = self.client.post('/api/packages/filter_by_checksums/', data=data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = 'Unsupported field(s) given: does-not-exist'
self.assertEqual(expected_status, response.data['status'])

data = {}
response = self.client.post('/api/packages/filter_by_checksums/', data=data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = 'No values provided'
self.assertEqual(expected_status, response.data['status'])

class PackageApiReindexingTestCase(JsonBasedTesting, TestCase):
test_data_dir = os.path.join(os.path.dirname(__file__), 'testfiles')
Expand Down Expand Up @@ -910,6 +936,12 @@ def test_package_api_index_packages_endpoint(self):
]
self.assertEqual(expected_unsupported_packages, response.data['unsupported_packages'])

bad_data = {'does-not-exist': 'dne'}
response = self.client.post('/api/collect/index_packages/', data=bad_data, content_type="application/json")
expected_errors = {'packages': ['This field is required.']}
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
self.assertEqual(expected_errors, response.data['errors'])

@mock.patch("packagedb.api.get_all_versions")
def test_package_api_index_packages_endpoint_with_vers(self, mock_get_all_versions):
priority_resource_uris_count = PriorityResourceURI.objects.all().count()
Expand Down Expand Up @@ -1132,6 +1164,29 @@ def test_package_api_index_packages_priority(self):
priority_resource_uri = PriorityResourceURI.objects.get(package_url=purl)
self.assertEqual(0, priority_resource_uri.priority)

def test_collect_errors(self):
invalid_purl = 'pkg:asdf1'
response = self.client.get(f'/api/collect/?purl={invalid_purl}')
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = {'purl': ["purl validation error: purl is missing the required type component: 'pkg:asdf1'."]}
self.assertEqual(expected_status, response.data['errors'])

unhandled_purl = 'pkg:does-not-exist/[email protected]'
response = self.client.get(f'/api/collect/?purl={unhandled_purl}')
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = f'cannot fetch Package data for {unhandled_purl}: no available handler'
self.assertEqual(expected_status, response.data['status'])

purl_str = 'pkg:maven/[email protected]'
response = self.client.get(f'/api/collect/?purl={purl_str}')
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
expected_status = (
'error(s) occurred when fetching metadata for pkg:maven/[email protected]: '
'Package does not exist on maven: pkg:maven/[email protected]\n'
'Package does not exist on maven: pkg:maven/[email protected]?classifier=sources\n'
)
self.assertEqual(expected_status, response.data['status'])


class ResourceApiTestCase(TestCase):

Expand Down Expand Up @@ -1321,11 +1376,14 @@ def test_api_purl_validation(self):
"The provided Package URL is valid, and the package exists in the upstream repo.",
response1.data["message"],
)
self.assertEqual(status.HTTP_200_OK, response1.status_code)

self.assertEqual(False, response2.data["valid"])
self.assertEqual(
"The provided PackageURL is not valid.", response2.data["message"]
)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response2.status_code)


def test_api_purl_validation_unsupported_package_type(self):
data1 = {
Expand All @@ -1344,6 +1402,11 @@ def test_api_purl_validation_empty_request(self):
data1 = {}
response1 = self.client.get(f"/api/validate/", data=data1)

data2 = {
"does-not-exist": "dne",
}
response2 = self.client.get(f"/api/validate/", data=data2)

expected = {
"errors": {
"purl": [
Expand All @@ -1353,6 +1416,10 @@ def test_api_purl_validation_empty_request(self):
}

self.assertAlmostEqual(expected, response1.data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response1.status_code)

self.assertAlmostEqual(expected, response2.data)
self.assertEqual(status.HTTP_400_BAD_REQUEST, response2.status_code)


class PackageWatchTestCase(TestCase):
Expand Down

0 comments on commit 25baac1

Please sign in to comment.