UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

97 lines (76 loc) 2.72 kB
import _ from 'lodash' import Debug from 'debug' import { NetStubbingState, GetFixtureFn, BackendRoute, } from './types' import { AnnotatedRouteMatcherOptions, NetEventFrames, RouteMatcherOptions, } from '../types' import { getAllStringMatcherFields, setResponseFromFixture, } from './util' import { onRequestContinue } from './intercept-request' import { onResponseContinue } from './intercept-response' import CyServer from '@packages/server' const debug = Debug('cypress:net-stubbing:server:driver-events') async function _onRouteAdded (state: NetStubbingState, getFixture: GetFixtureFn, options: NetEventFrames.AddRoute) { const routeMatcher = _restoreMatcherOptionsTypes(options.routeMatcher) const { staticResponse } = options if (staticResponse) { await setResponseFromFixture(getFixture, staticResponse) } const route: BackendRoute = { routeMatcher, getFixture, ..._.omit(options, 'routeMatcher'), // skip the user's un-annotated routeMatcher } state.routes.push(route) } export function _restoreMatcherOptionsTypes (options: AnnotatedRouteMatcherOptions) { const stringMatcherFields = getAllStringMatcherFields(options) const ret: RouteMatcherOptions = {} stringMatcherFields.forEach((field) => { const obj = _.get(options, field) if (!obj) { return } let { value, type } = obj if (type === 'regex') { const lastSlashI = value.lastIndexOf('/') const flags = value.slice(lastSlashI + 1) const pattern = value.slice(1, lastSlashI) value = new RegExp(pattern, flags) } _.set(ret, field, value) }) const noAnnotationRequiredFields: (keyof AnnotatedRouteMatcherOptions)[] = ['https', 'port', 'matchUrlAgainstPath'] _.extend(ret, _.pick(options, noAnnotationRequiredFields)) return ret } type OnNetEventOpts = { eventName: string state: NetStubbingState socket: CyServer.Socket getFixture: GetFixtureFn args: any[] frame: NetEventFrames.AddRoute | NetEventFrames.HttpRequestContinue | NetEventFrames.HttpResponseContinue } export async function onNetEvent (opts: OnNetEventOpts): Promise<any> { const { state, socket, getFixture, args, eventName, frame } = opts debug('received driver event %o', { eventName, args }) switch (eventName) { case 'route:added': return _onRouteAdded(state, getFixture, <NetEventFrames.AddRoute>frame) case 'http:request:continue': return onRequestContinue(state, <NetEventFrames.HttpRequestContinue>frame, socket) case 'http:response:continue': return onResponseContinue(state, <NetEventFrames.HttpResponseContinue>frame) default: throw new Error(`Unrecognized net event: ${eventName}`) } }