UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

166 lines (137 loc) 5.38 kB
require('../../spec_helper') const browsers = require(`${root}../lib/browsers`) const utils = require(`${root}../lib/browsers/utils`) const snapshot = require('snap-shot-it') const normalizeBrowsers = (message) => { return message.replace(/(found are: ).*/, '$1chrome, firefox, electron') } // When we added component testing mode, we added the option for electron to be omitted const originalElectronVersion = process.versions.electron before(() => { process.versions.electron = true }) after(() => { process.versions.electron = originalElectronVersion }) describe('lib/browsers/index', () => { context('.getBrowserInstance', () => { it('returns instance', () => { const instance = { pid: 1234 } browsers._setInstance(instance) expect(browsers.getBrowserInstance()).to.eq(instance) }) it('returns undefined if no instance', () => { browsers._setInstance() expect(browsers.getBrowserInstance()).to.be.undefined }) }) context('.isBrowserFamily', () => { it('allows only known browsers', () => { expect(browsers.isBrowserFamily('chromium')).to.be.true expect(browsers.isBrowserFamily('firefox')).to.be.true expect(browsers.isBrowserFamily('chrome')).to.be.false expect(browsers.isBrowserFamily('electron')).to.be.false expect(browsers.isBrowserFamily('my-favorite-browser')).to.be.false }) }) context('.ensureAndGetByNameOrPath', () => { it('returns browser by name', () => { sinon.stub(utils, 'getBrowsers').resolves([ { name: 'foo', channel: 'stable' }, { name: 'bar', channel: 'stable' }, ]) return browsers.ensureAndGetByNameOrPath('foo') .then((browser) => { expect(browser).to.deep.eq({ name: 'foo', channel: 'stable' }) }) }) it('throws when no browser can be found', () => { return expect(browsers.ensureAndGetByNameOrPath('browserNotGonnaBeFound')) .to.be.rejectedWith({ type: 'BROWSER_NOT_FOUND_BY_NAME' }) .then((err) => { return snapshot(normalizeBrowsers(err.message)) }) }) it('throws a special error when canary is passed', () => { sinon.stub(utils, 'getBrowsers').resolves([ { name: 'chrome', channel: 'stable' }, { name: 'chrome', channel: 'canary' }, { name: 'firefox', channel: 'stable' }, ]) return expect(browsers.ensureAndGetByNameOrPath('canary')) .to.be.rejectedWith({ type: 'BROWSER_NOT_FOUND_BY_NAME' }) .then((err) => { return snapshot(err.message) }) }) }) context('.open', () => { it('throws an error if browser family doesn\'t exist', () => { return browsers.open({ name: 'foo-bad-bang', family: 'foo-bad', }, { browsers: [], }) .then((e) => { throw new Error('should\'ve failed') }).catch((err) => { // by being explicit with assertions, if something is unexpected // we will get good error message that includes the "err" object expect(err).to.have.property('type').to.eq('BROWSER_NOT_FOUND_BY_NAME') expect(err).to.have.property('message').to.contain('\'foo-bad-bang\' was not found on your system') }) }) }) context('.extendLaunchOptionsFromPlugins', () => { it('throws an error if unexpected property passed', () => { const fn = () => { return utils.extendLaunchOptionsFromPlugins({}, { foo: 'bar' }) } // this error is snapshotted in an e2e test, no need to do it here expect(fn).to.throw({ type: 'UNEXPECTED_BEFORE_BROWSER_LAUNCH_PROPERTIES' }) }) it('warns if array passed and changes it to args', () => { const onWarning = sinon.stub() const result = utils.extendLaunchOptionsFromPlugins({ args: [] }, ['foo'], { onWarning }) expect(result).to.deep.eq({ args: ['foo'], }) // this error is snapshotted in e2e tests, no need to do it here expect(onWarning).to.be.calledOnce expect(onWarning).to.be.calledWithMatch({ type: 'DEPRECATED_BEFORE_BROWSER_LAUNCH_ARGS' }) }) }) }) // Ooo, browser clean up tests are disabled?!! // it "calls onBrowserClose callback on close", -> // onBrowserClose = sinon.stub() // browsers.launch("electron", @url, {onBrowserClose}).then -> // Windows.create.lastCall.args[0].onClose() // expect(onBrowserClose).to.be.called // // it "calls onBrowserOpen callback", -> // onBrowserOpen = sinon.stub() // browsers.launch("electron", @url, {onBrowserOpen}).then => // expect(onBrowserOpen).to.be.called // // it "waits a second to give browser time to open", -> // browsers.launch("electron").then -> // expect(Promise.delay).to.be.calledWith(1000) // // it "returns 'instance'", -> // browsers.launch("electron").then (instance) -> // expect(instance.kill).to.be.a("function") // expect(instance.removeAllListeners).to.be.a("function") // // it "closes window on kill if it's not destroyed", -> // @win.isDestroyed.returns(false) // browsers.launch("electron").then (instance) => // instance.kill() // expect(@win.close).to.be.called // // it "does not close window on kill if it's destroyed", -> // @win.isDestroyed.returns(true) // browsers.launch("electron").then (instance) => // instance.kill() // expect(@win.close).not.to.be.called