Skip to content

Commit a2af9d0

Browse files
authored
fix: [AAP-36846] - customize validation error messages (#1175)
1 parent 69b06ef commit a2af9d0

File tree

11 files changed

+130
-9
lines changed

11 files changed

+130
-9
lines changed

src/aap_eda/api/serializers/activation.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,17 @@ class Meta:
397397
required=True,
398398
allow_null=False,
399399
validators=[validators.check_if_organization_exists],
400+
error_messages={
401+
"null": "Organization is needed",
402+
"required": "Organization is required",
403+
},
400404
)
401405
rulebook_id = serializers.IntegerField(
402-
validators=[validators.check_if_rulebook_exists]
406+
validators=[validators.check_if_rulebook_exists],
407+
error_messages={
408+
"null": "Rulebook is needed",
409+
"required": "Rulebook is required",
410+
},
403411
)
404412
extra_var = serializers.CharField(
405413
required=False,
@@ -408,7 +416,11 @@ class Meta:
408416
validators=[validators.is_extra_var_dict],
409417
)
410418
decision_environment_id = serializers.IntegerField(
411-
validators=[validators.check_if_de_exists]
419+
validators=[validators.check_if_de_exists],
420+
error_messages={
421+
"null": "Decision Environment is needed",
422+
"required": "Decision Environment is required",
423+
},
412424
)
413425
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
414426

@@ -691,7 +703,8 @@ class PostActivationSerializer(serializers.ModelSerializer):
691703
)
692704
name = serializers.CharField(required=True)
693705
decision_environment_id = serializers.IntegerField(
694-
validators=[validators.check_if_de_exists]
706+
validators=[validators.check_if_de_exists],
707+
error_messages={"null": "Decision Environment is needed"},
695708
)
696709
# TODO: is_activation_valid needs to tell event stream/activation
697710
awx_token_id = serializers.IntegerField(

src/aap_eda/api/serializers/decision_environment.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class DecisionEnvironmentCreateSerializer(serializers.ModelSerializer):
4444
required=True,
4545
allow_null=False,
4646
validators=[validators.check_if_organization_exists],
47+
error_messages={"null": "Organization is needed"},
4748
)
4849
eda_credential_id = serializers.IntegerField(
4950
required=False,

src/aap_eda/api/serializers/eda_credential.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,19 @@ class EdaCredentialCreateSerializer(serializers.ModelSerializer):
106106
required=True,
107107
allow_null=False,
108108
validators=[validators.check_if_credential_type_exists],
109+
error_messages={
110+
"null": "Credential Type is needed",
111+
"required": "Credential Type is required",
112+
},
109113
)
110114
organization_id = serializers.IntegerField(
111115
required=True,
112116
allow_null=False,
113117
validators=[validators.check_if_organization_exists],
118+
error_messages={
119+
"null": "Organization is needed",
120+
"required": "Organization is required",
121+
},
114122
)
115123
inputs = serializers.JSONField()
116124

@@ -146,6 +154,7 @@ class EdaCredentialUpdateSerializer(serializers.ModelSerializer):
146154
required=True,
147155
allow_null=False,
148156
validators=[validators.check_if_organization_exists],
157+
error_messages={"null": "Organization is needed"},
149158
)
150159
inputs = serializers.JSONField()
151160

src/aap_eda/api/serializers/event_stream.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,19 @@
2525

2626

2727
class EventStreamInSerializer(serializers.ModelSerializer):
28-
organization_id = serializers.IntegerField(required=True, allow_null=False)
28+
organization_id = serializers.IntegerField(
29+
required=True,
30+
allow_null=False,
31+
error_messages={"null": "Organization is needed"},
32+
)
2933
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
3034
eda_credential_id = serializers.IntegerField(
3135
required=True,
3236
allow_null=False,
3337
validators=[
3438
validators.check_credential_types_for_event_stream,
3539
],
40+
error_messages={"null": "EdaCredential is needed"},
3641
)
3742

3843
def validate(self, data):

src/aap_eda/api/serializers/project.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ class ProjectCreateRequestSerializer(serializers.ModelSerializer):
7474
required=True,
7575
allow_null=False,
7676
validators=[validators.check_if_organization_exists],
77+
error_messages={
78+
"null": "Organization is needed",
79+
"required": "Organization is required",
80+
},
7781
)
7882
eda_credential_id = serializers.IntegerField(
7983
required=False,
@@ -110,6 +114,10 @@ class ProjectUpdateRequestSerializer(serializers.ModelSerializer):
110114
required=True,
111115
allow_null=False,
112116
validators=[validators.check_if_organization_exists],
117+
error_messages={
118+
"null": "Organization is needed",
119+
"required": "Organization is required",
120+
},
113121
)
114122
name = serializers.CharField(
115123
required=False,

src/aap_eda/api/serializers/team.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class TeamCreateSerializer(
4646
required=True,
4747
allow_null=False,
4848
validators=[validators.check_if_organization_exists],
49+
error_messages={"null": "Organization is needed"},
4950
)
5051

5152
class Meta:

tests/integration/api/test_activation.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,40 @@ def test_restart_activation(
558558
assert response.status_code == status.HTTP_204_NO_CONTENT
559559

560560

561+
@pytest.mark.parametrize(
562+
("missing_field", "error_message"),
563+
[
564+
(
565+
"decision_environment_id",
566+
"Decision Environment is required",
567+
),
568+
(
569+
"organization_id",
570+
"Organization is required",
571+
),
572+
(
573+
"rulebook_id",
574+
"Rulebook is required",
575+
),
576+
],
577+
)
578+
@pytest.mark.django_db
579+
def test_create_activation_with_missing_required_fields(
580+
activation_payload: Dict[str, Any],
581+
admin_client: APIClient,
582+
missing_field,
583+
error_message,
584+
preseed_credential_types,
585+
):
586+
activation_payload.pop(missing_field)
587+
response = admin_client.post(
588+
f"{api_url_v1}/activations/", data=activation_payload
589+
)
590+
591+
assert response.status_code == status.HTTP_400_BAD_REQUEST
592+
assert error_message in response.data[missing_field]
593+
594+
561595
@pytest.mark.parametrize(
562596
"enabled",
563597
[True, False],
@@ -613,13 +647,13 @@ def test_restart_activation_without_de(
613647
assert response.status_code == status.HTTP_400_BAD_REQUEST
614648
assert (
615649
response.data["errors"]
616-
== "{'decision_environment_id': 'This field may not be null.'}"
650+
== "{'decision_environment_id': 'Decision Environment is needed'}"
617651
)
618652
default_activation.refresh_from_db()
619653
assert default_activation.status == enums.ActivationStatus.ERROR
620654
assert (
621655
default_activation.status_message
622-
== "{'decision_environment_id': 'This field may not be null.'}"
656+
== "{'decision_environment_id': 'Decision Environment is needed'}"
623657
)
624658

625659

tests/integration/api/test_decision_environment.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,25 @@ def test_create_decision_environment_with_empty_credential(
322322
assert status_message in str(errors)
323323

324324

325+
@pytest.mark.django_db
326+
def test_create_decision_environment_with_none_organization(
327+
admin_client: APIClient,
328+
):
329+
data_in = {
330+
"name": "de1",
331+
"description": "desc here",
332+
"image_url": "registry.com/img1:tag1",
333+
"organization_id": None,
334+
}
335+
336+
response = admin_client.post(
337+
f"{api_url_v1}/decision-environments/", data=data_in
338+
)
339+
340+
assert response.status_code == status.HTTP_400_BAD_REQUEST
341+
assert "Organization is needed" in str(response.data)
342+
343+
325344
@pytest.mark.django_db
326345
def test_create_decision_environment_bad_ids(admin_client: APIClient):
327346
bad_ids = [

tests/integration/api/test_eda_credential.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,25 @@ def test_create_eda_credential_with_none_credential_type(
161161
f"{api_url_v1}/eda-credentials/", data=data_in
162162
)
163163
assert response.status_code == status.HTTP_400_BAD_REQUEST
164-
assert "This field may not be null." in response.data["credential_type_id"]
164+
assert "Credential Type is needed" in response.data["credential_type_id"]
165+
166+
167+
@pytest.mark.django_db
168+
def test_create_eda_credential_with_none_organization(
169+
admin_client: APIClient,
170+
):
171+
data = "secret"
172+
data_in = {
173+
"name": "eda-credential",
174+
"inputs": {"username": "adam", "password": data},
175+
"credential_type_id": None,
176+
"organization_id": None,
177+
}
178+
response = admin_client.post(
179+
f"{api_url_v1}/eda-credentials/", data=data_in
180+
)
181+
assert response.status_code == status.HTTP_400_BAD_REQUEST
182+
assert "Organization is needed" in response.data["organization_id"]
165183

166184

167185
@pytest.mark.parametrize(

tests/integration/api/test_project.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,19 @@ def test_create_or_update_project_with_right_eda_credential(
393393
)
394394

395395

396+
@pytest.mark.django_db
397+
def test_create_project_with_none_organization(admin_client: APIClient):
398+
body = {
399+
"name": "none-organization",
400+
"url": "https://git.example.com/acme/project-01",
401+
"organization_id": None,
402+
}
403+
404+
response = admin_client.post(f"{api_url_v1}/projects/", data=body)
405+
assert response.status_code == status.HTTP_400_BAD_REQUEST
406+
assert "Organization is needed" in str(response.data)
407+
408+
396409
@pytest.mark.django_db
397410
def test_create_project_name_conflict(
398411
default_project: models.Project, admin_client: APIClient
@@ -689,7 +702,7 @@ def test_partial_update_project_null_organization_id(
689702
data,
690703
)
691704
assert response.status_code == status.HTTP_400_BAD_REQUEST
692-
assert "This field may not be null." in str(response.data)
705+
assert "Organization is needed" in str(response.data)
693706

694707

695708
@pytest.mark.django_db

tests/integration/services/activation/test_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ def test_start_no_decision_environment(
293293
activation_manager.start()
294294
assert basic_activation.status == enums.ActivationStatus.ERROR
295295
assert "decision_environment" in str(exc.value)
296-
assert "This field may not be null" in str(exc.value)
296+
assert "Decision Environment is needed" in str(exc.value)
297297
assert str(exc.value) in basic_activation.status_message
298298

299299

0 commit comments

Comments
 (0)