github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js (about) 1 import { resolve } from 'rsvp'; 2 import { test } from 'qunit'; 3 import sinon from 'sinon'; 4 import { settled } from '@ember/test-helpers'; 5 6 const MockResponse = (json) => ({ 7 ok: true, 8 json() { 9 return resolve(json); 10 }, 11 }); 12 13 export default function statsTrackerFrameMissing({ 14 resourceName, 15 TrackerConstructor, 16 ResourceConstructor, 17 mockFrame, 18 compileResources, 19 }) { 20 test('a bad response from a fetch request is handled gracefully', async function (assert) { 21 const frame = mockFrame(1); 22 const [compiledCPU, compiledMemory] = compileResources(frame); 23 24 let shouldFail = false; 25 const fetch = () => { 26 return resolve(shouldFail ? { ok: false } : MockResponse(frame)); 27 }; 28 29 const resource = ResourceConstructor(); 30 const tracker = TrackerConstructor.create({ 31 fetch, 32 [resourceName]: resource, 33 }); 34 35 tracker.get('poll').perform(); 36 await settled(); 37 38 assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu'); 39 assert.deepEqual( 40 tracker.get('memory'), 41 [compiledMemory], 42 'One frame of memory' 43 ); 44 45 shouldFail = true; 46 tracker.get('poll').perform(); 47 await settled(); 48 49 assert.deepEqual( 50 tracker.get('cpu'), 51 [compiledCPU], 52 'Still one frame of cpu' 53 ); 54 assert.deepEqual( 55 tracker.get('memory'), 56 [compiledMemory], 57 'Still one frame of memory' 58 ); 59 assert.equal(tracker.get('frameMisses'), 1, 'Frame miss is tracked'); 60 61 shouldFail = false; 62 tracker.get('poll').perform(); 63 await settled(); 64 65 assert.deepEqual( 66 tracker.get('cpu'), 67 [compiledCPU, compiledCPU], 68 'Still one frame of cpu' 69 ); 70 assert.deepEqual( 71 tracker.get('memory'), 72 [compiledMemory, compiledMemory], 73 'Still one frame of memory' 74 ); 75 assert.equal(tracker.get('frameMisses'), 0, 'Frame misses is reset'); 76 }); 77 78 test('enough bad responses from fetch consecutively (as set by maxFrameMisses) results in a pause', async function (assert) { 79 const fetch = () => { 80 return resolve({ ok: false }); 81 }; 82 83 const resource = ResourceConstructor(); 84 const tracker = TrackerConstructor.create({ 85 fetch, 86 [resourceName]: resource, 87 maxFrameMisses: 3, 88 pause: sinon.spy(), 89 }); 90 91 tracker.get('poll').perform(); 92 await settled(); 93 94 assert.equal(tracker.get('frameMisses'), 1, 'Tick misses'); 95 assert.notOk(tracker.pause.called, 'Pause not called yet'); 96 97 tracker.get('poll').perform(); 98 await settled(); 99 100 assert.equal(tracker.get('frameMisses'), 2, 'Tick misses'); 101 assert.notOk(tracker.pause.called, 'Pause still not called yet'); 102 103 tracker.get('poll').perform(); 104 await settled(); 105 106 assert.equal(tracker.get('frameMisses'), 0, 'Misses reset'); 107 assert.ok( 108 tracker.pause.called, 109 'Pause called now that frameMisses == maxFrameMisses' 110 ); 111 }); 112 }