xref: /expo/apps/test-suite/tests/FirebaseJSSDK.js (revision bb8f4f99)
1import * as FileSystem from 'expo-file-system';
2import firebase from 'firebase';
3import 'firebase/auth';
4import 'firebase/database';
5import 'firebase/firestore';
6import 'firebase/functions';
7import 'firebase/storage';
8
9// The modules below require browser features and are not compatible within the react-native context.
10// import "firebase/analytics";
11// import "firebase/remote-config";
12// import "firebase/messaging";
13// import "firebase/performance";
14// import "firebase/installations";
15
16import { expectMethodToThrowAsync } from '../TestUtils';
17
18export const name = 'FirebaseJSSDK';
19
20const FIREBASE_CONFIG = {
21  apiKey: 'AIzaSyD2gZuX5utrLBAdJoMrAdrMW7Sv9xQ5uBE',
22  authDomain: 'expo-payments.firebaseapp.com',
23  databaseURL: 'https://expo-payments.firebaseio.com',
24  projectId: 'expo-payments',
25  storageBucket: 'expo-payments.appspot.com',
26  messagingSenderId: '482324271988',
27  appId: '1:482324271988:web:9597460d096749b3f8d221',
28  measurementId: 'G-498KQSTM5G',
29};
30
31export async function test({ describe, it, expect, beforeAll }) {
32  beforeAll(() => {
33    try {
34      firebase.initializeApp(FIREBASE_CONFIG);
35    } catch (err) {
36      // nop
37    }
38  });
39
40  describe('FirebaseJSSDK', async () => {
41    describe('auth', async () => {
42      it(`calls auth() succesfully`, () => {
43        firebase.auth();
44      });
45      it(`returns correct sign-in error`, async () => {
46        const error = await expectMethodToThrowAsync(() =>
47          firebase.auth().signInWithEmailAndPassword('[email protected]', '0')
48        );
49        expect(error.code).toBe('auth/operation-not-allowed');
50      });
51    });
52
53    describe('database', async () => {
54      it(`calls database() succesfully`, () => {
55        const db = firebase.database();
56        expect(db).not.toBeNull();
57      });
58      it(`reads data once`, async () => {
59        let error = null;
60        try {
61          const snapshot = await firebase
62            .database()
63            .ref('/test1')
64            .once('value');
65          expect(snapshot.val()).toBe('foobar');
66        } catch (e) {
67          error = e;
68        }
69        expect(error).toBeNull();
70      });
71    });
72
73    describe('firestore', async () => {
74      it(`calls firestore() succesfully`, () => {
75        const db = firebase.firestore();
76        expect(db).not.toBeNull();
77      });
78      it(`gets a collection`, async () => {
79        let error = null;
80        try {
81          const { docs } = await firebase
82            .firestore()
83            .collection('tests')
84            .get();
85          expect(docs.length).toBeGreaterThan(0);
86        } catch (e) {
87          error = e;
88        }
89        expect(error).toBeNull();
90      });
91      it(`gets a document`, async () => {
92        let error = null;
93        try {
94          const snapshot = await firebase
95            .firestore()
96            .doc('tests/doc1')
97            .get();
98          expect(snapshot).not.toBeNull();
99        } catch (e) {
100          error = e;
101        }
102        expect(error).toBeNull();
103      });
104    });
105
106    describe('functions', async () => {
107      it(`calls functions() succesfully`, () => {
108        const functions = firebase.functions();
109        expect(functions).not.toBeNull();
110      });
111      it(`calls the echo function`, async () => {
112        let error = null;
113        try {
114          const message = "I'm a unit test";
115          const echoMessage = firebase.functions().httpsCallable('echoMessage');
116          const response = await echoMessage({ message });
117          const responseMessage = response.data.message;
118          expect(responseMessage).toBe(`Hi ��, you said: ${message}`);
119        } catch (e) {
120          error = e;
121        }
122        expect(error).toBeNull();
123      });
124    });
125
126    describe('storage', () => {
127      it(`calls storage() succesfully`, () => {
128        const storage = firebase.storage();
129        expect(storage).not.toBeNull();
130      });
131      it(`lists all files`, async () => {
132        let error = null;
133        try {
134          const files = await firebase
135            .storage()
136            .ref('public')
137            .listAll();
138          expect(files.items.length).toBeGreaterThan(0);
139        } catch (e) {
140          error = e;
141        }
142        expect(error).toBeNull();
143      });
144      it(`downloads a file`, async () => {
145        let error = null;
146        try {
147          const files = await firebase
148            .storage()
149            .ref('public')
150            .listAll();
151          expect(files.items.length).toBeGreaterThan(0);
152          const file = files.items[0];
153          const downloadUrl = await file.getDownloadURL();
154          expect(typeof downloadUrl).toBe('string');
155          const startUrl = 'https://firebasestorage.googleapis.com';
156          expect(downloadUrl.substring(0, startUrl.length)).toBe(startUrl);
157          const { uri } = await FileSystem.downloadAsync(
158            downloadUrl,
159            FileSystem.documentDirectory + file.name
160          );
161          expect(typeof uri).toBe('string');
162          expect(uri).not.toBeNull();
163        } catch (e) {
164          error = e;
165        }
166        expect(error).toBeNull();
167      });
168      /* it(`upload a file`, async () => {
169        let error = null;
170        try {
171          // REQUIRES AUTH
172          const currentUser = firebase.auth ? firebase.auth().currentUser : undefined;
173          // const suffix = new Date().toISOString().replace(/\D/g, '');
174          const fileContent = new ArrayBuffer(1000);
175          const ref = firebase
176            .storage()
177            .ref(`users/${currentUser.uid}`)
178            .child(`unittest`);
179          // @ts-ignore
180          const uploadTask = ref.put(fileContent);
181          await new Promise((resolve, reject) => {
182            uploadTask.on(
183              firebase.storage.TaskEvent.STATE_CHANGED,
184              snapshot => {},
185              reject,
186              resolve
187            );
188          });
189        } catch (e) {
190          error = e;
191        }
192        expect(error).toBeNull();
193      });*/
194    });
195  });
196}
197