Проверить триггер firestore локально - PullRequest
0 голосов
/ 06 августа 2020

Я пишу тест, который проверяет триггер firebase. Проблема, однако, в том, что я не могу заставить его работать. Я хочу использовать локальный эмулятор firestore и Jest, чтобы смоделировать изменение в firestore и посмотреть, выполняет ли триггер то, что ему нужно.

Мне нужна облачная функция в моем тесте, и я инициализирую свое приложение

Setup. js:

const firebase = require('@firebase/testing');
const PROJECT_ID = 'project';

let admin;
let db;

const setupAdmin = async () => {
    admin = firebase.initializeAdminApp({
        projectId: PROJECT_ID
    });
    db = admin.firestore();
};

const getAdmin = () => {
    return admin;
};

const getDb = () => {
    return db;
};

module.exports.setupAdmin = setupAdmin;
module.exports.getAdmin = getAdmin;
module.exports.getDb = getDb;

Test. js

describe('Billing', () => {
    let dbRef;
    beforeAll(async () => {
        const {db, admin} = require('../../../functions/helpers/setup');
        dbRef = db;
    });

    afterAll(async () => {
        await Promise.all(firebase.apps().map(app => app.delete()));
        console.log(`View rule coverage information at ${COVERAGE_URL}\n`);
    });

    it('test', async () => {
        const mockData = {
            'Users/user1': {
                uid: 'user1'
            },
            ['Users/user1/Taxes/' + new Date().getFullYear().toString()]: {
                totalExpenseEuro: 0
            }
        };
        for (const key in mockData) {
            const ref = dbRef.doc(key);
            await ref.set(mockData[key]);
        }

        // Create mockup data
        await dbRef.collection('Users').doc('user1').collection('Expenses').doc('expense1').set({
            amountEuroInclVAT: 100
        });

        // Make snapshot for state of database beforehand
        const beforeSnap = test.firestore.makeDocumentSnapshot({amountEuroInclVAT: 0}, 'Users/user1/Expenses/expense1');
        // Make snapshot for state of database after the change
        const afterSnap = test.firestore.makeDocumentSnapshot(
            {amountEuroInclVAT: 100},
            'Users/user1/Expenses/expense1'
        );
        const change = test.makeChange(beforeSnap, afterSnap);

        // Call wrapped function with the Change object
        const wrapped = test.wrap(calculateTaxesOnExpenseUpdate);
        wrapped(change, {
            params: {
                uid: 'test1'
            }
        });
    });
});

Теперь основная проблема возникает, когда я пытаюсь получить доступ к этому объекту db в моем trigger

const calculateTaxesOnExpenseUpdate = functions.firestore
    .document('Users/{uid}/Expenses/{expenseId}')
    .onWrite(async (change, context) => {
        const {getDb} = require('../helpers/setup'); // This setup is the same as above
        let db = getDb();
        ...

По какой-то причине, когда я выполняю такое действие, как (await db.collection('Users').get()).get('totalExpenseEuro'), Jest прекращает выполнение моего кода. Когда я устанавливаю отладчик сразу после этой строки, он никогда не печатается. Этот фрагмент кода дает сбой, и я понятия не имею, почему. Я думаю, что экземпляр БД не настроен должным образом в моей функции триггера облака.

Вопрос: Как лучше всего использовать экземпляр БД (admin.firestore ()) между функциями теста и триггера облака?

...