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  });