Search code examples
google-cloud-firestorefirebase-securityfirebase-tools

Firebase rules test does not pass even when using lockdown


I'm trying to test my firebase rules, but they seem to not pass even when I use lock down mode. I followed the guide at https://firebase.google.com/docs/firestore/security/test-rules-emulator

const firebase = require('@firebase/rules-unit-testing');
const fs = require('fs');

const projectId = 'test-judge';

function getAuthedFirestore(auth) {
    return firebase.initializeAdminApp({
        projectId: projectId,
        auth: auth
    }).firestore();
}

beforeEach(async () => {
    await firebase.clearFirestoreData({ projectId });
});

before(async () => {
    const rules = fs.readFileSync('firestore.rules', 'utf8');
    await firebase.loadFirestoreRules({
        projectId: projectId,
        rules: rules
    });
});

after(async () => {
    await Promise.all(firebase.apps().map(app => app.delete()));
});

describe('locked down', () => {
    it("require users to log in before creating a profile", async () => {
        const db = getAuthedFirestore(null);
        const profile = db.collection("users").doc("alice");
        await firebase.assertFails(profile.set({ birthday: "January 1" }));
    });
});

here is my firebase.json

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  }
}

and my package.json

{
    "devDependencies": {
        "firebase-admin": "^9.11.0",
        "@firebase/app": "^0.6.29",
        "@firebase/rules-unit-testing": "^1.3.12",
        "mocha": "^9.0.3",
        "fs-extra": "^10.0.0"
    },
    "scripts": {
        "test": "mocha"
    }
}

and here is firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

It doesn't seem to me like I'm doing anything wrong, but if I run npm test the test fails. I expect it to pass since asserFails is used and in the rules I return false

I should not be able to set the value the test should pass

here is my output

Warning: FIRESTORE_EMULATOR_HOST not set, using default value localhost:8080
  locked down
    1) require users to log in before creating a profile


  0 passing (324ms)
  1 failing

  1) locked down
       require users to log in before creating a profile:
     Error: Expected request to fail, but it succeeded.
      at C:\Users\Moneer\Desktop\judge_rules\node_modules\@firebase\rules-unit-testing\dist\index.cjs.js:581:31
      at async Context.<anonymous> (test\test.js:33:9)



npm ERR! Test failed.  See above for more details.

Solution

  • Just realized I should be using initializeTestApp not initializeAdminApp