какой правильный способ провести модульное тестирование облачной функции firebase, которая вызывает внешний API.Моя функция Firebase Cloud выглядит следующим образом:
const functions = require('firebase-functions');
var Analytics = require('analytics-node');
//fetching segment api key
var segmentKey = functions.config().segment.key;
var analytics = new Analytics(segmentKey);
/**
* this gf will get called when document is added to
* app-open-track collection.
*/
exports.trackAppOpen = functions.firestore
.document('app-open-track/{token}')
.onCreate((snap, context) => {
const snapValue = snap.data();
const userId = snapValue.hasOwnProperty('userId') ? snapValue.userId : "";
const deviceId = snapValue.hasOwnProperty('deviceId') ? snapValue.deviceId : "";
const deviceType = snapValue.hasOwnProperty('deviceType') ? snapValue.deviceType : "";
const osVersion = snapValue.hasOwnProperty('osVersion') ? snapValue.osVersion : "";
const createdAt = snapValue.hasOwnProperty('createdAt') ? snapValue.createdAt : "";
//checking user id exists if yes proceed
if (!userId) {
return false;
} else {
//sending data to segment API
analytics.track({
"type": "track",
"userId": userId,
"event": "app opened",
"properties": {
"deviceId": deviceId,
"deviceType": deviceType,
"osVersion": osVersion,
"createdAt": createdAt
}
});
}
return true;
});
Я написал для этого тестовый пример:
const chai = require('chai');
const assert = chai.assert;
const test = require('firebase-functions-test')();
test.mockConfig({ segment: { key: 'MEhxCjq9YcWTRHLa7y2ArYHEugmRJUV0' } });
const trackOpenTestFunctions = require('../index.js');
describe('trackAppOpenCase', () => {
it('valid request parameters -this should send data to segment API and return true', () => {
// Make snapshot
const snap = test.firestore.makeDocumentSnapshot({ deviceId: '456754765', osVersion: '12.3', userId: '0000007' }, 'app-open-track/{token}');
// Call wrapped function with the snapshot
const wrapped = test.wrap(trackOpenTestFunctions.trackAppOpen);
wrapped(snap);
return assert.equal(wrapped(snap), true);
});
it('removing userId key from request - this should not send data to segment API and return false', () => {
// Make snapshot
const snap = test.firestore.makeDocumentSnapshot({ deviceId: '456754765', osVersion: '12.3' }, 'app-open-track/{token}');
// Call wrapped function with the snapshot
const wrapped = test.wrap(trackOpenTestFunctions.trackAppOpen);
wrapped(snap);
return assert.equal(wrapped(snap), false);
});
});
. Проблема в том, что тест не ожидает завершения API, чтоэто лучший способ проверить такие условия, нужно ли мне изменить свой код, чтобы я мог проверить его лучше.