Gerar relatórios de teste

O Cloud Firestore e o Realtime Database contam com linguagens de regras poderosas e concisas, criadas especificamente para governar a segurança da informação e o controle de acesso. No entanto, à medida que as regras ficam mais longas e complexas, você pode precisar de ajuda para depurar erros em seu comportamento.

Os emuladores do Firebase incluem a capacidade de gerar relatórios de cobertura de regras, para que você possa ver exatamente como cada subexpressão avaliou ao reproduzir um erro. Os relatórios também fornecem informações sobre a frequência com que cada caso de teste usou uma regra, como técnicas tradicionais de “cobertura de linha”.

Gerar um relatório

Depois de executar um conjunto de testes, você poderá acessar relatórios de cobertura de testes que mostram como cada uma de suas regras de segurança foi avaliada.

Para obter os relatórios, consulte um ponto de extremidade exposto no emulador enquanto ele estiver em execução. Para uma versão amigável ao navegador, use o seguinte URL:

Cloud Fire Store

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
 

Banco de dados em tempo real

http://localhost:9000/.inspect/coverage?ns=<database_name>
 

Isso divide suas regras em expressões e subexpressões que você pode passar o mouse para obter mais informações, incluindo o número de avaliações e valores retornados. Para a versão JSON bruta desses dados, inclua o seguinte URL na sua consulta:

Cloud Fire Store

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
 

Banco de dados em tempo real

http://localhost:9000/.inspect/coverage.json?ns=<database_name>
 

Regras de exemplo de depuração

Para gerar facilmente um relatório de teste, use os guias de início rápido do emulador disponíveis no GitHub para Cloud Firestore e Realtime Database . Esses guias de início rápido orientam você na instalação e inicialização adequada dos emuladores e na geração de testes de amostra a partir de um conjunto de regras de exemplo.

Considere um exemplo de aplicativo usando o Cloud Firestore que conta quantas vezes os usuários clicam em um botão. O aplicativo emprega as seguintes regras:

Cloud Fire Store

 service cloud.firestore {
   match /databases/{database}/documents {
     match /counters/{counter} {
       allow read;
       allow write: if request.resource.data.value == resource.data.value +1;
     }
   }
 }
 

Para depurar os erros nas regras mostradas acima, use o seguinte exemplo de teste de JavaScript:

const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));

O emulador gera um relatório disponível no URL mencionado acima:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

O relatório mostra os seguintes erros indefinidos e de valor nulo:

O problema com este exemplo específico é que as regras não diferenciam entre criar o documento e atualizá-lo. Conseqüentemente, a gravação não será permitida se o documento não existir, e o documento não poderá ser criado porque não existe. Diferenciar a “gravação” em duas operações mais específicas – “criar” e “atualizar” – resolve o problema.

Cloud Fire Store

 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;
     }
   }
 }
 

O relatório gerado mostra a frequência com que cada regra foi usada e o que foi retornado.