@revoloo/cypress6
Version:
Cypress.io end to end testing tool
219 lines (176 loc) • 6.06 kB
JavaScript
require('../../spec_helper')
const events = require('events')
const os = require('os')
const path = require('path')
const snapshot = require('../../support/snapshot')
const cp = require('child_process')
const debug = require('debug')('test')
const readline = require('readline')
const fs = require(`${lib}/fs`)
const util = require(`${lib}/util`)
const logger = require(`${lib}/logger`)
const unzip = require(`${lib}/tasks/unzip`)
const stdout = require('../../support/stdout')
const normalize = require('../../support/normalize')
const version = '1.2.3'
const installDir = path.join(os.tmpdir(), 'Cypress', version)
describe('lib/tasks/unzip', function () {
require('mocha-banner').register()
beforeEach(function () {
this.stdout = stdout.capture()
os.platform.returns('darwin')
sinon.stub(util, 'pkgVersion').returns(version)
})
afterEach(function () {
stdout.restore()
// return fs.removeAsync(installationDir)
})
it('throws when cannot unzip', function () {
const ctx = this
return unzip
.start({
zipFilePath: path.join('test', 'fixture', 'bad_example.zip'),
installDir,
})
.then(() => {
throw new Error('should have failed')
})
.catch((err) => {
logger.error(err)
snapshot('unzip error 1', normalize(ctx.stdout.toString()))
})
})
it('can really unzip', function () {
const onProgress = sinon.stub().returns(undefined)
return unzip
.start({
zipFilePath: path.join('test', 'fixture', 'example.zip'),
installDir,
progress: { onProgress },
})
.then(() => {
expect(onProgress).to.be.called
return fs.statAsync(installDir)
})
})
context('on linux', () => {
beforeEach(() => {
os.platform.returns('linux')
})
it('can try unzip first then fall back to node unzip', function (done) {
const zipFilePath = path.join('test', 'fixture', 'example.zip')
sinon.stub(unzip.utils.unzipTools, 'extract').callsFake((filePath, opts, cb) => {
debug('unzip extract called with %s', filePath)
expect(filePath, 'zipfile is the same').to.equal(zipFilePath)
expect(cb, 'has callback').to.be.a('function')
setTimeout(cb, 10)
})
const unzipChildProcess = new events.EventEmitter()
unzipChildProcess.stdout = {
on () {},
}
unzipChildProcess.stderr = {
on () {},
}
sinon.stub(cp, 'spawn').withArgs('unzip').returns(unzipChildProcess)
setTimeout(() => {
debug('emitting unzip error')
unzipChildProcess.emit('error', new Error('unzip fails badly'))
}, 100)
unzip
.start({
zipFilePath,
installDir,
})
.then(() => {
debug('checking if unzip was called')
expect(cp.spawn, 'unzip spawn').to.have.been.calledWith('unzip')
expect(unzip.utils.unzipTools.extract, 'extract called').to.be.calledWith(zipFilePath)
expect(unzip.utils.unzipTools.extract, 'extract called once').to.be.calledOnce
done()
})
})
it('calls node unzip just once', function (done) {
const zipFilePath = path.join('test', 'fixture', 'example.zip')
sinon.stub(unzip.utils.unzipTools, 'extract').callsFake((filePath, opts, cb) => {
debug('unzip extract called with %s', filePath)
expect(filePath, 'zipfile is the same').to.equal(zipFilePath)
expect(cb, 'has callback').to.be.a('function')
setTimeout(cb, 10)
})
const unzipChildProcess = new events.EventEmitter()
unzipChildProcess.stdout = {
on () {},
}
unzipChildProcess.stderr = {
on () {},
}
sinon.stub(cp, 'spawn').withArgs('unzip').returns(unzipChildProcess)
setTimeout(() => {
debug('emitting unzip error')
unzipChildProcess.emit('error', new Error('unzip fails badly'))
}, 100)
setTimeout(() => {
debug('emitting unzip close')
unzipChildProcess.emit('close', 1)
}, 110)
unzip
.start({
zipFilePath,
installDir,
})
.then(() => {
debug('checking if unzip was called')
expect(cp.spawn, 'unzip spawn').to.have.been.calledWith('unzip')
expect(unzip.utils.unzipTools.extract, 'extract called').to.be.calledWith(zipFilePath)
expect(unzip.utils.unzipTools.extract, 'extract called once').to.be.calledOnce
done()
})
})
})
context('on Mac', () => {
beforeEach(() => {
os.platform.returns('darwin')
})
it('calls node unzip just once', function (done) {
const zipFilePath = path.join('test', 'fixture', 'example.zip')
sinon.stub(unzip.utils.unzipTools, 'extract').callsFake((filePath, opts, cb) => {
debug('unzip extract called with %s', filePath)
expect(filePath, 'zipfile is the same').to.equal(zipFilePath)
expect(cb, 'has callback').to.be.a('function')
setTimeout(cb, 10)
})
const unzipChildProcess = new events.EventEmitter()
unzipChildProcess.stdout = {
on () {},
}
unzipChildProcess.stderr = {
on () {},
}
sinon.stub(cp, 'spawn').withArgs('ditto').returns(unzipChildProcess)
sinon.stub(readline, 'createInterface').returns({
on: () => {},
})
setTimeout(() => {
debug('emitting ditto error')
unzipChildProcess.emit('error', new Error('ditto fails badly'))
}, 100)
setTimeout(() => {
debug('emitting ditto close')
unzipChildProcess.emit('close', 1)
}, 110)
unzip
.start({
zipFilePath,
installDir,
})
.then(() => {
debug('checking if unzip was called')
expect(cp.spawn, 'unzip spawn').to.have.been.calledWith('ditto')
expect(unzip.utils.unzipTools.extract, 'extract called').to.be.calledWith(zipFilePath)
expect(unzip.utils.unzipTools.extract, 'extract called once').to.be.calledOnce
done()
})
})
})
})