From 989a87f32e95c8c9e815e3822a36c6f3ef265b13 Mon Sep 17 00:00:00 2001 From: Brent Bovenzi Date: Thu, 26 May 2022 16:44:57 +0200 Subject: [PATCH 1/3] UI fix for null task instances --- airflow/www/static/js/grid/renderTaskRows.jsx | 2 +- .../static/js/grid/renderTaskRows.test.jsx | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/airflow/www/static/js/grid/renderTaskRows.jsx b/airflow/www/static/js/grid/renderTaskRows.jsx index 94369b418196e..87f93d904eae7 100644 --- a/airflow/www/static/js/grid/renderTaskRows.jsx +++ b/airflow/www/static/js/grid/renderTaskRows.jsx @@ -53,7 +53,7 @@ const TaskInstances = ({ {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 ( { expect(getByText('group_1')).toBeInTheDocument(); expect(queryByTestId('task-instance')).toBeNull(); }); + + test('Still renders correctly if task instance is null', () => { + global.gridData = { + groups: { + id: null, + label: null, + children: [ + { + extraLinks: [], + id: 'group_1', + label: 'group_1', + instances: [null], + }, + ], + instances: [null], + }, + dagRuns: [ + { + state: 'success', + runId: 'run_id', + }, + ], + }; + const task = mockGroup; + + const { queryByTestId, getByText } = render( + <>{renderTaskRows({ task, dagRunIds: ['run_id'] })}, + { wrapper: TableWrapper }, + ); + + expect(getByText('group_1')).toBeInTheDocument(); + expect(queryByTestId('task-instance')).toBeNull(); + expect(queryByTestId('blank-task')).toBeInTheDocument(); + }); }); From b9f5c455e3e96bfbf87beac0d40e560295ea0ee0 Mon Sep 17 00:00:00 2001 From: Brent Bovenzi Date: Thu, 26 May 2022 16:52:49 +0200 Subject: [PATCH 2/3] improve tests without global vars --- .../static/js/grid/renderTaskRows.test.jsx | 84 ++++++++----------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/airflow/www/static/js/grid/renderTaskRows.test.jsx b/airflow/www/static/js/grid/renderTaskRows.test.jsx index 36764b291b7a1..40d3582046c33 100644 --- a/airflow/www/static/js/grid/renderTaskRows.test.jsx +++ b/airflow/www/static/js/grid/renderTaskRows.test.jsx @@ -73,32 +73,43 @@ const mockGroup = { instances: [], }; +const nullMockGroup = { + 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], +}; + describe('Test renderTaskRows', () => { + test('Renders name and task instance', () => { + const task = mockGroup; + + 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(); + }); + 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 = mockGroup; const { queryByTestId, getByText } = render( @@ -111,31 +122,10 @@ describe('Test renderTaskRows', () => { }); test('Still renders correctly if task instance is null', () => { - global.gridData = { - groups: { - id: null, - label: null, - children: [ - { - extraLinks: [], - id: 'group_1', - label: 'group_1', - instances: [null], - }, - ], - instances: [null], - }, - dagRuns: [ - { - state: 'success', - runId: 'run_id', - }, - ], - }; - const task = mockGroup; + const task = nullMockGroup; const { queryByTestId, getByText } = render( - <>{renderTaskRows({ task, dagRunIds: ['run_id'] })}, + <>{renderTaskRows({ task, dagRunIds: ['run1'] })}, { wrapper: TableWrapper }, ); From e0b833b0f1f9d8502cc8cf55113ae0df5af5b822 Mon Sep 17 00:00:00 2001 From: Brent Bovenzi Date: Thu, 26 May 2022 17:31:41 +0200 Subject: [PATCH 3/3] fix test data --- .../static/js/grid/renderTaskRows.test.jsx | 122 ++++++++++-------- 1 file changed, 65 insertions(+), 57 deletions(-) diff --git a/airflow/www/static/js/grid/renderTaskRows.test.jsx b/airflow/www/static/js/grid/renderTaskRows.test.jsx index 40d3582046c33..7b1596512a8a4 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,42 +45,35 @@ 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: [], -}; - -const nullMockGroup = { - 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], -}; - -describe('Test renderTaskRows', () => { - test('Renders name and task instance', () => { - const task = mockGroup; + instances: [], + }; const { queryByTestId, getByText } = render( <>{renderTaskRows({ task, dagRunIds: ['run1'] })}, @@ -110,7 +86,19 @@ describe('Test renderTaskRows', () => { }); test('Still renders names if there are no instances', () => { - const task = mockGroup; + const task = { + id: null, + label: null, + children: [ + { + extraLinks: [], + id: 'group_1', + label: 'group_1', + instances: [], + }, + ], + instances: [], + }; const { queryByTestId, getByText } = render( <>{renderTaskRows({ task, dagRunIds: [] })}, @@ -122,7 +110,27 @@ describe('Test renderTaskRows', () => { }); test('Still renders correctly if task instance is null', () => { - const task = nullMockGroup; + 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'] })},