@revoloo/cypress6
Version:
Cypress.io end to end testing tool
131 lines (115 loc) • 3.91 kB
text/typescript
import _ from 'lodash'
import ResponseMiddleware from '../../../lib/http/response-middleware'
import { expect } from 'chai'
import sinon from 'sinon'
import {
testMiddleware,
} from './helpers'
describe('http/response-middleware', function () {
it('exports the members in the correct order', function () {
expect(_.keys(ResponseMiddleware)).to.have.ordered.members([
'LogResponse',
'AttachPlainTextStreamFn',
'InterceptResponse',
'PatchExpressSetHeader',
'SetInjectionLevel',
'OmitProblematicHeaders',
'MaybePreventCaching',
'MaybeStripDocumentDomainFeaturePolicy',
'CopyCookiesFromIncomingRes',
'MaybeSendRedirectToClient',
'CopyResponseStatusCode',
'ClearCyInitialCookie',
'MaybeEndWithEmptyBody',
'MaybeInjectHtml',
'MaybeRemoveSecurity',
'GzipBody',
'SendResponseBodyToClient',
])
})
describe('MaybeStripDocumentDomainFeaturePolicy', function () {
const { MaybeStripDocumentDomainFeaturePolicy } = ResponseMiddleware
let ctx
let featurePolicyDirectives: any
beforeEach(function () {
featurePolicyDirectives = {
autoplay: '\'self\'',
camera: '*',
'document-domain': '\'none\'',
}
})
describe('when no feature-policy header is present', function () {
beforeEach(function () {
featurePolicyDirectives = {}
prepareContext()
})
it('doesn\'t do anything', function () {
return testMiddleware([MaybeStripDocumentDomainFeaturePolicy], ctx)
.then(() => {
expect(ctx.res.set).not.to.be.called
})
})
})
describe('when no document-domain directive is present', function () {
beforeEach(function () {
delete featurePolicyDirectives['document-domain']
prepareContext()
})
it('doesn\'t do anything', function () {
return testMiddleware([MaybeStripDocumentDomainFeaturePolicy], ctx)
.then(() => {
expect(ctx.res.set).not.to.be.called
})
})
})
describe('when both feature-policy header and document-domain directive are present', function () {
describe('when there are also other directives', function () {
beforeEach(function () {
prepareContext()
})
it('removes the document-domain directive from the header and keeps the rest', function () {
return testMiddleware([MaybeStripDocumentDomainFeaturePolicy], ctx)
.then(() => {
const [, featurePolicy] = ctx.res.set.args[0]
const directives = _.fromPairs(featurePolicy.split('; ').map((directive) => directive.split(' ')))
expect(directives['document-domain']).not.to.exist
expect(directives['autoplay']).to.exist
expect(directives['camera']).to.exist
})
})
})
describe('when it is the only directive', function () {
beforeEach(function () {
featurePolicyDirectives = _.pick(featurePolicyDirectives, 'document-domain')
prepareContext()
})
it('removes the whole header', function () {
return testMiddleware([MaybeStripDocumentDomainFeaturePolicy], ctx)
.then(() => {
expect(ctx.res.removeHeader).to.be.calledWith('feature-policy')
})
})
})
})
function prepareContext () {
const headers = {
pragma: 'no-cache',
'referrer-policy': 'same-origin',
}
if (!_.isEmpty(featurePolicyDirectives)) {
headers['feature-policy'] = _.toPairs(featurePolicyDirectives).map(
(directive) => directive.join(' '),
).join('; ')
}
ctx = {
res: {
set: sinon.stub(),
removeHeader: sinon.stub(),
},
incomingRes: {
headers,
},
}
}
})
})