github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/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      await 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    test('disable streaming if not supported', async function (assert) {
    48      window.ReadableStream = null;
    49      assert.false(StreamLogger.isSupported);
    50    });
    51  });
    52  
    53  class FetchMock {
    54    constructor() {
    55      this._closeRequest = null;
    56      this.reader = new ReadableStreamMock();
    57      this.response = new FetchResponseMock(this.reader);
    58    }
    59  
    60    request() {
    61      if (this._closeRequest) {
    62        throw new Error('Can only call FetchMock.request once');
    63      }
    64      return new Promise((resolve) => {
    65        this._closeRequest = resolve;
    66      });
    67    }
    68  
    69    closeRequest() {
    70      if (this._closeRequest) {
    71        this._closeRequest(this.response);
    72      } else {
    73        throw new Error(
    74          'Must call FetchMock.request() before FetchMock.closeRequest'
    75        );
    76      }
    77    }
    78  }
    79  
    80  class FetchResponseMock {
    81    constructor(reader) {
    82      this.reader = reader;
    83      this.body = {
    84        getReader() {
    85          return reader;
    86        },
    87      };
    88    }
    89  }
    90  
    91  class ReadableStreamMock {
    92    constructor() {
    93      this.cancel = sinon.spy();
    94      this.readSpy = sinon.spy();
    95    }
    96  
    97    read() {
    98      this.readSpy();
    99      return new Promise((resolve) => {
   100        resolve({ value: new ArrayBuffer(0), done: true });
   101      });
   102    }
   103  }