github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/ui/tests/unit/utils/stream-logger-test.js (about)

     1  import { module, test } from 'qunit';
     2  import { Promise } from 'rsvp';
     3  import sinon from 'sinon';
     4  import StreamLogger from 'nomad-ui/utils/classes/stream-logger';
     5  
     6  module('Unit | Util | StreamLogger', function() {
     7    test('when a StreamLogger is stopped before the poll request responds, the request is immediately canceled upon completion', async function(assert) {
     8      const fetchMock = new FetchMock();
     9      const fetch = fetchMock.request();
    10  
    11      const logger = StreamLogger.create({
    12        logFetch: () => fetch,
    13      });
    14  
    15      logger.start();
    16      logger.stop();
    17  
    18      assert.notOk(logger.poll.isRunning);
    19      assert.equal(fetchMock.reader.cancel.callCount, 0);
    20  
    21      fetchMock.closeRequest();
    22      await fetch;
    23  
    24      assert.equal(fetchMock.reader.cancel.callCount, 1);
    25    });
    26  
    27    test('when the streaming request sends the done flag, the poll task completes', async function(assert) {
    28      const fetchMock = new FetchMock();
    29      const fetch = fetchMock.request();
    30  
    31      const logger = StreamLogger.create({
    32        logFetch: () => fetch,
    33      });
    34  
    35      logger.start();
    36  
    37      assert.ok(logger.poll.isRunning);
    38      assert.equal(fetchMock.reader.readSpy.callCount, 0);
    39  
    40      fetchMock.closeRequest();
    41      await fetch;
    42  
    43      assert.notOk(logger.poll.isRunning);
    44      assert.equal(fetchMock.reader.readSpy.callCount, 1);
    45    });
    46  });
    47  
    48  class FetchMock {
    49    constructor() {
    50      this._closeRequest = null;
    51      this.reader = new ReadableStreamMock();
    52      this.response = new FetchResponseMock(this.reader);
    53    }
    54  
    55    request() {
    56      if (this._closeRequest) {
    57        throw new Error('Can only call FetchMock.request once');
    58      }
    59      return new Promise(resolve => {
    60        this._closeRequest = resolve;
    61      });
    62    }
    63  
    64    closeRequest() {
    65      if (this._closeRequest) {
    66        this._closeRequest(this.response);
    67      } else {
    68        throw new Error('Must call FetchMock.request() before FetchMock.closeRequest');
    69      }
    70    }
    71  }
    72  
    73  class FetchResponseMock {
    74    constructor(reader) {
    75      this.reader = reader;
    76      this.body = {
    77        getReader() {
    78          return reader;
    79        },
    80      };
    81    }
    82  }
    83  
    84  class ReadableStreamMock {
    85    constructor() {
    86      this.cancel = sinon.spy();
    87      this.readSpy = sinon.spy();
    88    }
    89  
    90    read() {
    91      this.readSpy();
    92      return new Promise(resolve => {
    93        resolve({ value: new ArrayBuffer(0), done: true });
    94      });
    95    }
    96  }