github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/ui/tests/integration/primary-metric-test.js (about)

     1  import EmberObject, { computed } from '@ember/object';
     2  import Service from '@ember/service';
     3  import { module, test } from 'qunit';
     4  import { setupRenderingTest } from 'ember-qunit';
     5  import { render, settled } from '@ember/test-helpers';
     6  import hbs from 'htmlbars-inline-precompile';
     7  import { find } from 'ember-native-dom-helpers';
     8  import { task } from 'ember-concurrency';
     9  import sinon from 'sinon';
    10  import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage';
    11  import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer';
    12  
    13  module('Integration | Component | primary metric', function(hooks) {
    14    setupRenderingTest(hooks);
    15  
    16    hooks.beforeEach(function() {
    17      fragmentSerializerInitializer(this.owner);
    18      this.store = this.owner.lookup('service:store');
    19      this.server = startMirage();
    20      this.server.create('namespace');
    21      this.server.create('node');
    22  
    23      const getTrackerSpy = (this.getTrackerSpy = sinon.spy());
    24      const trackerPollSpy = (this.trackerPollSpy = sinon.spy());
    25      const trackerSignalPauseSpy = (this.trackerSignalPauseSpy = sinon.spy());
    26  
    27      const MockTracker = EmberObject.extend({
    28        poll: task(function*() {
    29          yield trackerPollSpy();
    30        }),
    31        signalPause: task(function*() {
    32          yield trackerSignalPauseSpy();
    33        }),
    34  
    35        cpu: computed(() => []),
    36        memory: computed(() => []),
    37      });
    38  
    39      const mockStatsTrackersRegistry = Service.extend({
    40        getTracker(...args) {
    41          getTrackerSpy(...args);
    42          return MockTracker.create();
    43        },
    44      });
    45  
    46      this.owner.register('service:stats-trackers-registry', mockStatsTrackersRegistry);
    47      this.statsTrackersRegistry = this.owner.lookup('service:stats-trackers-registry');
    48    });
    49  
    50    hooks.afterEach(function() {
    51      this.server.shutdown();
    52    });
    53  
    54    const commonTemplate = hbs`
    55      {{primary-metric
    56        resource=resource
    57        metric=metric}}
    58    `;
    59  
    60    test('Contains a line chart, a percentage bar, a percentage figure, and an absolute usage figure', function(assert) {
    61      let resource;
    62      const metric = 'cpu';
    63  
    64      this.store.findAll('node');
    65  
    66      return settled()
    67        .then(async () => {
    68          resource = this.store.peekAll('node').get('firstObject');
    69          this.setProperties({ resource, metric });
    70  
    71          await render(commonTemplate);
    72          return settled();
    73        })
    74        .then(() => {
    75          assert.ok(find('[data-test-line-chart]'), 'Line chart');
    76          assert.ok(find('[data-test-percentage-bar]'), 'Percentage bar');
    77          assert.ok(find('[data-test-percentage]'), 'Percentage figure');
    78          assert.ok(find('[data-test-absolute-value]'), 'Absolute usage figure');
    79        });
    80    });
    81  
    82    test('The CPU metric maps to is-info', function(assert) {
    83      let resource;
    84      const metric = 'cpu';
    85  
    86      this.store.findAll('node');
    87  
    88      return settled()
    89        .then(async () => {
    90          resource = this.store.peekAll('node').get('firstObject');
    91          this.setProperties({ resource, metric });
    92  
    93          await render(commonTemplate);
    94          return settled();
    95        })
    96        .then(() => {
    97          assert.ok(
    98            find('[data-test-line-chart] .canvas').classList.contains('is-info'),
    99            'Info class for CPU metric'
   100          );
   101        });
   102    });
   103  
   104    test('The Memory metric maps to is-danger', function(assert) {
   105      let resource;
   106      const metric = 'memory';
   107  
   108      this.store.findAll('node');
   109  
   110      return settled()
   111        .then(async () => {
   112          resource = this.store.peekAll('node').get('firstObject');
   113          this.setProperties({ resource, metric });
   114  
   115          await render(commonTemplate);
   116          return settled();
   117        })
   118        .then(() => {
   119          assert.ok(
   120            find('[data-test-line-chart] .canvas').classList.contains('is-danger'),
   121            'Danger class for Memory metric'
   122          );
   123        });
   124    });
   125  
   126    test('Gets the tracker from the tracker registry', function(assert) {
   127      let resource;
   128      const metric = 'cpu';
   129  
   130      this.store.findAll('node');
   131  
   132      return settled()
   133        .then(async () => {
   134          resource = this.store.peekAll('node').get('firstObject');
   135          this.setProperties({ resource, metric });
   136  
   137          await render(commonTemplate);
   138          return settled();
   139        })
   140        .then(() => {
   141          assert.ok(
   142            this.getTrackerSpy.calledWith(resource),
   143            'Uses the tracker registry to get the tracker for the provided resource'
   144          );
   145        });
   146    });
   147  
   148    test('Immediately polls the tracker', function(assert) {
   149      let resource;
   150      const metric = 'cpu';
   151  
   152      this.store.findAll('node');
   153  
   154      return settled()
   155        .then(async () => {
   156          resource = this.store.peekAll('node').get('firstObject');
   157          this.setProperties({ resource, metric });
   158  
   159          await render(commonTemplate);
   160          return settled();
   161        })
   162        .then(() => {
   163          assert.ok(this.trackerPollSpy.calledOnce, 'The tracker is polled immediately');
   164        });
   165    });
   166  
   167    test('A pause signal is sent to the tracker when the component is destroyed', function(assert) {
   168      let resource;
   169      const metric = 'cpu';
   170  
   171      // Capture a reference to the spy before the component is destroyed
   172      const trackerSignalPauseSpy = this.trackerSignalPauseSpy;
   173  
   174      this.store.findAll('node');
   175  
   176      return settled()
   177        .then(async () => {
   178          resource = this.store.peekAll('node').get('firstObject');
   179          this.setProperties({ resource, metric, showComponent: true });
   180          await render(hbs`
   181            {{#if showComponent}}
   182              {{primary-metric
   183                resource=resource
   184                metric=metric}}
   185              }}
   186            {{/if}}
   187          `);
   188          return settled();
   189        })
   190        .then(() => {
   191          assert.notOk(trackerSignalPauseSpy.called, 'No pause signal has been sent yet');
   192          // This will toggle the if statement, resulting the primary-metric component being destroyed.
   193          this.set('showComponent', false);
   194          return settled();
   195        })
   196        .then(() => {
   197          assert.ok(trackerSignalPauseSpy.calledOnce, 'A pause signal is sent to the tracker');
   198        });
   199    });
   200  });