github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/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 }