From 07409de4ef87b91efb00a0943a74e91cecd8cc6d Mon Sep 17 00:00:00 2001 From: Rodrigo Gomes Date: Mon, 3 Feb 2020 11:06:52 +0100 Subject: [PATCH] OPT: allow dot in metadata key --- katka/views.py | 1 + tests/integration/conftest.py | 9 +++++++ .../test_application_metadata_view.py | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/katka/views.py b/katka/views.py index 7a18f72..6fdc512 100644 --- a/katka/views.py +++ b/katka/views.py @@ -284,6 +284,7 @@ class ApplicationMetadataViewSet(AuditViewSet): model = ApplicationMetadata serializer_class = ApplicationMetadataSerializer lookup_field = "key" + lookup_value_regex = r"[^/]+" def get_queryset(self): kwargs = { diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index fcefcc6..7d59e5d 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -738,6 +738,15 @@ def my_metadata(my_application): return meta +@pytest.fixture +def my_metadata_with_dot_in_key(my_application): + meta = models.ApplicationMetadata(key="rfc.ci", value="the-team", application=my_application) + with username_on_model(models.ApplicationMetadata, "initial"): + meta.save() + + return meta + + @pytest.fixture def deactivated_metadata(deactivated_application): metadata = models.ApplicationMetadata(key="ci", value="the-team-2", application=deactivated_application) diff --git a/tests/integration/test_application_metadata_view.py b/tests/integration/test_application_metadata_view.py index 229d058..717f043 100644 --- a/tests/integration/test_application_metadata_view.py +++ b/tests/integration/test_application_metadata_view.py @@ -33,6 +33,15 @@ def test_authenticated(self, client, logged_in_user, application, metadata): assert metadata["value"] == "the-team" assert UUID(metadata["application"]) == application.public_identifier + def test_get_key_with_dot(self, client, logged_in_user, application, my_metadata_with_dot_in_key): + url = f"/applications/{application.public_identifier}/metadata/{my_metadata_with_dot_in_key.key}/" + response = client.get(url) + assert response.status_code == 200 + metadata = response.json() + assert metadata["key"] == "rfc.ci" + assert metadata["value"] == "the-team" + assert UUID(metadata["application"]) == application.public_identifier + def test_non_existent_application(self, client, logged_in_user, application, metadata): url = f"/applications/00000000-0000-0000-0000-000000000000/metadata/{metadata.key}/" response = client.get(url) @@ -68,6 +77,13 @@ def test_authenticated(self, client, logged_in_user, application, metadata): s = models.ApplicationMetadata.objects.get(key=metadata.key, application=application) assert s.deleted is True + def test_delete_key_with_dot(self, client, logged_in_user, application, my_metadata_with_dot_in_key): + url = f"/applications/{application.public_identifier}/metadata/{my_metadata_with_dot_in_key.key}/" + response = client.delete(url) + assert response.status_code == 204 + s = models.ApplicationMetadata.objects.get(key=my_metadata_with_dot_in_key.key, application=application) + assert s.deleted is True + def test_non_existent(self, client, logged_in_user, application, metadata): before_count = models.ApplicationMetadata.objects.count() url = f"/applications/00000000-0000-0000-0000-000000000000/metadata/{metadata.key}/" @@ -138,6 +154,14 @@ def test_not_my_metadata(self, client, logged_in_user, not_my_application, not_m s = models.ApplicationMetadata.objects.get(key=not_my_metadata.key, application=not_my_application) assert s.value == "the-team-not-mine" + def test_update_key_with_dot(self, client, logged_in_user, application, my_metadata_with_dot_in_key): + url = f"/applications/{application.public_identifier}/metadata/{my_metadata_with_dot_in_key.key}/" + data = {"key": my_metadata_with_dot_in_key.key, "value": "new value"} + response = client.put(url, data, content_type="application/json") + assert response.status_code == 200 + s = models.ApplicationMetadata.objects.get(key=my_metadata_with_dot_in_key.key, application=application) + assert s.value == "new value" + @pytest.mark.django_db class TestApplicationMetadataPartialUpdate: