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