From d326c5c3e722a608c48aa686eae9dc7a08d4e658 Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Tue, 19 Sep 2023 11:06:58 +0200 Subject: [PATCH] Move unit tests to jest because 2023 --- package.json | 9 +- test/unit/.eslintrc | 4 +- ...pter_factory.js => adapterfactory.test.js} | 17 +-- ...cecandidate.js => addicecandidate.test.js} | 32 ++--- test/unit/{chrome.js => chrome.test.js} | 99 ++++++++------ ...compactObject.js => compactObject.test.js} | 13 +- ...detectBrowser.js => detectBrowser.test.js} | 20 ++- ...ow-mixed.js => extmap-allow-mixed.test.js} | 31 ++--- ...tractVersion.js => extractVersion.test.js} | 44 +++--- test/unit/{firefox.js => firefox.test.js} | 22 ++- ...gSuppression.js => logSuppression.test.js} | 20 +-- ...cecandidate.js => rtcicecandidate.test.js} | 37 +++-- test/unit/{safari.js => safari.test.js} | 128 +++++++++--------- 13 files changed, 218 insertions(+), 258 deletions(-) rename test/unit/{adapter_factory.js => adapterfactory.test.js} (74%) rename test/unit/{addicecandidate.js => addicecandidate.test.js} (85%) rename test/unit/{chrome.js => chrome.test.js} (63%) rename test/unit/{compactObject.js => compactObject.test.js} (84%) rename test/unit/{detectBrowser.js => detectBrowser.test.js} (78%) rename test/unit/{extmap-allow-mixed.js => extmap-allow-mixed.test.js} (76%) rename test/unit/{extractVersion.js => extractVersion.test.js} (79%) rename test/unit/{firefox.js => firefox.test.js} (69%) rename test/unit/{logSuppression.js => logSuppression.test.js} (58%) rename test/unit/{rtcicecandidate.js => rtcicecandidate.test.js} (64%) rename test/unit/{safari.js => safari.test.js} (59%) diff --git a/package.json b/package.json index 5f4bd97a9..5f84688cc 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "prepare": "grunt build", "prepublishonly": "npm test", "test": "grunt && mocha test/unit && karma start test/karma.conf.js", - "lint-and-unit-tests": "grunt && mocha test/unit", + "lint-and-unit-tests": "grunt && jest test/unit", "e2e-tests": "grunt && karma start test/karma.conf.js" }, "dependencies": { @@ -37,7 +37,7 @@ "@puppeteer/browsers": "^1.4.1", "babel-preset-env": "^1.7.0", "brfs": "^1.5.0", - "chai": "^3.5.0", + "eslint-plugin-jest": "^27.4.0", "grunt": "^1.1.0", "grunt-babel": "^8.0.0", "grunt-browserify": "^6.0.0", @@ -45,6 +45,7 @@ "grunt-contrib-clean": "^1.1.0", "grunt-contrib-copy": "^1.0.0", "grunt-eslint": "^24.0.0", + "jest": "^29.7.0", "karma": "^6.4.1", "karma-browserify": "^8.1.0", "karma-chai": "^0.1.0", @@ -54,8 +55,6 @@ "karma-mocha-reporter": "^2.2.3", "karma-safari-launcher": "^1.0.0", "karma-stability-reporter": "^3.0.1", - "mocha": "^10.1.0", - "sinon": "^2.2.0", - "sinon-chai": "^2.14.0" + "mocha": "^10.2.0" } } diff --git a/test/unit/.eslintrc b/test/unit/.eslintrc index 6b07904a6..09f1274c4 100644 --- a/test/unit/.eslintrc +++ b/test/unit/.eslintrc @@ -1,7 +1,7 @@ { "env": { - "mocha": true, + "jest": true, "browser": true }, - "rules": {} + "plugins": ["jest"] } diff --git a/test/unit/adapter_factory.js b/test/unit/adapterfactory.test.js similarity index 74% rename from test/unit/adapter_factory.js rename to test/unit/adapterfactory.test.js index cacb91a28..555a36f8b 100644 --- a/test/unit/adapter_factory.js +++ b/test/unit/adapterfactory.test.js @@ -5,13 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); - describe('adapter factory', () => { const {adapterFactory} = require('../../dist/adapter_factory.js'); const utils = require('../../dist/utils.js'); @@ -19,23 +12,23 @@ describe('adapter factory', () => { let window; beforeEach(() => { window = { - RTCPeerConnection: sinon.stub(), + RTCPeerConnection: jest.fn(), }; }); describe('does not shim', () => { afterEach(() => { - utils.detectBrowser.restore(); + utils.detectBrowser.mockRestore(); }); ['Chrome', 'Firefox', 'Safari'].forEach(browser => { it(browser + ' when disabled', () => { - sinon.stub(utils, 'detectBrowser').returns({ + jest.spyOn(utils, 'detectBrowser').mockReturnValue({ browser: browser.toLowerCase() }); let options = {}; options['shim' + browser] = false; const adapter = adapterFactory(window, options); - expect(adapter).not.to.have.property('browserShim'); + expect(adapter).not.toHaveProperty('browserShim'); }); }); }); @@ -48,6 +41,6 @@ describe('adapter factory', () => { 'Gecko/20100101 Firefox/44.0' }}; const constructor = () => adapterFactory({window}); - expect(constructor).not.to.throw(); + expect(constructor).not.toThrow(); }); }); diff --git a/test/unit/addicecandidate.js b/test/unit/addicecandidate.test.js similarity index 85% rename from test/unit/addicecandidate.js rename to test/unit/addicecandidate.test.js index 2eda64d9d..93374b761 100644 --- a/test/unit/addicecandidate.js +++ b/test/unit/addicecandidate.test.js @@ -5,12 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); describe('addIceCandidate with null or empty candidate', () => { const shim = require('../../dist/common_shim'); @@ -18,26 +12,26 @@ describe('addIceCandidate with null or empty candidate', () => { let origAddIceCandidate; beforeEach(() => { window = { - RTCPeerConnection: sinon.stub(), + RTCPeerConnection: jest.fn(), }; - origAddIceCandidate = sinon.stub(); + origAddIceCandidate = jest.fn(); window.RTCPeerConnection.prototype.addIceCandidate = origAddIceCandidate; }); describe('does nothing if', () => { it('RTCPeerConnection is not defined', () => { - expect(() => shim.shimAddIceCandidateNullOrEmpty({}, {})).not.to.throw(); + expect(() => shim.shimAddIceCandidateNullOrEmpty({}, {})).not.toThrow(); }); it('RTCPeerConnection.prototype.addIceCandidate is undefined', () => { window.RTCPeerConnection.prototype.addIceCandidate = null; - expect(() => shim.shimAddIceCandidateNullOrEmpty({}, {})).not.to.throw(); + expect(() => shim.shimAddIceCandidateNullOrEmpty({}, {})).not.toThrow(); }); it('the candidate argument is optional', () => { expect(window.RTCPeerConnection.prototype.addIceCandidate.length) - .to.equal(0); + .toBe(0); shim.shimAddIceCandidateNullOrEmpty({}, {}); expect(window.RTCPeerConnection.prototype.addIceCandidate) - .to.equal(origAddIceCandidate); + .toBe(origAddIceCandidate); }); }); @@ -46,7 +40,7 @@ describe('addIceCandidate with null or empty candidate', () => { (candidate) => origAddIceCandidate(candidate); shim.shimAddIceCandidateNullOrEmpty(window, {}); expect(window.RTCPeerConnection.prototype.addIceCandidate.length) - .to.equal(0); + .toBe(0); }); it('ignores addIceCandidate(null)', () => { @@ -55,7 +49,7 @@ describe('addIceCandidate with null or empty candidate', () => { shim.shimAddIceCandidateNullOrEmpty(window, {}); const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(1); + expect(origAddIceCandidate.mock.calls.length).toBe(1); }); describe('Chrome behaviour', () => { @@ -73,7 +67,7 @@ describe('addIceCandidate with null or empty candidate', () => { const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(0); + expect(origAddIceCandidate.mock.calls.length).toBe(0); }); it('passes {candidate: ""} after Chrome 78', () => { @@ -82,7 +76,7 @@ describe('addIceCandidate with null or empty candidate', () => { const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(1); + expect(origAddIceCandidate.mock.calls.length).toBe(1); }); }); @@ -101,7 +95,7 @@ describe('addIceCandidate with null or empty candidate', () => { const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(0); + expect(origAddIceCandidate.mock.calls.length).toBe(0); }); it('passes {candidate: ""} after Firefox 68', () => { @@ -110,7 +104,7 @@ describe('addIceCandidate with null or empty candidate', () => { const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(1); + expect(origAddIceCandidate.mock.calls.length).toBe(1); }); }); @@ -128,7 +122,7 @@ describe('addIceCandidate with null or empty candidate', () => { const pc = new window.RTCPeerConnection(); pc.addIceCandidate({candidate: '', sdpMLineIndex: 0}); - expect(origAddIceCandidate.callCount).to.equal(0); + expect(origAddIceCandidate.mock.calls.length).toBe(0); }); }); }); diff --git a/test/unit/chrome.js b/test/unit/chrome.test.js similarity index 63% rename from test/unit/chrome.js rename to test/unit/chrome.test.js index c53adc9f2..c6cc26730 100644 --- a/test/unit/chrome.js +++ b/test/unit/chrome.test.js @@ -5,12 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); /* a mock of the Chrome RTCLegacyStatReport */ function RTCLegacyStatsReport() { @@ -41,7 +35,7 @@ describe('Chrome shim', () => { window = { navigator: { mediaDevices: { - getUserMedia: sinon.stub().returns(Promise.resolve('stream')), + getUserMedia: jest.fn().mockReturnValue(Promise.resolve('stream')), }, }, RTCPeerConnection: function() {} @@ -74,12 +68,12 @@ describe('Chrome shim', () => { it('returns chrome legacy getStats when called with a callback', (done) => { pc.getStats((result) => { - expect(result).to.have.property('result'); + expect(result).toHaveProperty('result'); const report = result.result()[0]; - expect(report).to.have.property('id'); - expect(report).to.have.property('type'); - expect(report).to.have.property('timestamp'); - expect(report).to.have.property('stat'); + expect(report).toHaveProperty('id'); + expect(report).toHaveProperty('type'); + expect(report).toHaveProperty('timestamp'); + expect(report).toHaveProperty('stat'); done(); }); }); @@ -87,7 +81,7 @@ describe('Chrome shim', () => { it('is translated into a Map', () => { return pc.getStats() .then(result => { - expect(result).to.be.a('Map'); + expect(result).toBeInstanceOf(Map); }); }); }); @@ -119,80 +113,97 @@ describe('Chrome shim', () => { }); describe('getDisplayMedia shim', () => { - const getSourceId = sinon.stub().returns(Promise.resolve('abc')); + const getSourceId = jest.fn().mockReturnValue(Promise.resolve('abc')); it('does not overwrite an existing ' + 'navigator.mediaDevices.getDisplayMedia', () => { window.navigator.mediaDevices.getDisplayMedia = 'foo'; shim.shimGetDisplayMedia(window, getSourceId); - expect(window.navigator.mediaDevices.getDisplayMedia).to.equal('foo'); + expect(window.navigator.mediaDevices.getDisplayMedia).toBe('foo'); }); it('does not if navigator.mediaDevices does not exist', () => { delete window.navigator.mediaDevices; shim.shimGetDisplayMedia(window); - expect(window.navigator.mediaDevices).to.equal(undefined); + expect(window.navigator.mediaDevices).toBe(undefined); }); it('shims navigator.mediaDevices.getDisplayMedia', () => { shim.shimGetDisplayMedia(window, getSourceId); - expect(window.navigator.mediaDevices.getDisplayMedia).to.be.a('function'); + expect(typeof window.navigator.mediaDevices.getDisplayMedia) + .toBe('function'); }); - it('calls getUserMedia with the sourceId', () => { + it('calls getUserMedia with the sourceId', async() => { shim.shimGetDisplayMedia(window, getSourceId); - return window.navigator.mediaDevices.getDisplayMedia({video: true}) - .then(() => { - expect(window.navigator.mediaDevices.getUserMedia) - .to.have.been.calledWith({video: {mandatory: { + await window.navigator.mediaDevices.getDisplayMedia({video: true}); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls.length) + .toBe(1); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls[0][0]) + .toEqual({ + video: { + mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: 'abc', maxFrameRate: 3, - }}}); + } + } }); }); - it('translates frameRate to legacy maxFrameRate', () => { + it('translates frameRate to legacy maxFrameRate', async() => { shim.shimGetDisplayMedia(window, getSourceId); - return window.navigator.mediaDevices - .getDisplayMedia({video: {frameRate: 25}}) - .then(() => { - expect(window.navigator.mediaDevices.getUserMedia) - .to.have.been.calledWith({video: {mandatory: { + await window.navigator.mediaDevices + .getDisplayMedia({video: {frameRate: 25}}); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls.length) + .toBe(1); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls[0][0]) + .toEqual({ + video: { + mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: 'abc', maxFrameRate: 25, - }}}); + } + } }); }); - it('translates width to legacy maxWidth', () => { + it('translates width to legacy maxWidth', async() => { shim.shimGetDisplayMedia(window, getSourceId); - return window.navigator.mediaDevices - .getDisplayMedia({video: {width: 640}}) - .then(() => { - expect(window.navigator.mediaDevices.getUserMedia) - .to.have.been.calledWith({video: {mandatory: { + await window.navigator.mediaDevices + .getDisplayMedia({video: {width: 640}}); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls.length) + .toBe(1); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls[0][0]) + .toEqual({ + video: { + mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: 'abc', maxFrameRate: 3, maxWidth: 640, - }}}); + } + } }); }); - it('translates height to legacy maxHeight', () => { + it('translates height to legacy maxHeight', async() => { shim.shimGetDisplayMedia(window, getSourceId); - return window.navigator.mediaDevices - .getDisplayMedia({video: {height: 480}}) - .then(() => { - expect(window.navigator.mediaDevices.getUserMedia) - .to.have.been.calledWith({video: {mandatory: { + await window.navigator.mediaDevices + .getDisplayMedia({video: {height: 480}}); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls.length) + .toBe(1); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls[0][0]) + .toEqual({ + video: { + mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: 'abc', maxFrameRate: 3, maxHeight: 480, - }}}); + } + } }); }); }); diff --git a/test/unit/compactObject.js b/test/unit/compactObject.test.js similarity index 84% rename from test/unit/compactObject.js rename to test/unit/compactObject.test.js index f9300c666..f903b6ca5 100644 --- a/test/unit/compactObject.js +++ b/test/unit/compactObject.test.js @@ -5,15 +5,12 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; describe('compactObject', () => { const compactObject = require('../../dist/utils.js').compactObject; it('returns an empty object as is', () => { - expect(compactObject({})).to.deep.equal({}); + expect(compactObject({})).toEqual({}); }); it('removes undefined values', () => { @@ -21,7 +18,7 @@ describe('compactObject', () => { nothing: undefined, value: 'hello', something: undefined, - })).to.deep.equal({ + })).toEqual({ value: 'hello', }); }); @@ -30,7 +27,7 @@ describe('compactObject', () => { expect(compactObject({ nothing: {}, val: 12, - })).to.deep.equal({ + })).toEqual({ val: 12, }); }); @@ -43,7 +40,7 @@ describe('compactObject', () => { nestedEmpty: {}, nestedNothing: undefined, }, - })).to.deep.equal({ + })).toEqual({ value: 'hello', something: { nestedValue: 12, @@ -57,7 +54,7 @@ describe('compactObject', () => { nothing: undefined, value: arr, something: undefined, - })).to.deep.equal({ + })).toEqual({ value: arr, }); }); diff --git a/test/unit/detectBrowser.js b/test/unit/detectBrowser.test.js similarity index 78% rename from test/unit/detectBrowser.js rename to test/unit/detectBrowser.test.js index c6a5266cf..0c2376914 100644 --- a/test/unit/detectBrowser.js +++ b/test/unit/detectBrowser.test.js @@ -5,10 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; - describe('detectBrowser', () => { const detectBrowser = require('../../dist/utils.js').detectBrowser; let window; @@ -25,8 +21,8 @@ describe('detectBrowser', () => { navigator.mozGetUserMedia = function() {}; const browserDetails = detectBrowser(window); - expect(browserDetails.browser).to.equal('firefox'); - expect(browserDetails.version).to.equal(44); + expect(browserDetails.browser).toEqual('firefox'); + expect(browserDetails.version).toEqual(44); }); it('detects Chrome if navigator.webkitGetUserMedia exists', () => { @@ -37,8 +33,8 @@ describe('detectBrowser', () => { window.webkitRTCPeerConnection = function() {}; const browserDetails = detectBrowser(window); - expect(browserDetails.browser).to.equal('chrome'); - expect(browserDetails.version).to.equal(45); + expect(browserDetails.browser).toEqual('chrome'); + expect(browserDetails.version).toEqual(45); }); it('detects chrome with reduced useragent', () => { @@ -49,8 +45,8 @@ describe('detectBrowser', () => { window.webkitRTCPeerConnection = function() {}; const browserDetails = detectBrowser(window); - expect(browserDetails.browser).to.equal('chrome'); - expect(browserDetails.version).to.equal(95); + expect(browserDetails.browser).toEqual('chrome'); + expect(browserDetails.version).toEqual(95); }); it('detects Safari if window.RTCPeerConnection exists', () => { @@ -59,7 +55,7 @@ describe('detectBrowser', () => { window.RTCPeerConnection = function() {}; const browserDetails = detectBrowser(window); - expect(browserDetails.browser).to.equal('safari'); - expect(browserDetails.version).to.equal(604); + expect(browserDetails.browser).toEqual('safari'); + expect(browserDetails.version).toEqual(604); }); }); diff --git a/test/unit/extmap-allow-mixed.js b/test/unit/extmap-allow-mixed.test.js similarity index 76% rename from test/unit/extmap-allow-mixed.js rename to test/unit/extmap-allow-mixed.test.js index 1a724bc36..a3fd04049 100644 --- a/test/unit/extmap-allow-mixed.js +++ b/test/unit/extmap-allow-mixed.test.js @@ -5,22 +5,15 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); - describe('removal of extmap-allow-mixed', () => { const shim = require('../../dist/common_shim'); let window; let origSetRemoteDescription; beforeEach(() => { window = { - RTCPeerConnection: sinon.stub(), + RTCPeerConnection: jest.fn(), }; - origSetRemoteDescription = sinon.stub(); + origSetRemoteDescription = jest.fn(); window.RTCPeerConnection.prototype.setRemoteDescription = origSetRemoteDescription; }); @@ -29,7 +22,7 @@ describe('removal of extmap-allow-mixed', () => { describe('does nothing if', () => { it('RTCPeerConnection is not defined', () => { - expect(() => shim.removeExtmapAllowMixed({}, {})).not.to.throw(); + expect(() => shim.removeExtmapAllowMixed({}, {})).not.toThrow(); }); }); @@ -49,8 +42,9 @@ describe('removal of extmap-allow-mixed', () => { const pc = new window.RTCPeerConnection(); pc.setRemoteDescription({sdp: '\n' + sdp}); - expect(origSetRemoteDescription.firstCall.args[0].sdp) - .to.equal('\n' + sdp); + expect(origSetRemoteDescription.mock.calls.length).toBe(1); + expect(origSetRemoteDescription.mock.calls[0][0].sdp) + .toEqual('\n' + sdp); }); it('does remove the extmap-allow-mixed line before Chrome 71', () => { @@ -59,7 +53,9 @@ describe('removal of extmap-allow-mixed', () => { const pc = new window.RTCPeerConnection(); pc.setRemoteDescription({sdp: '\n' + sdp}); - expect(origSetRemoteDescription.firstCall.args[0].sdp).to.equal('\n'); + expect(origSetRemoteDescription.mock.calls.length).toBe(1); + expect(origSetRemoteDescription.mock.calls[0][0].sdp) + .toEqual('\n'); }); }); @@ -79,8 +75,9 @@ describe('removal of extmap-allow-mixed', () => { const pc = new window.RTCPeerConnection(); pc.setRemoteDescription({sdp: '\n' + sdp}); - expect(origSetRemoteDescription.firstCall.args[0].sdp) - .to.equal('\n' + sdp); + expect(origSetRemoteDescription.mock.calls.length).toBe(1); + expect(origSetRemoteDescription.mock.calls[0][0].sdp) + .toEqual('\n' + sdp); }); it('does remove the extmap-allow-mixed line before 605', () => { @@ -89,7 +86,9 @@ describe('removal of extmap-allow-mixed', () => { const pc = new window.RTCPeerConnection(); pc.setRemoteDescription({sdp: '\n' + sdp}); - expect(origSetRemoteDescription.firstCall.args[0].sdp).to.equal('\n'); + expect(origSetRemoteDescription.mock.calls.length).toBe(1); + expect(origSetRemoteDescription.mock.calls[0][0].sdp) + .toEqual('\n'); }); }); }); diff --git a/test/unit/extractVersion.js b/test/unit/extractVersion.test.js similarity index 79% rename from test/unit/extractVersion.js rename to test/unit/extractVersion.test.js index fcbd20999..aba19cde6 100644 --- a/test/unit/extractVersion.js +++ b/test/unit/extractVersion.test.js @@ -5,10 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; - describe('extractVersion', () => { const extractVersion = require('../../dist/utils.js').extractVersion; @@ -19,66 +15,66 @@ describe('extractVersion', () => { it('matches Chrome', () => { ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like ' + 'Gecko) Chrome/45.0.2454.101 Safari/537.36'; - expect(extractVersion(ua, expr, 2)).to.equal(45); + expect(extractVersion(ua, expr, 2)).toBe(45); }); it('matches Chrome 100+', () => { ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like ' + 'Gecko) Chrome/100.0.2454.101 Safari/537.36'; - expect(extractVersion(ua, expr, 2)).to.equal(100); + expect(extractVersion(ua, expr, 2)).toBe(100); }); it('matches Chromium', () => { ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like ' + 'Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 ' + 'Safari/537.36'; - expect(extractVersion(ua, expr, 2)).to.equal(45); + expect(extractVersion(ua, expr, 2)).toBe(45); }); it('matches Chrome on Android', () => { ua = 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 ' + 'Safari/537.36'; - expect(extractVersion(ua, expr, 2)).to.equal(42); + expect(extractVersion(ua, expr, 2)).toBe(42); }); it('recognizes Opera as Chrome', () => { // Opera, should match chrome/webrtc version 45.0 not Opera 32.0. ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, ' + 'like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.44'; - expect(extractVersion(ua, /Chrom(e|ium)\/(\d+)\./, 2)).to.equal(45); + expect(extractVersion(ua, /Chrom(e|ium)\/(\d+)\./, 2)).toBe(45); }); it('does not match Firefox', () => { ua = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 ' + 'Firefox/44.0'; - expect(extractVersion(ua, expr, 2)).to.equal(null); + expect(extractVersion(ua, expr, 2)).toBe(null); }); it('does not match Safari', () => { ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) ' + 'AppleWebKit/604.1.6 (KHTML, like Gecko) Version/10.2 Safari/604.1.6'; - expect(extractVersion(ua, expr, 2)).to.equal(null); + expect(extractVersion(ua, expr, 2)).toBe(null); }); it('does match Edge (by design, do not use for Edge)', () => { ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10547'; - expect(extractVersion(ua, expr, 2)).to.equal(46); + expect(extractVersion(ua, expr, 2)).toBe(46); }); it('does not match non-Chrome', () => { ua = 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) ' + 'AppleWebKit/535.19 KHTML, like Gecko) Silk/3.13 Safari/535.19 ' + 'Silk-Accelerated=true'; - expect(extractVersion(ua, expr, 2)).to.equal(null); + expect(extractVersion(ua, expr, 2)).toBe(null); }); it('does not match the iPhone simulator', () => { ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) ' + 'AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 ' + 'Mobile/12A4345d Safari/600.1.4'; - expect(extractVersion(ua, expr, 1)).to.equal(null); + expect(extractVersion(ua, expr, 1)).toBe(null); }); }); @@ -87,31 +83,31 @@ describe('extractVersion', () => { it('matches Firefox', () => { ua = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 ' + 'Firefox/44.0'; - expect(extractVersion(ua, expr, 1)).to.equal(44); + expect(extractVersion(ua, expr, 1)).toBe(44); }); it('matches Firefox 100+', () => { ua = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 ' + 'Firefox/100.0'; - expect(extractVersion(ua, expr, 1)).to.equal(100); + expect(extractVersion(ua, expr, 1)).toBe(100); }); it('does not match Chrome', () => { ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like ' + 'Gecko) Chrome/45.0.2454.101 Safari/537.36'; - expect(extractVersion(ua, expr, 1)).to.equal(null); + expect(extractVersion(ua, expr, 1)).toBe(null); }); it('does not match Safari', () => { ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) ' + 'AppleWebKit/604.1.6 (KHTML, like Gecko) Version/10.2 Safari/604.1.6'; - expect(extractVersion(ua, expr, 1)).to.equal(null); + expect(extractVersion(ua, expr, 1)).toBe(null); }); it('does not match Edge', () => { ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10547'; - expect(extractVersion(ua, expr, 1)).to.equal(null); + expect(extractVersion(ua, expr, 1)).toBe(null); }); }); @@ -120,32 +116,32 @@ describe('extractVersion', () => { it('matches the webkit version', () => { ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) ' + 'AppleWebKit/604.1.6 (KHTML, like Gecko) Version/10.2 Safari/604.1.6'; - expect(extractVersion(ua, expr, 1)).to.equal(604); + expect(extractVersion(ua, expr, 1)).toBe(604); }); it('matches the iphone simulator', () => { ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) ' + 'AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 ' + 'Mobile/12A4345d Safari/600.1.4'; - expect(extractVersion(ua, expr, 1)).to.equal(600); + expect(extractVersion(ua, expr, 1)).toBe(600); }); it('matches Chrome (by design, do not use for Chrome)', () => { ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like ' + 'Gecko) Chrome/45.0.2454.101 Safari/537.36'; - expect(extractVersion(ua, expr, 1)).to.equal(537); + expect(extractVersion(ua, expr, 1)).toBe(537); }); it('matches Edge (by design, do not use for Edge', () => { ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10547'; - expect(extractVersion(ua, expr, 1)).to.equal(537); + expect(extractVersion(ua, expr, 1)).toBe(537); }); it('does not match Firefox', () => { ua = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 ' + 'Firefox/44.0'; - expect(extractVersion(ua, expr, 1)).to.equal(null); + expect(extractVersion(ua, expr, 1)).toBe(null); }); }); }); diff --git a/test/unit/firefox.js b/test/unit/firefox.test.js similarity index 69% rename from test/unit/firefox.js rename to test/unit/firefox.test.js index 96e603163..dcb6c988b 100644 --- a/test/unit/firefox.js +++ b/test/unit/firefox.test.js @@ -5,13 +5,6 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); - describe('Firefox shim', () => { const shim = require('../../dist/firefox/firefox_shim'); let window; @@ -20,7 +13,7 @@ describe('Firefox shim', () => { window = { navigator: { mediaDevices: { - getUserMedia: sinon.stub(), + getUserMedia: jest.fn(), }, }, }; @@ -30,27 +23,30 @@ describe('Firefox shim', () => { it('does not if navigator.mediaDevices does not exist', () => { delete window.navigator.mediaDevices; shim.shimGetDisplayMedia(window); - expect(window.navigator.mediaDevices).to.equal(undefined); + expect(window.navigator.mediaDevices).toBe(undefined); }); it('does not overwrite an existing ' + 'navigator.mediaDevices.getDisplayMedia', () => { window.navigator.mediaDevices.getDisplayMedia = 'foo'; shim.shimGetDisplayMedia(window, 'screen'); - expect(window.navigator.mediaDevices.getDisplayMedia).to.equal('foo'); + expect(window.navigator.mediaDevices.getDisplayMedia).toBe('foo'); }); it('shims navigator.mediaDevices.getDisplayMedia', () => { shim.shimGetDisplayMedia(window, 'screen'); - expect(window.navigator.mediaDevices.getDisplayMedia).to.be.a('function'); + expect(typeof window.navigator.mediaDevices.getDisplayMedia) + .toBe('function'); }); ['screen', 'window'].forEach((mediaSource) => { it('calls getUserMedia with the given default mediaSource', () => { shim.shimGetDisplayMedia(window, mediaSource); window.navigator.mediaDevices.getDisplayMedia({video: true}); - expect(window.navigator.mediaDevices.getUserMedia) - .to.have.been.calledWith({video: {mediaSource}}); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls.length) + .toBe(1); + expect(window.navigator.mediaDevices.getUserMedia.mock.calls[0][0]) + .toEqual({video: {mediaSource}}); }); }); }); diff --git a/test/unit/logSuppression.js b/test/unit/logSuppression.test.js similarity index 58% rename from test/unit/logSuppression.js rename to test/unit/logSuppression.test.js index 20d476b56..292d8fbf1 100644 --- a/test/unit/logSuppression.js +++ b/test/unit/logSuppression.test.js @@ -5,40 +5,26 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; describe('Log suppression', () => { const utils = require('../../dist/utils.js'); - const saveConsole = console.log.bind(console); - - let logCount; beforeEach(() => { - logCount = 0; - console.log = function() { - if (arguments.length === 1 && arguments[0] === 'test') { - logCount++; - } else { - saveConsole.apply(saveConsole, arguments); - } - }; + jest.spyOn(console, 'log'); global.window = {}; require('../../out/adapter.js'); }); afterEach(() => { - console.log = saveConsole; delete global.window; }); it('does not call console.log by default', () => { utils.log('test'); - expect(logCount).to.equal(0); + expect(console.log.mock.calls.length).toBe(0); }); it('does call console.log when enabled', () => { utils.disableLog(false); utils.log('test'); - expect(logCount).to.equal(1); + expect(console.log.mock.calls.length).toBe(1); }); }); diff --git a/test/unit/rtcicecandidate.js b/test/unit/rtcicecandidate.test.js similarity index 64% rename from test/unit/rtcicecandidate.js rename to test/unit/rtcicecandidate.test.js index 358fab370..8d8303121 100644 --- a/test/unit/rtcicecandidate.js +++ b/test/unit/rtcicecandidate.test.js @@ -6,9 +6,6 @@ * tree. */ /* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; - describe('RTCIceCandidate', () => { const shim = require('../../dist/common_shim'); let RTCIceCandidate; @@ -37,9 +34,9 @@ describe('RTCIceCandidate', () => { sdpMid: 'audio', sdpMLineIndex: 0 }); - expect(candidate.candidate).to.equal(candidateString); - expect(candidate.sdpMid).to.equal('audio'); - expect(candidate.sdpMLineIndex).to.equal(0); + expect(candidate.candidate).toBe(candidateString); + expect(candidate.sdpMid).toBe('audio'); + expect(candidate.sdpMLineIndex).toBe(0); }); it('drops the a= part of the candidate if present', () => { @@ -48,7 +45,7 @@ describe('RTCIceCandidate', () => { sdpMid: 'audio', sdpMLineIndex: 0 }); - expect(candidate.candidate).to.equal(candidateString); + expect(candidate.candidate).toBe(candidateString); }); it('parses the candidate', () => { @@ -57,18 +54,18 @@ describe('RTCIceCandidate', () => { sdpMid: 'audio', sdpMLineIndex: 0 }); - expect(candidate.foundation).to.equal('702786350'); - // expect(candidate.component).to.equal('2'); // TODO - expect(candidate.priority).to.equal(41819902); - expect(candidate.ip).to.equal('8.8.8.8'); - expect(candidate.protocol).to.equal('udp'); - expect(candidate.port).to.equal(60769); - expect(candidate.type).to.equal('relay'); - expect(candidate.tcpType).to.equal('active'); - expect(candidate.relatedAddress).to.equal('8.8.8.8'); - expect(candidate.relatedPort).to.equal(1234); - expect(candidate.generation).to.equal('0'); - expect(candidate.usernameFragment).to.equal('abc'); + expect(candidate.foundation).toBe('702786350'); + expect(candidate.component).toBe('rtcp'); + expect(candidate.priority).toBe(41819902); + expect(candidate.ip).toBe('8.8.8.8'); + expect(candidate.protocol).toBe('udp'); + expect(candidate.port).toBe(60769); + expect(candidate.type).toBe('relay'); + expect(candidate.tcpType).toBe('active'); + expect(candidate.relatedAddress).toBe('8.8.8.8'); + expect(candidate.relatedPort).toBe(1234); + expect(candidate.generation).toBe('0'); + expect(candidate.usernameFragment).toBe('abc'); }); }); @@ -81,6 +78,6 @@ describe('RTCIceCandidate', () => { }); const serialized = JSON.stringify(candidate); // there should be only 4 items in the JSON. - expect(Object.keys(JSON.parse(serialized)).length).to.equal(4); + expect(Object.keys(JSON.parse(serialized)).length).toBe(4); }); }); diff --git a/test/unit/safari.js b/test/unit/safari.test.js similarity index 59% rename from test/unit/safari.js rename to test/unit/safari.test.js index c8fcba286..d3ca54369 100644 --- a/test/unit/safari.js +++ b/test/unit/safari.test.js @@ -5,37 +5,30 @@ * that can be found in the LICENSE file in the root of the source * tree. */ -/* eslint-env node */ -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); -chai.use(sinonChai); - describe('Safari shim', () => { const shim = require('../../dist/safari/safari_shim'); let window; beforeEach(() => { window = { - RTCPeerConnection: sinon.stub() + RTCPeerConnection: jest.fn() }; }); describe('shimStreamsAPI', () => { beforeEach(() => { - window.RTCPeerConnection.prototype.addTrack = sinon.stub(); + window.RTCPeerConnection.prototype.addTrack = jest.fn(); shim.shimLocalStreamsAPI(window); shim.shimRemoteStreamsAPI(window); }); it('shimStreamsAPI existence', () => { const prototype = window.RTCPeerConnection.prototype; - expect(prototype.addTrack.length).to.equal(1); - expect(prototype.addStream.length).to.equal(1); - expect(prototype.removeStream.length).to.equal(1); - expect(prototype.getLocalStreams.length).to.equal(0); - expect(prototype.getRemoteStreams.length).to.equal(0); + expect(prototype.addTrack.length).toBe(1); + expect(prototype.addStream.length).toBe(1); + expect(prototype.removeStream.length).toBe(1); + expect(prototype.getLocalStreams.length).toBe(0); + expect(prototype.getRemoteStreams.length).toBe(0); }); it('local streams API', () => { const pc = new window.RTCPeerConnection(); @@ -46,12 +39,12 @@ describe('Safari shim', () => { getAudioTracks: () => [], getVideoTracks: () => [], }; - expect(pc.getLocalStreams().length).to.equal(0); - expect(pc.getRemoteStreams().length).to.equal(0); + expect(pc.getLocalStreams().length).toBe(0); + expect(pc.getRemoteStreams().length).toBe(0); pc.addStream(stream); - expect(pc.getLocalStreams()[0]).to.equal(stream); - expect(pc.getRemoteStreams().length).to.equal(0); + expect(pc.getLocalStreams()[0]).toBe(stream); + expect(pc.getRemoteStreams().length).toBe(0); const stream2 = { id: 'id2', @@ -60,19 +53,19 @@ describe('Safari shim', () => { getVideoTracks: () => [], }; pc.removeStream(stream2); - expect(pc.getLocalStreams()[0]).to.equal(stream); + expect(pc.getLocalStreams()[0]).toBe(stream); pc.addTrack({}, stream2); - expect(pc.getLocalStreams().length).to.equal(2); - expect(pc.getLocalStreams()[0]).to.equal(stream); - expect(pc.getLocalStreams()[1]).to.equal(stream2); + expect(pc.getLocalStreams().length).toBe(2); + expect(pc.getLocalStreams()[0]).toBe(stream); + expect(pc.getLocalStreams()[1]).toBe(stream2); pc.removeStream(stream2); - expect(pc.getLocalStreams().length).to.equal(1); - expect(pc.getLocalStreams()[0]).to.equal(stream); + expect(pc.getLocalStreams().length).toBe(1); + expect(pc.getLocalStreams()[0]).toBe(stream); pc.removeStream(stream); - expect(pc.getLocalStreams().length).to.equal(0); + expect(pc.getLocalStreams().length).toBe(0); }); }); @@ -80,11 +73,11 @@ describe('Safari shim', () => { it('shimCallbacksAPI existence', () => { shim.shimCallbacksAPI(window); const prototype = window.RTCPeerConnection.prototype; - expect(prototype.createOffer.length).to.equal(2); - expect(prototype.createAnswer.length).to.equal(2); - expect(prototype.setLocalDescription.length).to.equal(3); - expect(prototype.setRemoteDescription.length).to.equal(3); - expect(prototype.addIceCandidate.length).to.equal(3); + expect(prototype.createOffer.length).toBe(2); + expect(prototype.createAnswer.length).toBe(2); + expect(prototype.setLocalDescription.length).toBe(3); + expect(prototype.setRemoteDescription.length).toBe(3); + expect(prototype.addIceCandidate.length).toBe(3); }); }); @@ -93,7 +86,7 @@ describe('Safari shim', () => { describe('options passing with', () => { let stub; beforeEach(() => { - stub = sinon.stub(); + stub = jest.fn(); window.RTCPeerConnection.prototype[method] = stub; shim.shimCallbacksAPI(window); }); @@ -101,31 +94,36 @@ describe('Safari shim', () => { it('no arguments', () => { const pc = new window.RTCPeerConnection(); pc[method](); - expect(stub).to.have.been.calledWith(undefined); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual([undefined]); }); it('two callbacks', () => { const pc = new window.RTCPeerConnection(); pc[method](null, null); - expect(stub).to.have.been.calledWith(undefined); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual([undefined]); }); it('a non-function first argument', () => { const pc = new window.RTCPeerConnection(); pc[method](1); - expect(stub).to.have.been.calledWith(1); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual([1]); }); it('two callbacks and options', () => { const pc = new window.RTCPeerConnection(); pc[method](null, null, 1); - expect(stub).to.have.been.calledWith(1); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual([1]); }); it('two callbacks and two additional arguments', () => { const pc = new window.RTCPeerConnection(); pc[method](null, null, 1, 2); - expect(stub).to.have.been.calledWith(1); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual([1]); }); }); }); @@ -134,7 +132,7 @@ describe('Safari shim', () => { describe('legacy createOffer shim converts offer into transceivers', () => { let pc, stub, options; beforeEach(() => { - stub = sinon.stub(); + stub = jest.fn(); window.RTCPeerConnection.prototype.createOffer = function() {}; shim.shimCreateOfferLegacy(window); @@ -153,42 +151,44 @@ describe('Safari shim', () => { it('when offerToReceive Audio is true', () => { options.offerToReceiveAudio = true; pc.createOffer(options); - expect(stub).to.have.been.calledWith('audio'); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual(['audio', {direction: 'recvonly'}]); }); it('when offerToReceive Video is true', () => { options.offerToReceiveVideo = true; pc.createOffer(options); - expect(stub).to.have.been.calledWith('video'); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual(['video', {direction: 'recvonly'}]); }); it('when both offers are false', () => { pc.createOffer(options); - expect(stub).to.not.have.been.calledWith('audio'); - expect(stub).to.not.have.been.calledWith('video'); + expect(stub.mock.calls.length).toBe(0); }); it('when both offers are true', () => { options.offerToReceiveAudio = true; options.offerToReceiveVideo = true; pc.createOffer(options); - expect(stub).to.have.been.calledWith('audio'); - expect(stub).to.have.been.calledWith('video'); + expect(stub.mock.calls.length).toBe(2); + expect(stub.mock.calls[0]).toEqual(['audio', {direction: 'recvonly'}]); + expect(stub.mock.calls[1]).toEqual(['video', {direction: 'recvonly'}]); }); it('when offerToReceive has bit values', () => { options.offerToReceiveAudio = 0; options.offerToReceiveVideo = 1; pc.createOffer(options); - expect(stub).to.not.have.been.calledWith('audio'); - expect(stub).to.have.been.calledWith('video'); + expect(stub.mock.calls.length).toBe(1); + expect(stub.mock.calls[0]).toEqual(['video', {direction: 'recvonly'}]); }); }); describe('conversion of RTCIceServer.url', () => { let nativeStub; beforeEach(() => { - nativeStub = window.RTCPeerConnection; + nativeStub = jest.spyOn(window, 'RTCPeerConnection'); shim.shimRTCIceServerUrls(window); }); @@ -201,40 +201,36 @@ describe('Safari shim', () => { describe('does not modify RTCIceServer.urls', () => { it('for strings', () => { new window.RTCPeerConnection({iceServers: [urls]}); - expect(nativeStub).to.have.been.calledWith(sinon.match({ - iceServers: sinon.match([ - sinon.match(urls) - ]) - })); + expect(nativeStub.mock.calls.length).toBe(1); + expect(nativeStub.mock.calls[0][0]).toEqual({ + iceServers: [urls], + }); }); it('for arrays', () => { new window.RTCPeerConnection({iceServers: [urlsArray]}); - expect(nativeStub).to.have.been.calledWith(sinon.match({ - iceServers: sinon.match([ - sinon.match(urlsArray) - ]) - })); + expect(nativeStub.mock.calls.length).toBe(1); + expect(nativeStub.mock.calls[0][0]).toEqual({ + iceServers: [urlsArray], + }); }); }); describe('transforms RTCIceServer.url to RTCIceServer.urls', () => { it('for strings', () => { new window.RTCPeerConnection({iceServers: [url]}); - expect(nativeStub).to.have.been.calledWith(sinon.match({ - iceServers: sinon.match([ - sinon.match(urls) - ]) - })); + expect(nativeStub.mock.calls.length).toBe(1); + expect(nativeStub.mock.calls[0][0]).toEqual({ + iceServers: [urls], + }); }); it('for arrays', () => { new window.RTCPeerConnection({iceServers: [urlArray]}); - expect(nativeStub).to.have.been.calledWith(sinon.match({ - iceServers: sinon.match([ - sinon.match(urlsArray) - ]) - })); + expect(nativeStub.mock.calls.length).toBe(1); + expect(nativeStub.mock.calls[0][0]).toEqual({ + iceServers: [urlsArray], + }); }); }); });