Estoy siguiendo esta guía para configurar los emuladores de Firebase para probar las reglas de seguridad de mi base de datos en tiempo real: https://firebase.google.com/docs/emulator-suite/connect_rtdb#clear_your_database_ between_tests
En "Borrar su base de datos entre pruebas", sugiere hacer:
firebase.database().ref().set(null);Sin embargo, mis reglas de seguridad impiden que mi aplicación lo haga.
Aquí está mi código:
import * as firebase from '@firebase/testing'; import fs from 'fs'; const app = firebase.initializeTestApp({ databaseName: 'myDb', auth: { uid: 'myuid', }, }); describe('test', () => { beforeEach(async () => { await firebase.loadDatabaseRules({ databaseName: 'mydb', rules: fs.readFileSync('database.rules.json', 'utf8'), }); await app.database().ref().set(null) // This line throws a permission denied error }); afterAll(async () => { await Promise.all(firebase.apps().map((app) => app.delete())); }); it('test', async (done) => { // ... // }); }¿Cómo puedo restablecer mi base de datos entre mis pruebas?
Encontré una solución aquí
necesito usar
firebase.initializeAdminApp({ databaseName: "myDb" });para crear una aplicación que esté autenticada como administrador. Luego puedo restablecer la base de datos entre cada prueba:
const app = firebase.initializeTestApp({ databaseName: 'myDb', auth: { uid: 'myuid', }, }); const adminApp = firebase.initializeAdminApp({ databaseName: "myDb" }); let backup; beforeEach(async () => { await firebase.loadDatabaseRules({ databaseName: 'myDb', rules: fs.readFileSync('database.rules.json', 'utf8'), }); await adminApp .database() .ref('/') .once('value') .then((v) => { backup = v.val(); }) }); afterEach(async ()=>{ await adminApp.database().ref('/').set(backup); })