Skip to content
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
2 changes: 1 addition & 1 deletion requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ click-plugins==1.1.1
# via celery
click-repl==0.3.0
# via celery
commonground-api-common==2.10.7
commonground-api-common==2.11.0
# via
# -r requirements/base.in
# open-api-framework
Expand Down
2 changes: 1 addition & 1 deletion requirements/ci.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ click-repl==0.3.0
# celery
codecov==2.1.13
# via -r requirements/test-tools.in
commonground-api-common==2.10.7
commonground-api-common==2.11.0
# via
# -c requirements/base.txt
# -r requirements/base.txt
Expand Down
2 changes: 1 addition & 1 deletion requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ codecov==2.1.13
# via
# -c requirements/ci.txt
# -r requirements/ci.txt
commonground-api-common==2.10.7
commonground-api-common==2.11.0
# via
# -c requirements/ci.txt
# -r requirements/ci.txt
Expand Down
2 changes: 1 addition & 1 deletion src/objects/conf/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"DEFAULT_VERSION": "v2", # NOT to be confused with API_VERSION - it's the major version part
"ALLOWED_VERSIONS": ("v2",),
"VERSION_PARAM": "version",
"EXCEPTION_HANDLER": "objects.utils.views.exception_handler",
"EXCEPTION_HANDLER": "vng_api_common.exception_handling.exception_handler",
# test
"TEST_REQUEST_DEFAULT_FORMAT": "json",
}
Expand Down
32 changes: 23 additions & 9 deletions src/objects/tests/v2/test_auth_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from rest_framework import status
from rest_framework.test import APITestCase
from vng_api_common.tests import get_validation_errors

from objects.core.tests.factories import (
ObjectFactory,
Expand Down Expand Up @@ -109,9 +110,12 @@ def test_retrieve_incorrect_auth_fields(self):
response = self.client.get(url)

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(),
["Fields in the configured authorization are absent in the data: 'some'"],
error["reason"],
"Fields in the configured authorization are absent in the data: 'some'",
)

def test_retrieve_query_fields_not_allowed(self):
Expand Down Expand Up @@ -304,7 +308,9 @@ def test_list_incorrect_auth_fields(self):
fields={"1": ["url", "uuid", "record"]},
)
ObjectRecordFactory.create(
object__object_type=self.object_type, data={"name": "some"}, version=1
object__object_type=self.object_type,
data={"name": "some"},
version=1,
)
ObjectRecordFactory.create(
object__object_type=self.other_object_type,
Expand All @@ -315,9 +321,12 @@ def test_list_incorrect_auth_fields(self):
response = self.client.get(self.url)

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(
response.json(),
["Fields in the configured authorization are absent in the data: 'some'"],

error = get_validation_errors(response, "")

self.assertIn(
"Fields in the configured authorization are absent in the data: 'some'",
error["reason"],
)

def test_retrieve_query_fields_not_allowed(self):
Expand All @@ -336,7 +345,9 @@ def test_retrieve_query_fields_not_allowed(self):
fields={"1": ["url", "uuid", "record"]},
)
ObjectRecordFactory.create(
object__object_type=self.object_type, data={"name": "some"}, version=1
object__object_type=self.object_type,
data={"name": "some"},
version=1,
)
ObjectRecordFactory.create(
object__object_type=self.other_object_type,
Expand All @@ -347,9 +358,12 @@ def test_retrieve_query_fields_not_allowed(self):
response = self.client.get(self.url, {"fields": "uuid"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

data = response.json()

self.assertEqual(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
self.assertEqual(
error = get_validation_errors(response, "")
self.assertEqual(error["reason"]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you forget this one

response.json(),
["'fields' query parameter has invalid or unauthorized values: 'uuid'"],
data["invalid_params"][0]["reason"],
"'fields' query parameter has invalid or unauthorized values: 'uuid'",
)

def test_list_no_allowed_fields(self):
Expand Down
119 changes: 84 additions & 35 deletions src/objects/tests/v2/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from furl import furl
from rest_framework import status
from rest_framework.test import APITestCase
from vng_api_common.tests import get_validation_errors

from objects.core.tests.factories import (
ObjectFactory,
Expand Down Expand Up @@ -66,7 +67,11 @@ def test_filter_invalid_objecttype(self):
response = self.client.get(self.url, {"type": "invalid-objecttype-url"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json()["type"], ["Invalid value."])

error = get_validation_errors(response, "type")

self.assertEqual(error["reason"], "Invalid value.")
self.assertEqual(error["code"], "invalid")

def test_filter_unknown_objecttype(self):
objecttype_url = (
Expand All @@ -75,19 +80,30 @@ def test_filter_unknown_objecttype(self):
response = self.client.get(self.url, {"type": objecttype_url})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now, since the response is consistent with other projects, with invalid_params, etc., you can use this method to get the errors from vng_api_common.tests import get_validation_errors.

You can apply this for all tests as well.

error = get_validation_errors(response, "type")

self.assertEqual(
response.json()["type"],
[
f"Select a valid object type. {objecttype_url} is not one of the available choices."
],
error,
{
"name": "type",
"code": "invalid_choice",
"reason": (
f"Select a valid object type. {objecttype_url} is not one of the available choices."
),
},
)

def test_filter_too_long_object_type(self):
object_type_long = f"{OBJECT_TYPES_API}{'a' * 1000}/{self.object_type.uuid}"
response = self.client.get(self.url, {"type": object_type_long})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json()["type"], ["The value has too many characters"])

error = get_validation_errors(response, "type")

self.assertEqual(error["code"], "max_length")
self.assertEqual(error["reason"], "The value has too many characters")


class FilterDataAttrsTests(TokenAuthMixin, APITestCase):
Expand Down Expand Up @@ -218,8 +234,12 @@ def test_filter_lte_not_numerical(self):
response = self.client.get(self.url, {"data_attrs": "diameter__lt__value"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(), ["Operator `lt` supports only dates and/or numeric values"]
error["reason"],
"Operator `lt` supports only dates and/or numeric values",
)

def test_filter_lte_date(self):
Expand Down Expand Up @@ -255,20 +275,27 @@ def test_filter_lte_date(self):

def test_filter_invalid_operator(self):
response = self.client.get(self.url, {"data_attrs": "diameter__not__value"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), ["Comparison operator `not` is unknown"])

error = get_validation_errors(response, "")

self.assertEqual(
error["reason"],
"Comparison operator `not` is unknown",
)
self.assertEqual(error["code"], "invalid-data-attrs-query")

def test_filter_invalid_param(self):
response = self.client.get(self.url, {"data_attrs": "diameter__exact"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(),
[
"Filter expression 'diameter__exact' doesn't have the shape 'key__operator__value'"
],
error["reason"],
"Filter expression 'diameter__exact' doesn't have the shape 'key__operator__value'",
)
self.assertEqual(error["code"], "invalid-data-attrs-query")

def test_filter_nested_attr(self):
record = ObjectRecordFactory.create(
Expand Down Expand Up @@ -570,8 +597,11 @@ def test_filter_lte_not_numerical(self):
response = self.client.get(self.url, {"data_attr": "diameter__lt__value"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(), ["Operator `lt` supports only dates and/or numeric values"]
"Operator `lt` supports only dates and/or numeric values", error["reason"]
)

def test_filter_lte_date(self):
Expand Down Expand Up @@ -609,17 +639,24 @@ def test_filter_invalid_operator(self):
response = self.client.get(self.url, {"data_attr": "diameter__not__value"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), ["Comparison operator `not` is unknown"])

error = get_validation_errors(response, "")

self.assertEqual(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
self.assertEqual(
error = get_validation_errors(response, "")
self.assertEqual(

error["reason"],
"Comparison operator `not` is unknown",
)

def test_filter_invalid_param(self):
response = self.client.get(self.url, {"data_attr": "diameter__exact"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(),
[
"Filter expression 'diameter__exact' doesn't have the shape 'key__operator__value'"
],
error["reason"],
"Filter expression 'diameter__exact' doesn't have the shape 'key__operator__value'",
)

def test_filter_nested_attr(self):
Expand Down Expand Up @@ -819,18 +856,21 @@ def test_filter_two_icontains_with_comma(self):

def test_filter_comma_separated_invalid(self):
response = self.client.get(
self.url, {"data_attr": "dimensions__diameter__exact__4,name__exact__demo"}
self.url,
{"data_attr": "dimensions__diameter__exact__4,name__exact__demo"},
)

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

error = get_validation_errors(response, "")

self.assertEqual(
response.json(),
[
"Filter expression 'dimensions__diameter__exact__4,name__exact__demo' "
"must have the shape 'key__operator__value', commas can only be present in "
"the 'value'"
],
error["reason"],
"Filter expression 'dimensions__diameter__exact__4,name__exact__demo' "
"must have the shape 'key__operator__value', commas can only be present in "
"the 'value'",
)
self.assertEqual(error["code"], "invalid-data-attr-query")


class FilterDateTests(TokenAuthMixin, APITestCase):
Expand Down Expand Up @@ -941,6 +981,8 @@ def test_filter_registration_date_list(self):

response = self.client.get(url, {"registrationDate": "2020-07-01"})

self.assertEqual(response.status_code, status.HTTP_200_OK)

data = response.json()["results"]

self.assertEqual(len(data), 1)
Expand All @@ -952,17 +994,18 @@ def test_filter_registration_date_list(self):

def test_filter_on_both_date_and_registration_date(self):
url = reverse_lazy("object-list")

response = self.client.get(
url, {"date": "2020-07-01", "registrationDate": "2020-08-01"}
url,
{"date": "2020-07-01", "registrationDate": "2020-08-01"},
)

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

data = response.json()

self.assertEqual(
response.json(),
[
"'date' and 'registrationDate' parameters can't be used in the same request"
],
data["invalid_params"][0]["reason"],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
data["invalid_params"][0]["reason"],
error = get_validation_errors(response, "")
data["invalid_params"][0]["reason"],

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also here

"'date' and 'registrationDate' parameters can't be used in the same request",
)


Expand Down Expand Up @@ -1033,13 +1076,19 @@ def test_filter_db_error(self, mock_query):
response = self.client.get(self.url, {"data_icontains": "some"})

self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)

data = response.json()

data.pop("instance", None)

self.assertEqual(
response.json(),
data,
{
"code": "error",
"code": "search-not-supported",
"title": "Internal Server Error",
"status": 500,
"detail": "This search operation is not supported by the underlying data store.",
"type": "http://testserver/ref/fouten/ProgrammingError/",
},
)

Expand Down
35 changes: 33 additions & 2 deletions src/objects/tests/v2/test_object_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from freezegun import freeze_time
from rest_framework import status
from rest_framework.test import APITestCase
from vng_api_common.tests import get_validation_errors

from objects.core.models import Object, Reference
from objects.core.tests.factories import (
Expand Down Expand Up @@ -869,7 +870,21 @@ def test_list_incorrect_date(self):
response = self.client.get(self.url, {"date": "2024-31-08"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), {"date": ["Enter a valid date."]})

data = response.json()

self.assertEqual(data["status"], 400)
self.assertEqual(data["code"], "invalid")
self.assertEqual(data["title"], "Invalid input.")
error = get_validation_errors(response, "date")
self.assertEqual(
error["name"],
"date",
)
self.assertEqual(
error["reason"],
"Enter a valid date.",
)

def test_list_available_for_registration_date(self):
with self.subTest("filter on old name"):
Expand Down Expand Up @@ -903,4 +918,20 @@ def test_list_incorrect_registration_date(self):
response = self.client.get(self.url, {"registrationDate": "2024-31-08"})

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), {"registrationDate": ["Enter a valid date."]})

data = response.json()

self.assertEqual(data["status"], 400)
self.assertEqual(data["code"], "invalid")
self.assertEqual(data["title"], "Invalid input.")

error = get_validation_errors(response, "registrationDate")

self.assertEqual(
error["name"],
"registrationDate",
)
self.assertEqual(
error["reason"],
"Enter a valid date.",
)
Loading
Loading