github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/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({ fetch, [resourceName]: resource });
    31  
    32      tracker.get('poll').perform();
    33      await settled();
    34  
    35      assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu');
    36      assert.deepEqual(tracker.get('memory'), [compiledMemory], 'One frame of memory');
    37  
    38      shouldFail = true;
    39      tracker.get('poll').perform();
    40      await settled();
    41  
    42      assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'Still one frame of cpu');
    43      assert.deepEqual(tracker.get('memory'), [compiledMemory], 'Still one frame of memory');
    44      assert.equal(tracker.get('frameMisses'), 1, 'Frame miss is tracked');
    45  
    46      shouldFail = false;
    47      tracker.get('poll').perform();
    48      await settled();
    49  
    50      assert.deepEqual(tracker.get('cpu'), [compiledCPU, compiledCPU], 'Still one frame of cpu');
    51      assert.deepEqual(
    52        tracker.get('memory'),
    53        [compiledMemory, compiledMemory],
    54        'Still one frame of memory'
    55      );
    56      assert.equal(tracker.get('frameMisses'), 0, 'Frame misses is reset');
    57    });
    58  
    59    test('enough bad responses from fetch consecutively (as set by maxFrameMisses) results in a pause', async function(assert) {
    60      const fetch = () => {
    61        return resolve({ ok: false });
    62      };
    63  
    64      const resource = ResourceConstructor();
    65      const tracker = TrackerConstructor.create({
    66        fetch,
    67        [resourceName]: resource,
    68        maxFrameMisses: 3,
    69        pause: sinon.spy(),
    70      });
    71  
    72      tracker.get('poll').perform();
    73      await settled();
    74  
    75      assert.equal(tracker.get('frameMisses'), 1, 'Tick misses');
    76      assert.notOk(tracker.pause.called, 'Pause not called yet');
    77  
    78      tracker.get('poll').perform();
    79      await settled();
    80  
    81      assert.equal(tracker.get('frameMisses'), 2, 'Tick misses');
    82      assert.notOk(tracker.pause.called, 'Pause still not called yet');
    83  
    84      tracker.get('poll').perform();
    85      await settled();
    86  
    87      assert.equal(tracker.get('frameMisses'), 0, 'Misses reset');
    88      assert.ok(tracker.pause.called, 'Pause called now that frameMisses == maxFrameMisses');
    89    });
    90  }