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