Open JessRascal opened 1 year ago
The same issue happens with onDocumentWritten
. The event.data.before.data()
is retuning a strange object.
const beforeSnap = fnTest.firestore.makeDocumentSnapshot(
{ foo: 'bar' },
'Profile/1',
);
const afterSnap = fnTest.firestore.makeDocumentSnapshot(
{},
'Profile/1',
);
const change = fnTest.makeChange(beforeSnap, afterSnap);
await wrapped(change);
And in the v2 onDocumentWritten
the event.data.before.data()
returns:
event { anObject: { a: 'bar' }, aNumber: 7 }
I also catched that event.before.data()
returns the valid data, but it throws a typescript error.
The event
object in console logs looks strange:
event {
specversion: '1.0',
id: '9xaf968on9dz9x1ua9rr3',
data: Change {
before: QueryDocumentSnapshot {
_fieldsProto: [Object],
_ref: [DocumentReference],
_serializer: [Serializer],
_readTime: [Timestamp],
_createTime: [Timestamp],
_updateTime: [Timestamp]
},
after: QueryDocumentSnapshot {
_fieldsProto: [Object],
_ref: [DocumentReference],
_serializer: [Serializer],
_readTime: [Timestamp],
_createTime: [Timestamp],
_updateTime: [Timestamp]
}
},
source: '',
type: 'google.cloud.firestore.document.v1.written',
time: '2023-12-14T12:43:48.031Z',
location: 'us-central1',
project: 'ci',
database: '(default)',
namespace: '(default)',
document: 'Profile/undefined',
params: {},
before: QueryDocumentSnapshot {
_fieldsProto: { foo: [Object] },
_ref: DocumentReference {
_firestore: [Firestore],
_path: [QualifiedResourcePath],
_converter: [Object]
},
_serializer: Serializer {
createReference: [Function (anonymous)],
createInteger: [Function (anonymous)],
allowUndefined: false
},
_readTime: Timestamp { _seconds: 1702557828, _nanoseconds: 30000000 },
_createTime: Timestamp { _seconds: 1702557828, _nanoseconds: 29000000 },
_updateTime: Timestamp { _seconds: 1702557828, _nanoseconds: 30000000 }
},
after: DocumentSnapshot {
_fieldsProto: undefined,
_ref: DocumentReference {
_firestore: [Firestore],
_path: [QualifiedResourcePath],
_converter: [Object]
},
_serializer: Serializer {
createReference: [Function (anonymous)],
createInteger: [Function (anonymous)],
allowUndefined: false
},
_readTime: Timestamp { _seconds: 1702557828, _nanoseconds: 30000000 },
_createTime: undefined,
_updateTime: undefined
}
}
@JessRascal seems like v2 wrapped function expects a cloud event, not a change/snapshot object. So if you wrap your input into a cloud event object type, it works. See: https://github.com/firebase/firebase-functions-test/blob/master/src/cloudevent/mocks/firestore/helpers.ts#L68
await wrapped({ data: change });
Would be nice if they updated the docs to reflect this
https://firebase.google.com/docs/functions/unit-testing#constructing_test_data
The docs have still not been updated
Version info
firebase-functions-test: 3.1.0
firebase-functions: 4.4.1
firebase-admin: 11.9.0
Test case
Firebase Cloud Function
Unit Test Note: Using Vitest but I believe it would be the same result with Jest, etc.
Steps to reproduce
Run the unit test against the Firebase function and it will result in a Cannot read properties of undefined (reading 'original') when trying to create the 'original' variable in the function (
const original = event.data?.data().original;
).This is because
event.data.data()
is undefined.Expected behavior
The document snapshot created in the unit test with
makeDocumentSnapshot
is in the correct format to be passed intoonDocumentCreated
so that its data can be read.Actual behavior
The 'original' variable cannot be created in the Firebase function because it can't read the
data
object in the passed inevent
resulting in the following error...I guess this is due to
makeDocumentSnapshot
creating aDocumentSnapshot
and theevent
inonDocumentCreated
expected to have a type ofFirestoreEvent<QueryDocumentSnapshot | undefined, { documentId: string; }>
.I can't find any alternative to
makeDocumentSnapshot
that should be used in this scenario for gen2 functions though so I'm guessing this isn't supported yet?If I create an object that contains the document snapshot as the value of a
data
parameter, it will workI'm not sure how much of this library is currently expected to work with the gen2 Firebase functions, but I couldn't find this issue already logged and the gen2 samples don't cover
onDocumentCreated
functions.Cheers Jess