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