Continuous Integration tests with Github Action on Firebase Emulator Suite
$ npm i --save @nhogs/nestjs-firebase
First you need to have a running firebase project. See Add Firebase to your JavaScript project
Add the module in app imports with project settings
@Module({
imports: [
FirebaseModule.forRoot({
apiKey: "API_KEY",
authDomain: "PROJECT_ID.firebaseapp.com",
projectId: "PROJECT_ID",
storageBucket: "PROJECT_ID.appspot.com",
// Optional name of the app to initialize. Custom name for the Firebase App. The default value is "[DEFAULT]"
// appName: "APP_NAME",
}),
CatsModule,
],
})
export class AppModule {}
Check here for an e2e test with real example on Cat module
This module is a simple wrapper on Firebase API and export 3 services.
- Cloud Firestore
- Storage
- Authentication
Exposes most of Firebase firestore web api in the service.
// Add document example
it("should addDoc", async () => {
const users =
firestoreService.collection("users").withConverter < User > userConverter;
const doc = (await firestoreService.addDoc) < User > (users, u1);
const snapshot = await firestoreService.getDoc(doc);
expect(snapshot.data()).toMatchInlineSnapshot(`
User {
"age": 1,
"firstName": "fn1",
"lastName": "ln1",
}
`);
});
See firestore.service.spec.ts for detailed usage.
Exposes most of Firebase storage web api in the service.
// Upload string and get download url example
it(`should upload string`, async () => {
const fileName = "file.txt";
await storageService
.uploadString(fileName, "text content", "raw", {
contentType: "text/plain",
})
.then((snapshot) => {
expect(snapshot.metadata.contentType).toMatchInlineSnapshot(
`"text/plain"`
);
});
const downloadUrl = await storageService.getDownloadURL(fileName);
expect(downloadUrl).toMatchInlineSnapshot(
`"http://localhost:9199/v0/b/default-bucket/o/file.txt?alt=media&token=86739ce5-a96e-41ad-b807-e05b12e36516"`
);
});
See storage.service.spec.ts for detailed usage.
See auth.service.spec.ts for detailed usage.