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  }