Skip to content

firebase-functions-test@3.4.1 misdetects v2 callables #310

Description

@alexjbrandtjr-gif

Bug: firebase-functions-test@3.4.1 misdetects v2 callables when used with firebase-functions@7.x

Environment

  • firebase-functions: 7.x
  • firebase-functions-test: 3.4.1
  • Node: 22

What happens is V2CloudFunction() detection fails silently.

The check:

cloudFunction.run.length === 1

returns false because firebase-functions@7.x wraps handlers
in rest-param functions:

async (...args) => { ... } // .length === 0, not 1

This causes wrap() to fall back to wrapV1, which calls:

handler.run(data, context) // two args — wrong for v2

Instead of the correct v2 invocation:

handler.run(req) // single CallableRequest object

Impact

Tests using wrap() on v2 callable functions silently use
the wrong invocation path. Auth context is passed incorrectly,
causing permission-denied errors that are unrelated to actual
authorization logic.

Workaround

Bypass wrap() entirely and call handler.run({ data, auth })
directly — which is what wrapV2 does internally.

Steps to reproduce

  1. Create a v2 callable using onCall() from firebase-functions@7.x
  2. Wrap it with firebase-functions-test@3.4.1's wrap()
  3. Invoke it with an auth context
  4. Observe incorrect behavior / permission-denied errors

Expected behavior

wrap() should correctly identify v2 callables and use the
single-argument invocation path regardless of the internal
wrapping firebase-functions uses.


I was able to successfully deploy after creating the workaround.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions