From e443ca482d10417a82656b01b88620d3f05e35db Mon Sep 17 00:00:00 2001 From: Abhishek Paygavhan <131750001+abhishek-paygavhan@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:55:18 +0530 Subject: [PATCH] fix: match credential type names with substring search (AAP-81333) The credential type dropdown sent name=, which used istartswith and missed types such as "Red Hat Ansible Automation Platform" when users searched for "Ansible". Use icontains so the filter matches anywhere in the name. Co-authored-by: Cursor --- src/aap_eda/api/filters/credential_type.py | 2 +- tests/integration/api/test_credential_type.py | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/aap_eda/api/filters/credential_type.py b/src/aap_eda/api/filters/credential_type.py index 7719cb39a..2eb469cac 100644 --- a/src/aap_eda/api/filters/credential_type.py +++ b/src/aap_eda/api/filters/credential_type.py @@ -20,7 +20,7 @@ class CredentialTypeFilter(django_filters.FilterSet): name = django_filters.CharFilter( field_name="name", - lookup_expr="istartswith", + lookup_expr="icontains", label="Filter by credential type name.", ) namespace = django_filters.CharFilter( diff --git a/tests/integration/api/test_credential_type.py b/tests/integration/api/test_credential_type.py index 797517f42..460fec463 100644 --- a/tests/integration/api/test_credential_type.py +++ b/tests/integration/api/test_credential_type.py @@ -527,6 +527,31 @@ def test_list_credential_types(superuser_client: APIClient): assert len(objects) == 2 +@pytest.mark.django_db +def test_list_credential_types_filter_name_contains( + admin_client: APIClient, + aap_credential_type, +): + """Name filter is a case-insensitive substring match (AAP-81333).""" + response = admin_client.get(f"{api_url_v1}/credential-types/?name=Ansible") + assert response.status_code == status.HTTP_200_OK + names = [item["name"] for item in response.json()["results"]] + assert aap_credential_type.name in names + assert enums.DefaultCredentialType.AAP in names + + prefix_response = admin_client.get( + f"{api_url_v1}/credential-types/?name=Red Hat" + ) + prefix_names = [item["name"] for item in prefix_response.json()["results"]] + assert aap_credential_type.name in prefix_names + + empty_response = admin_client.get( + f"{api_url_v1}/credential-types/?name=does-not-exist" + ) + assert empty_response.status_code == status.HTTP_200_OK + assert empty_response.json()["results"] == [] + + @pytest.mark.django_db def test_delete_managed_credential_type(superuser_client: APIClient): obj = models.CredentialType.objects.create(