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 }