github.com/hernad/nomad@v1.6.112/ui/tests/integration/components/lifecycle-chart-test.js (about) 1 /** 2 * Copyright (c) HashiCorp, Inc. 3 * SPDX-License-Identifier: MPL-2.0 4 */ 5 6 /* eslint-disable qunit/no-conditional-assertions */ 7 import { module, test } from 'qunit'; 8 import { setupRenderingTest } from 'ember-qunit'; 9 import { render, settled } from '@ember/test-helpers'; 10 import hbs from 'htmlbars-inline-precompile'; 11 import { set } from '@ember/object'; 12 import { componentA11yAudit } from 'nomad-ui/tests/helpers/a11y-audit'; 13 import { create } from 'ember-cli-page-object'; 14 import LifecycleChart from 'nomad-ui/tests/pages/components/lifecycle-chart'; 15 16 const Chart = create(LifecycleChart); 17 18 const tasks = [ 19 { 20 lifecycleName: 'main', 21 name: 'main two: 3', 22 }, 23 { 24 lifecycleName: 'main', 25 name: 'main one: 2', 26 }, 27 { 28 lifecycleName: 'prestart-ephemeral', 29 name: 'prestart ephemeral: 0', 30 }, 31 { 32 lifecycleName: 'prestart-sidecar', 33 name: 'prestart sidecar: 1', 34 }, 35 { 36 lifecycleName: 'poststart-ephemeral', 37 name: 'poststart ephemeral: 5', 38 }, 39 { 40 lifecycleName: 'poststart-sidecar', 41 name: 'poststart sidecar: 4', 42 }, 43 { 44 lifecycleName: 'poststop', 45 name: 'poststop: 6', 46 }, 47 ]; 48 49 module('Integration | Component | lifecycle-chart', function (hooks) { 50 setupRenderingTest(hooks); 51 52 test('it renders stateless phases and lifecycle- and name-sorted tasks', async function (assert) { 53 assert.expect(32); 54 55 this.set('tasks', tasks); 56 57 await render(hbs`<LifecycleChart @tasks={{tasks}} />`); 58 assert.ok(Chart.isPresent); 59 60 assert.equal(Chart.phases[0].name, 'Prestart'); 61 assert.equal(Chart.phases[1].name, 'Main'); 62 assert.equal(Chart.phases[2].name, 'Poststart'); 63 assert.equal(Chart.phases[3].name, 'Poststop'); 64 65 Chart.phases.forEach((phase) => assert.notOk(phase.isActive)); 66 67 assert.deepEqual(Chart.tasks.mapBy('name'), [ 68 'prestart ephemeral: 0', 69 'prestart sidecar: 1', 70 'main one: 2', 71 'main two: 3', 72 'poststart sidecar: 4', 73 'poststart ephemeral: 5', 74 'poststop: 6', 75 ]); 76 assert.deepEqual(Chart.tasks.mapBy('lifecycle'), [ 77 'Prestart Task', 78 'Sidecar Task', 79 'Main Task', 80 'Main Task', 81 'Sidecar Task', 82 'Poststart Task', 83 'Poststop Task', 84 ]); 85 86 assert.ok(Chart.tasks[0].isPrestartEphemeral); 87 assert.ok(Chart.tasks[1].isPrestartSidecar); 88 assert.ok(Chart.tasks[2].isMain); 89 assert.ok(Chart.tasks[4].isPoststartSidecar); 90 assert.ok(Chart.tasks[5].isPoststartEphemeral); 91 assert.ok(Chart.tasks[6].isPoststop); 92 93 Chart.tasks.forEach((task) => { 94 assert.notOk(task.isActive); 95 assert.notOk(task.isFinished); 96 }); 97 98 await componentA11yAudit(this.element, assert); 99 }); 100 101 test('it doesn’t render when there’s only one phase', async function (assert) { 102 this.set('tasks', [ 103 { 104 lifecycleName: 'main', 105 }, 106 ]); 107 108 await render(hbs`<LifecycleChart @tasks={{tasks}} />`); 109 assert.notOk(Chart.isPresent); 110 }); 111 112 test('it renders all phases when there are any non-main tasks', async function (assert) { 113 this.set('tasks', [tasks[0], tasks[6]]); 114 115 await render(hbs`<LifecycleChart @tasks={{tasks}} />`); 116 assert.equal(Chart.phases.length, 4); 117 }); 118 119 test('it reflects phase and task states when states are passed in', async function (assert) { 120 assert.expect(24); 121 122 this.set( 123 'taskStates', 124 tasks.map((task) => { 125 return { task }; 126 }) 127 ); 128 129 await render(hbs`<LifecycleChart @taskStates={{taskStates}} />`); 130 assert.ok(Chart.isPresent); 131 132 Chart.phases.forEach((phase) => assert.notOk(phase.isActive)); 133 134 Chart.tasks.forEach((task) => { 135 assert.notOk(task.isActive); 136 assert.notOk(task.isFinished); 137 }); 138 139 // Change poststart-ephemeral to be running 140 this.set('taskStates.4.state', 'running'); 141 await settled(); 142 143 await componentA11yAudit(this.element, assert); 144 145 assert.ok(Chart.tasks[5].isActive); 146 147 assert.ok(Chart.phases[1].isActive); 148 assert.notOk( 149 Chart.phases[2].isActive, 150 'the poststart phase is nested within main and should never have the active class' 151 ); 152 153 this.set('taskStates.4.finishedAt', new Date()); 154 this.set('taskStates.4.state', 'dead'); 155 await settled(); 156 157 assert.ok(Chart.tasks[5].isFinished); 158 }); 159 160 [ 161 { 162 testName: 'expected active phases', 163 runningTaskNames: ['prestart ephemeral', 'main one', 'poststop'], 164 activePhaseNames: ['Prestart', 'Main', 'Poststop'], 165 }, 166 { 167 testName: 'sidecar task states don’t affect phase active states', 168 runningTaskNames: ['prestart sidecar', 'poststart sidecar'], 169 activePhaseNames: [], 170 }, 171 { 172 testName: 173 'poststart ephemeral task states affect main phase active state', 174 runningTaskNames: ['poststart ephemeral'], 175 activePhaseNames: ['Main'], 176 }, 177 ].forEach(async ({ testName, runningTaskNames, activePhaseNames }) => { 178 test(testName, async function (assert) { 179 assert.expect(4); 180 181 this.set( 182 'taskStates', 183 tasks.map((task) => ({ task })) 184 ); 185 186 await render(hbs`<LifecycleChart @taskStates={{taskStates}} />`); 187 188 runningTaskNames.forEach((taskName) => { 189 const taskState = this.taskStates.find((taskState) => 190 taskState.task.name.includes(taskName) 191 ); 192 set(taskState, 'state', 'running'); 193 }); 194 195 await settled(); 196 197 Chart.phases.forEach((Phase) => { 198 if (activePhaseNames.includes(Phase.name)) { 199 assert.ok(Phase.isActive, `expected ${Phase.name} not to be active`); 200 } else { 201 assert.notOk( 202 Phase.isActive, 203 `expected ${Phase.name} phase not to be active` 204 ); 205 } 206 }); 207 }); 208 }); 209 });