Files
cypress/packages/https-proxy/test/unit/server_spec.js
2020-02-20 13:09:40 -05:00

124 lines
3.3 KiB
JavaScript

const { expect } = require('../spec_helper')
const EE = require('events')
const Server = require('../../lib/server')
describe('lib/server', () => {
beforeEach(function () {
this.setup = (options = {}) => {
this.ca = {}
this.port = 12345
return Server.create(this.ca, this.port, options)
}
})
afterEach(() => {
delete process.env.HTTPS_PROXY
delete process.env.NO_PROXY
})
context('#listen', () => {
it('calls options.onUpgrade with req, socket head', function () {
const onUpgrade = this.sandbox.stub()
return this.setup({ onUpgrade })
.then((srv) => {
srv._sniServer.emit('upgrade', 1, 2, 3)
expect(onUpgrade).to.be.calledWith(1, 2, 3)
})
})
it('calls options.onRequest with req, res', function () {
const onRequest = this.sandbox.stub()
const req = { url: 'https://www.foobar.com', headers: { host: 'www.foobar.com' } }
const res = {}
return this.setup({ onRequest })
.then((srv) => {
srv._sniServer.emit('request', req, res)
expect(onRequest).to.be.calledWith(req, res)
})
})
it('calls options.onError with err and port and destroys the client socket', function (done) {
const socket = new EE()
socket.destroy = this.sandbox.stub()
const head = {}
const onError = function (err, socket2, head2, port) {
expect(err.message).to.eq('connect ECONNREFUSED 127.0.0.1:8444')
expect(socket).to.eq(socket2)
expect(head).to.eq(head2)
expect(port).to.eq('8444')
expect(socket.destroy).to.be.calledOnce
done()
}
this.setup({ onError })
.then((srv) => {
srv._makeDirectConnection({ url: 'localhost:8444' }, socket, head)
})
})
// https://github.com/cypress-io/cypress/issues/3250
it('does not crash when an erroneous URL is provided, just destroys socket', function (done) {
const socket = new EE()
socket.destroy = this.sandbox.stub()
const head = {}
const onError = function (err, socket2, head2, port) {
expect(err.message).to.eq('connect ECONNREFUSED 127.0.0.1:443')
expect(socket).to.eq(socket2)
expect(head).to.eq(head2)
expect(port).to.eq('443')
expect(socket.destroy).to.be.calledOnce
done()
}
this.setup({ onError })
.then((srv) => {
srv._makeDirectConnection({ url: '%7Balgolia_application_id%7D-dsn.algolia.net:443' }, socket, head)
})
})
it('with proxied connection calls options.onError with err and port and destroys the client socket', function (done) {
const socket = new EE()
socket.destroy = this.sandbox.stub()
const head = {}
const onError = function (err, socket2, head2, port) {
expect(err.message).to.eq('A connection to the upstream proxy could not be established: connect ECONNREFUSED 127.0.0.1:8444')
expect(socket).to.eq(socket2)
expect(head).to.eq(head2)
expect(port).to.eq('11111')
expect(socket.destroy).to.be.calledOnce
done()
}
process.env.HTTPS_PROXY = 'http://localhost:8444'
process.env.NO_PROXY = ''
this.setup({ onError })
.then((srv) => {
srv._makeDirectConnection({ url: 'should-not-reach.invalid:11111' }, socket, head)
})
})
})
})