function uninstalledStubbedPassportMiddleware() {
   const indices = stack.reduce((acc, layer, index) => {
     if (layer.name === LAYER_ID) {
       acc.push(index)
     }
     return acc
   }, [])
   indices.reverse().forEach((index) => stack.splice(index, 1))
   authenticator._deserializers.splice(0, +Infinity, ...backups._deserializers)
   authenticator._serializers.splice(0, +Infinity, ...backups._serializers)
 }
function stubPassport(app) {
  const stack = app._router.stack
  let backups = null
  if (!stack.some((layer) => layer.name === LAYER_ID)) {
    stack.unshift({
      handle: stubbedPassportMiddleware,
      handle_request: stubbedPassportMiddleware,
      match: () => true,
      name: LAYER_ID,
      path: '',
    })
    backups = {
      _deserializers: authenticator._deserializers,
      _serializers: authenticator._serializers,
    }
    authenticator._deserializers.splice(0, +Infinity, (user, done) =>
      done(null, user)
    )
    authenticator._serializers.splice(0, +Infinity, (user, done) =>
      done(null, user)
    )
  }

  let activeUser = null

  return {
    login,
    logIn: login,
    logout,
    logOut: logout,
    uninstall: uninstalledStubbedPassportMiddleware,
  }

  function login(user) {
    activeUser = user
  }

  function logout() {
    activeUser = null
  }

  function stubbedPassportMiddleware(req, res, next) {
    const passport = {
      _userProperty: 'user',
      _key: 'passport',
    }

    Object.defineProperty(req, '_passport', {
      get() {
        return {
          get instance() {
            return passport
          },
          get session() {
            return { user: activeUser }
          },
        }
      },
    })
    next()
  }

  function uninstalledStubbedPassportMiddleware() {
    const indices = stack.reduce((acc, layer, index) => {
      if (layer.name === LAYER_ID) {
        acc.push(index)
      }
      return acc
    }, [])
    indices.reverse().forEach((index) => stack.splice(index, 1))
    authenticator._deserializers.splice(0, +Infinity, ...backups._deserializers)
    authenticator._serializers.splice(0, +Infinity, ...backups._serializers)
  }
}