This is an automated email from the ASF dual-hosted git repository.

shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 37b6b04e723 Add name filtering to the Deadline Alerts API (#74127)
37b6b04e723 is described below

commit 37b6b04e7233ec47c193915d6cff04dac742d5fd
Author: SameerMesiah97 <[email protected]>
AuthorDate: Thu Oct 29 20:41:36 2026 +0000

    Add name filtering to the Deadline Alerts API (#74127)
---
 .../api_fastapi/core_api/openapi/_private_ui.yaml  | 17 +++-
 .../api_fastapi/core_api/routes/ui/deadlines.py    | 10 ++-
 .../src/airflow/ui/openapi-gen/queries/common.ts   |  5 +-
 .../ui/openapi-gen/queries/ensureQueryData.ts      |  8 +-
 .../src/airflow/ui/openapi-gen/queries/prefetch.ts |  8 +-
 .../src/airflow/ui/openapi-gen/queries/queries.ts  |  8 +-
 .../src/airflow/ui/openapi-gen/queries/suspense.ts |  8 +-
 .../ui/openapi-gen/requests/services.gen.ts        |  4 +-
 .../airflow/ui/openapi-gen/requests/types.gen.ts   |  4 +
 .../core_api/routes/ui/test_deadlines.py           | 91 +++++++++++++++++++---
 10 files changed, 135 insertions(+), 28 deletions(-)

diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml 
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
index d89efe70a34..0d2e68ca34a 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
@@ -1456,7 +1456,8 @@ paths:
       tags:
       - Deadlines
       summary: Get Dag Deadline Alerts
-      description: Get all deadline alerts defined on a Dag.
+      description: Get deadline alerts defined on a Dag, optionally filtered 
by name
+        pattern.
       operationId: get_dag_deadline_alerts
       security:
       - OAuth2PasswordBearer: []
@@ -1484,6 +1485,20 @@ paths:
           minimum: 0
           default: 50
           title: Limit
+      - name: name_pattern
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+          - type: 'null'
+          description: "Case-insensitive substring match (SQL `ILIKE`). Slower 
than\
+            \ `name_prefix_pattern` on large tables \u2014 see \"Filtering 
with pattern\
+            \ parameters\"."
+          title: Name Pattern
+        description: "Case-insensitive substring match (SQL `ILIKE`). Slower 
than\
+          \ `name_prefix_pattern` on large tables \u2014 see \"Filtering with 
pattern\
+          \ parameters\"."
       - name: offset
         in: query
         required: false
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
index c6298e2062e..035a44713a8 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
@@ -36,8 +36,10 @@ from airflow.api_fastapi.common.parameters import (
     RangeFilter,
     SortParam,
     _DagIdTeamsFilter,
+    _SearchParam,
     datetime_range_filter_factory,
     filter_param_factory,
+    search_param_factory,
     teams_filter_factory,
 )
 from airflow.api_fastapi.common.router import AirflowRouter
@@ -182,6 +184,10 @@ def get_dag_deadline_alerts(
     dag_id: str,
     session: SessionDep,
     limit: QueryLimit,
+    name_pattern: Annotated[
+        _SearchParam,
+        Depends(search_param_factory(DeadlineAlert.name, "name_pattern")),
+    ],
     offset: QueryOffset,
     order_by: Annotated[
         SortParam,
@@ -194,7 +200,7 @@ def get_dag_deadline_alerts(
     ],
     version_number: int | None = None,
 ) -> DeadlineAlertCollectionResponse:
-    """Get all deadline alerts defined on a Dag."""
+    """Get deadline alerts defined on a Dag, optionally filtered by name 
pattern."""
     serialized_dag_select = (
         select(SerializedDagModel.id)
         .join(DagVersion, SerializedDagModel.dag_version_id == DagVersion.id)
@@ -221,7 +227,7 @@ def get_dag_deadline_alerts(
 
     alerts_select, total_entries = paginated_select(
         statement=query,
-        filters=None,
+        filters=[name_pattern],
         order_by=order_by,
         offset=offset,
         limit=limit,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
index 6af9fa923c4..18716396457 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -1163,13 +1163,14 @@ export const UseDeadlinesServiceGetDeadlinesKeyFn = ({ 
dagId, dagRunId, deadline
 export type DeadlinesServiceGetDagDeadlineAlertsDefaultResponse = 
Awaited<ReturnType<typeof DeadlinesService.getDagDeadlineAlerts>>;
 export type DeadlinesServiceGetDagDeadlineAlertsQueryResult<TData = 
DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useDeadlinesServiceGetDagDeadlineAlertsKey = 
"DeadlinesServiceGetDagDeadlineAlerts";
-export const UseDeadlinesServiceGetDagDeadlineAlertsKeyFn = ({ dagId, limit, 
offset, orderBy, versionNumber }: {
+export const UseDeadlinesServiceGetDagDeadlineAlertsKeyFn = ({ dagId, limit, 
namePattern, offset, orderBy, versionNumber }: {
   dagId: string;
   limit?: number;
+  namePattern?: string;
   offset?: number;
   orderBy?: string[];
   versionNumber?: number;
-}, queryKey?: Array<unknown>) => [useDeadlinesServiceGetDagDeadlineAlertsKey, 
...(queryKey ?? [{ dagId, limit, offset, orderBy, versionNumber }])];
+}, queryKey?: Array<unknown>) => [useDeadlinesServiceGetDagDeadlineAlertsKey, 
...(queryKey ?? [{ dagId, limit, namePattern, offset, orderBy, versionNumber 
}])];
 export type DeadlinesServiceGetCallbackLogsDefaultResponse = 
Awaited<ReturnType<typeof DeadlinesService.getCallbackLogs>>;
 export type DeadlinesServiceGetCallbackLogsQueryResult<TData = 
DeadlinesServiceGetCallbackLogsDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useDeadlinesServiceGetCallbackLogsKey = 
"DeadlinesServiceGetCallbackLogs";
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
index 15003eedc51..b0892f02a2a 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -2298,23 +2298,25 @@ export const ensureUseDeadlinesServiceGetDeadlinesData 
= (queryClient: QueryClie
 }) => queryClient.ensureQueryData({ queryKey: 
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt, 
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt, 
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset, 
orderBy, teams }), queryFn: () => DeadlinesService.getDeadlines({ dagId, 
dagRunId, deadlineTimeGt, deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, 
lastUpdatedAtGt, lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit 
[...]
 /**
 * Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
 * @param data The data for the request.
 * @param data.dagId
 * @param data.versionNumber
 * @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`). 
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern 
parameters".
 * @param data.offset
 * @param data.orderBy Attributes to order by, multi criteria sort is 
supported. Prefix with `-` for descending order. Supported attributes: `id, 
created_at, name`
 * @returns DeadlineAlertCollectionResponse Successful Response
 * @throws ApiError
 */
-export const ensureUseDeadlinesServiceGetDagDeadlineAlertsData = (queryClient: 
QueryClient, { dagId, limit, offset, orderBy, versionNumber }: {
+export const ensureUseDeadlinesServiceGetDagDeadlineAlertsData = (queryClient: 
QueryClient, { dagId, limit, namePattern, offset, orderBy, versionNumber }: {
   dagId: string;
   limit?: number;
+  namePattern?: string;
   offset?: number;
   orderBy?: string[];
   versionNumber?: number;
-}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset, 
orderBy, versionNumber }), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy, 
versionNumber }) });
+}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, 
namePattern, offset, orderBy, versionNumber }), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset, 
orderBy, versionNumber }) });
 /**
 * Get Callback Logs
 * Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
index 489ea7df9b0..7c481b03a76 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -2298,23 +2298,25 @@ export const prefetchUseDeadlinesServiceGetDeadlines = 
(queryClient: QueryClient
 }) => queryClient.prefetchQuery({ queryKey: 
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt, 
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt, 
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset, 
orderBy, teams }), queryFn: () => DeadlinesService.getDeadlines({ dagId, 
dagRunId, deadlineTimeGt, deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, 
lastUpdatedAtGt, lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit,  
[...]
 /**
 * Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
 * @param data The data for the request.
 * @param data.dagId
 * @param data.versionNumber
 * @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`). 
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern 
parameters".
 * @param data.offset
 * @param data.orderBy Attributes to order by, multi criteria sort is 
supported. Prefix with `-` for descending order. Supported attributes: `id, 
created_at, name`
 * @returns DeadlineAlertCollectionResponse Successful Response
 * @throws ApiError
 */
-export const prefetchUseDeadlinesServiceGetDagDeadlineAlerts = (queryClient: 
QueryClient, { dagId, limit, offset, orderBy, versionNumber }: {
+export const prefetchUseDeadlinesServiceGetDagDeadlineAlerts = (queryClient: 
QueryClient, { dagId, limit, namePattern, offset, orderBy, versionNumber }: {
   dagId: string;
   limit?: number;
+  namePattern?: string;
   offset?: number;
   orderBy?: string[];
   versionNumber?: number;
-}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset, 
orderBy, versionNumber }), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy, 
versionNumber }) });
+}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, 
namePattern, offset, orderBy, versionNumber }), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset, 
orderBy, versionNumber }) });
 /**
 * Get Callback Logs
 * Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
index e3a0c653bd0..c293963b5a0 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -2298,23 +2298,25 @@ export const useDeadlinesServiceGetDeadlines = <TData = 
Common.DeadlinesServiceG
 }, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt, 
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt, 
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset, 
orderBy, teams }, queryKey), queryFn: () => DeadlinesService.getDeadlines({ 
dagId, dagRunId, deadlineTimeGt, deadlineTimeGte, deadline [...]
 /**
 * Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
 * @param data The data for the request.
 * @param data.dagId
 * @param data.versionNumber
 * @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`). 
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern 
parameters".
 * @param data.offset
 * @param data.orderBy Attributes to order by, multi criteria sort is 
supported. Prefix with `-` for descending order. Supported attributes: `id, 
created_at, name`
 * @returns DeadlineAlertCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDeadlinesServiceGetDagDeadlineAlerts = <TData = 
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, offset, orderBy, 
versionNumber }: {
+export const useDeadlinesServiceGetDagDeadlineAlerts = <TData = 
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, namePattern, 
offset, orderBy, versionNumber }: {
   dagId: string;
   limit?: number;
+  namePattern?: string;
   offset?: number;
   orderBy?: string[];
   versionNumber?: number;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset, 
orderBy, versionNumber }, queryKey), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy, 
versionNumber }) as TData, ...options });
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, 
namePattern, offset, orderBy, versionNumber }, queryKey), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset, 
orderBy, versionNumber }) as TData, ...options });
 /**
 * Get Callback Logs
 * Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
index 368cf359d2a..8dfcb84ced9 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -2298,23 +2298,25 @@ export const useDeadlinesServiceGetDeadlinesSuspense = 
<TData = Common.Deadlines
 }, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt, 
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt, 
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset, 
orderBy, teams }, queryKey), queryFn: () => DeadlinesService.getDeadlines({ 
dagId, dagRunId, deadlineTimeGt, deadlineTimeGte,  [...]
 /**
 * Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
 * @param data The data for the request.
 * @param data.dagId
 * @param data.versionNumber
 * @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`). 
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern 
parameters".
 * @param data.offset
 * @param data.orderBy Attributes to order by, multi criteria sort is 
supported. Prefix with `-` for descending order. Supported attributes: `id, 
created_at, name`
 * @returns DeadlineAlertCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDeadlinesServiceGetDagDeadlineAlertsSuspense = <TData = 
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, offset, orderBy, 
versionNumber }: {
+export const useDeadlinesServiceGetDagDeadlineAlertsSuspense = <TData = 
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, namePattern, 
offset, orderBy, versionNumber }: {
   dagId: string;
   limit?: number;
+  namePattern?: string;
   offset?: number;
   orderBy?: string[];
   versionNumber?: number;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset, 
orderBy, versionNumber }, queryKey), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy, 
versionNumber }) as TData, ...options });
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, 
namePattern, offset, orderBy, versionNumber }, queryKey), queryFn: () => 
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset, 
orderBy, versionNumber }) as TData, ...options });
 /**
 * Get Callback Logs
 * Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts 
b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
index 79964c5104c..fedf3892f29 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -5570,11 +5570,12 @@ export class DeadlinesService {
     
     /**
      * Get Dag Deadline Alerts
-     * Get all deadline alerts defined on a Dag.
+     * Get deadline alerts defined on a Dag, optionally filtered by name 
pattern.
      * @param data The data for the request.
      * @param data.dagId
      * @param data.versionNumber
      * @param data.limit
+     * @param data.namePattern Case-insensitive substring match (SQL `ILIKE`). 
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern 
parameters".
      * @param data.offset
      * @param data.orderBy Attributes to order by, multi criteria sort is 
supported. Prefix with `-` for descending order. Supported attributes: `id, 
created_at, name`
      * @returns DeadlineAlertCollectionResponse Successful Response
@@ -5590,6 +5591,7 @@ export class DeadlinesService {
             query: {
                 version_number: data.versionNumber,
                 limit: data.limit,
+                name_pattern: data.namePattern,
                 offset: data.offset,
                 order_by: data.orderBy
             },
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts 
b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index eea8bebd212..9dfb51d42cb 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -5721,6 +5721,10 @@ export type GetDeadlinesResponse = 
DeadlineCollectionResponse;
 export type GetDagDeadlineAlertsData = {
     dagId: string;
     limit?: number;
+    /**
+     * Case-insensitive substring match (SQL `ILIKE`). Slower than 
`name_prefix_pattern` on large tables — see "Filtering with pattern parameters".
+     */
+    namePattern?: string | null;
     offset?: number;
     /**
      * Attributes to order by, multi criteria sort is supported. Prefix with 
`-` for descending order. Supported attributes: `id, created_at, name`
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
index 3943b9cc9b4..e60cb95894e 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
@@ -190,6 +190,17 @@ def setup(dag_maker, session):
         callback_def={"path": _CALLBACK_PATH},
     )
     session.add(alert)
+
+    session.add(
+        DeadlineAlert(
+            serialized_dag_id=serialized_dag.id,
+            name="Another Alert",
+            reference=DeadlineReference.DAGRUN_QUEUED_AT.serialize_reference(),
+            interval=3600.0,
+            callback_def={"path": _CALLBACK_PATH},
+        )
+    )
+
     session.flush()
     session.add(
         Deadline(
@@ -549,7 +560,14 @@ class TestGetDagDeadlineAlerts:
         session.scalar.return_value = None
 
         with pytest.raises(HTTPException, match=f"Dag with id {DAG_ID} was not 
found"):
-            get_dag_deadline_alerts(DAG_ID, session, limit=100, offset=0, 
order_by=Mock())
+            get_dag_deadline_alerts(
+                DAG_ID,
+                session,
+                limit=100,
+                offset=0,
+                order_by=Mock(),
+                name_pattern=None,
+            )
 
         statement = session.scalar.call_args.args[0]
         assert "LIMIT 1" in 
str(statement.compile(compile_kwargs={"literal_binds": True}))
@@ -559,20 +577,63 @@ class TestGetDagDeadlineAlerts:
         response = test_client.get(f"/dags/{DAG_ID}/deadlineAlerts")
         assert response.status_code == 200
         data = response.json()
-        assert data["total_entries"] == 1
-        assert len(data["deadline_alerts"]) == 1
+        assert data["total_entries"] == 2
+        assert len(data["deadline_alerts"]) == 2
 
     def test_alert_response_fields(self, test_client):
         """Alert response includes expected fields with correct values."""
         response = test_client.get(f"/dags/{DAG_ID}/deadlineAlerts")
+
         assert response.status_code == 200
-        alert = response.json()["deadline_alerts"][0]
+
+        data = response.json()
+        alert = next(alert for alert in data["deadline_alerts"] if 
alert["name"] == ALERT_NAME)
+
         assert alert["name"] == ALERT_NAME
         assert alert["interval"] == 3600.0
         assert alert["reference_type"] == "DagRunQueuedAtDeadline"
         assert "id" in alert
         assert "created_at" in alert
 
+    @pytest.mark.parametrize(
+        ("params", "expected_alerts"),
+        [
+            pytest.param(
+                {"name_pattern": ALERT_NAME},
+                [ALERT_NAME],
+                id="matching_name",
+            ),
+            pytest.param(
+                {"name_pattern": "Another"},
+                ["Another Alert"],
+                id="matching_substring",
+            ),
+            pytest.param(
+                {"name_pattern": "Alert"},
+                [ALERT_NAME, "Another Alert"],
+                id="matching_multiple_alerts",
+            ),
+            pytest.param(
+                {"name_pattern": "does-not-exist"},
+                [],
+                id="no_match",
+            ),
+        ],
+    )
+    def test_filter_by_name_pattern(self, test_client, params, 
expected_alerts):
+        """Filtering by name pattern returns matching DeadlineAlerts."""
+        response = test_client.get(
+            f"/dags/{DAG_ID}/deadlineAlerts",
+            params=params,
+        )
+
+        assert response.status_code == 200
+
+        data = response.json()
+
+        assert data["total_entries"] == len(expected_alerts)
+        assert sorted(alert["name"] for alert in data["deadline_alerts"]) == 
sorted(expected_alerts)
+
     def test_dag_with_no_alerts_returns_empty_list(self, test_client, 
dag_maker, session):
         """A DAG with no deadline alerts returns an empty list."""
         with dag_maker("dag_no_alerts", serialized=True, session=session):
@@ -621,19 +682,29 @@ class TestGetDagDeadlineAlerts:
         return dag_id
 
     @pytest.mark.parametrize(
-        ("params", "expected_alert"),
+        ("params", "expected_alerts"),
         [
-            pytest.param({}, "v2_alert", id="default_returns_latest_version"),
-            pytest.param({"version_number": 1}, "v1_alert", 
id="older_version"),
-            pytest.param({"version_number": 2}, "v2_alert", 
id="latest_version"),
+            pytest.param({}, ["v2_alert"], 
id="default_returns_latest_version"),
+            pytest.param({"version_number": 1}, ["v1_alert"], 
id="older_version"),
+            pytest.param({"version_number": 2}, ["v2_alert"], 
id="latest_version"),
+            pytest.param(
+                {"version_number": 1, "name_pattern": "v1_alert"},
+                ["v1_alert"],
+                id="version_1_matching_name",
+            ),
+            pytest.param(
+                {"version_number": 1, "name_pattern": "v2_alert"},
+                [],
+                id="version_1_non_matching_name",
+            ),
         ],
     )
-    def test_version_number_scopes_alerts(self, test_client, dag_maker, 
session, params, expected_alert):
+    def test_version_number_scopes_alerts(self, test_client, dag_maker, 
session, params, expected_alerts):
         dag_id = self._make_two_versions_with_alerts(dag_maker, session)
         response = test_client.get(f"/dags/{dag_id}/deadlineAlerts", 
params=params)
         assert response.status_code == 200
         data = response.json()
-        assert [alert["name"] for alert in data["deadline_alerts"]] == 
[expected_alert]
+        assert [alert["name"] for alert in data["deadline_alerts"]] == 
expected_alerts
 
     def test_unknown_version_number_returns_404(self, test_client, dag_maker, 
session):
         dag_id = self._make_two_versions_with_alerts(dag_maker, session)

Reply via email to