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

jedcunningham pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit a88900c8a71966d2eb7b4577f114915aee761ad6
Author: Brent Bovenzi <[email protected]>
AuthorDate: Thu May 26 18:20:14 2022 +0200

    Prevent UI from crashing if grid task instances are null (#23939)
    
    * UI fix for null task instances
    
    * improve tests without global vars
    
    * fix test data
    
    (cherry picked from commit 9314a4ab8bf11e56125cbca6b012d61d1002ac32)
---
 airflow/www/static/js/grid/renderTaskRows.jsx      |   2 +-
 airflow/www/static/js/grid/renderTaskRows.test.jsx | 140 +++++++++++++--------
 2 files changed, 87 insertions(+), 55 deletions(-)

diff --git a/airflow/www/static/js/grid/renderTaskRows.jsx 
b/airflow/www/static/js/grid/renderTaskRows.jsx
index 4f3abb8594..b57ca59b40 100644
--- a/airflow/www/static/js/grid/renderTaskRows.jsx
+++ b/airflow/www/static/js/grid/renderTaskRows.jsx
@@ -53,7 +53,7 @@ const TaskInstances = ({
   <Flex justifyContent="flex-end">
     {dagRunIds.map((runId) => {
       // Check if an instance exists for the run, or return an empty box
-      const instance = task.instances.find((gi) => gi.runId === runId);
+      const instance = task.instances.find((gi) => gi && gi.runId === runId);
       const isSelected = selectedRunId === runId;
       return (
         <Box
diff --git a/airflow/www/static/js/grid/renderTaskRows.test.jsx 
b/airflow/www/static/js/grid/renderTaskRows.test.jsx
index 2a8c276adb..7b1596512a 100644
--- a/airflow/www/static/js/grid/renderTaskRows.test.jsx
+++ b/airflow/www/static/js/grid/renderTaskRows.test.jsx
@@ -25,33 +25,16 @@ import { render } from '@testing-library/react';
 import renderTaskRows from './renderTaskRows';
 import { TableWrapper } from './utils/testUtils';
 
-const mockGroup = {
-  id: null,
-  label: null,
-  children: [
-    {
-      extraLinks: [],
-      id: 'group_1',
-      label: 'group_1',
-      instances: [
-        {
-          dagId: 'dagId',
-          duration: 0,
-          endDate: '2021-10-26T15:42:03.391939+00:00',
-          executionDate: '2021-10-25T15:41:09.726436+00:00',
-          operator: 'DummyOperator',
-          runId: 'run1',
-          startDate: '2021-10-26T15:42:03.391917+00:00',
-          state: 'success',
-          taskId: 'group_1',
-          tryNumber: 1,
-        },
-      ],
+describe('Test renderTaskRows', () => {
+  test('Renders name and task instance', () => {
+    const task = {
+      id: null,
+      label: null,
       children: [
         {
-          id: 'group_1.task_1',
-          label: 'group_1.task_1',
           extraLinks: [],
+          id: 'group_1',
+          label: 'group_1',
           instances: [
             {
               dagId: 'dagId',
@@ -62,44 +45,60 @@ const mockGroup = {
               runId: 'run1',
               startDate: '2021-10-26T15:42:03.391917+00:00',
               state: 'success',
-              taskId: 'group_1.task_1',
+              taskId: 'group_1',
               tryNumber: 1,
             },
           ],
+          children: [
+            {
+              id: 'group_1.task_1',
+              label: 'group_1.task_1',
+              extraLinks: [],
+              instances: [
+                {
+                  dagId: 'dagId',
+                  duration: 0,
+                  endDate: '2021-10-26T15:42:03.391939+00:00',
+                  executionDate: '2021-10-25T15:41:09.726436+00:00',
+                  operator: 'DummyOperator',
+                  runId: 'run1',
+                  startDate: '2021-10-26T15:42:03.391917+00:00',
+                  state: 'success',
+                  taskId: 'group_1.task_1',
+                  tryNumber: 1,
+                },
+              ],
+            },
+          ],
         },
       ],
-    },
-  ],
-  instances: [],
-};
+      instances: [],
+    };
+
+    const { queryByTestId, getByText } = render(
+      <>{renderTaskRows({ task, dagRunIds: ['run1'] })}</>,
+      { wrapper: TableWrapper },
+    );
+
+    expect(getByText('group_1')).toBeInTheDocument();
+    expect(queryByTestId('task-instance')).toBeDefined();
+    expect(queryByTestId('blank-task')).toBeNull();
+  });
 
-describe('Test renderTaskRows', () => {
   test('Still renders names if there are no instances', () => {
-    global.gridData = {
-      groups: {
-        id: null,
-        label: null,
-        children: [
-          {
-            extraLinks: [],
-            id: 'group_1',
-            label: 'group_1',
-            instances: [],
-            children: [
-              {
-                id: 'group_1.task_1',
-                label: 'group_1.task_1',
-                extraLinks: [],
-                instances: [],
-              },
-            ],
-          },
-        ],
-        instances: [],
-      },
-      dagRuns: [],
+    const task = {
+      id: null,
+      label: null,
+      children: [
+        {
+          extraLinks: [],
+          id: 'group_1',
+          label: 'group_1',
+          instances: [],
+        },
+      ],
+      instances: [],
     };
-    const task = mockGroup;
 
     const { queryByTestId, getByText } = render(
       <>{renderTaskRows({ task, dagRunIds: [] })}</>,
@@ -109,4 +108,37 @@ describe('Test renderTaskRows', () => {
     expect(getByText('group_1')).toBeInTheDocument();
     expect(queryByTestId('task-instance')).toBeNull();
   });
+
+  test('Still renders correctly if task instance is null', () => {
+    const task = {
+      id: null,
+      label: null,
+      children: [
+        {
+          extraLinks: [],
+          id: 'group_1',
+          label: 'group_1',
+          instances: [null],
+          children: [
+            {
+              id: 'group_1.task_1',
+              label: 'group_1.task_1',
+              extraLinks: [],
+              instances: [null],
+            },
+          ],
+        },
+      ],
+      instances: [null],
+    };
+
+    const { queryByTestId, getByText } = render(
+      <>{renderTaskRows({ task, dagRunIds: ['run1'] })}</>,
+      { wrapper: TableWrapper },
+    );
+
+    expect(getByText('group_1')).toBeInTheDocument();
+    expect(queryByTestId('task-instance')).toBeNull();
+    expect(queryByTestId('blank-task')).toBeInTheDocument();
+  });
 });

Reply via email to