Cloud Firestore e Realtime Database si basano su linguaggi di regole potenti e concisi creati appositamente per regolare la sicurezza delle informazioni e il controllo dell'accesso. Tuttavia, man mano che le regole diventano più lunghe e complesse, potresti aver bisogno di aiuto per eseguire il debug degli errori nel loro comportamento.
Gli emulatori Firebase includono la possibilità di generare report sulla copertura delle regole, in modo da vedere esattamente il risultato di ogni sottoespressione quando riproduci un errore. I report forniscono anche informazioni sulla frequenza con cui ogni caso di test ha utilizzato una regola, ad esempio le tradizionali tecniche di "copertura delle righe".
Genera un report
Dopo aver eseguito una serie di test, puoi accedere ai report sulla copertura dei test che mostrano come è stata valutata ciascuna delle tue regole di sicurezza.
Per ottenere i report, esegui una query su un endpoint esposto nell'emulatore durante l'esecuzione. Per una versione compatibile con il browser, utilizza il seguente URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
In questo modo, le regole vengono suddivise in espressioni e sottoespressioni su cui puoi passare il mouse per visualizzare ulteriori informazioni, tra cui il numero di valutazioni e i valori restituiti. Per la versione JSON non elaborata di questi dati, includi il seguente URL nella query:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Regole di esempio per il debug
Per generare facilmente un report di test, utilizza le guide rapide dell'emulatore disponibili su GitHub per Cloud Firestore e Realtime Database. Queste guide rapide ti guidano attraverso l'installazione e l'inizializzazione corrette degli emulatori, quindi generano test di esempio da un insieme di regole di esempio.
Prendi in considerazione un'app di esempio che utilizza Cloud Firestore per conteggiare il numero di volte in cui gli utenti fanno clic su un pulsante. L'app utilizza le seguenti regole:
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
Per eseguire il debug degli errori nelle regole mostrate sopra, utilizza il seguente test JavaScript di esempio:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
L'emulatore genera un report disponibile all'URL indicato sopra:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Il report mostra i seguenti errori di valori nulli e non definiti:
Il problema di questo esempio specifico è che le regole non distinguono tra la creazione e l'aggiornamento del documento. Di conseguenza, la scrittura non è consentita se il documento non esiste e il documento non può essere creato perché non esiste. La differenziazione dell'operazione "write" in due operazioni più specifiche, "create" e "update", risolve il problema.
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
Il report generato mostra la frequenza con cui è stata utilizzata ogni regola e cosa è stato restituito.