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