Skip to content

Commit 1d3e946

Browse files
committed
feat(storage, emulator): implement storage emulator
1 parent 69b6f88 commit 1d3e946

File tree

12 files changed

+339
-117
lines changed

12 files changed

+339
-117
lines changed

jest.setup.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ jest.doMock('react-native', () => {
4949
settings: jest.fn(),
5050
},
5151
RNFBPerfModule: {},
52+
RNFBStorageModule: {
53+
useEmulator: jest.fn(),
54+
},
5255
},
5356
},
5457
ReactNative,

packages/app/lib/internal/constants.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ export const APP_NATIVE_MODULE = 'RNFBAppModule';
2020
export const DEFAULT_APP_NAME = '[DEFAULT]';
2121

2222
export const KNOWN_NAMESPACES = [
23-
'admob',
2423
'auth',
2524
'analytics',
2625
'remoteConfig',
@@ -29,7 +28,6 @@ export const KNOWN_NAMESPACES = [
2928
'inAppMessaging',
3029
'firestore',
3130
'functions',
32-
'iid',
3331
'indexing',
3432
'storage',
3533
'dynamicLinks',
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import storage, { firebase } from '../lib';
2+
3+
describe('Storage', function () {
4+
describe('namespace', function () {
5+
it('accessible from firebase.app()', function () {
6+
const app = firebase.app();
7+
expect(app.storage).toBeDefined();
8+
expect(app.storage().useEmulator).toBeDefined();
9+
});
10+
});
11+
12+
describe('useEmulator()', function () {
13+
it('useEmulator requires a string host', function () {
14+
// @ts-ignore because we pass an invalid argument...
15+
expect(() => storage().useEmulator()).toThrow(
16+
'firebase.storage().useEmulator() takes a non-empty host',
17+
);
18+
expect(() => storage().useEmulator('', -1)).toThrow(
19+
'firebase.storage().useEmulator() takes a non-empty host',
20+
);
21+
// @ts-ignore because we pass an invalid argument...
22+
expect(() => storage().useEmulator(123)).toThrow(
23+
'firebase.storage().useEmulator() takes a non-empty host',
24+
);
25+
});
26+
27+
it('useEmulator requires a host and port', function () {
28+
expect(() => storage().useEmulator('', 9000)).toThrow(
29+
'firebase.storage().useEmulator() takes a non-empty host and port',
30+
);
31+
// No port
32+
// @ts-ignore because we pass an invalid argument...
33+
expect(() => storage().useEmulator('localhost')).toThrow(
34+
'firebase.storage().useEmulator() takes a non-empty host and port',
35+
);
36+
});
37+
38+
it('useEmulator -> remaps Android loopback to host', function () {
39+
const foo = storage().useEmulator('localhost', 9000);
40+
expect(foo).toEqual(['10.0.2.2', 9000]);
41+
42+
const bar = storage().useEmulator('127.0.0.1', 9000);
43+
expect(bar).toEqual(['10.0.2.2', 9000]);
44+
});
45+
});
46+
});

packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStorageModule.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,17 @@ public void setMaxUploadRetryTime(String appName, double milliseconds, Promise p
224224
promise.resolve(null);
225225
}
226226

227+
/**
228+
* @link https://firebase.google.com/docs/reference/js/firebase.storage.Storage#useEmulator
229+
*/
230+
@ReactMethod
231+
public void useEmulator(String appName, String host, int port, Promise promise) {
232+
FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
233+
FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp);
234+
firebaseStorage.useEmulator(host, port);
235+
promise.resolve(null);
236+
}
237+
227238
/**
228239
* @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#writeToFile
229240
*/

0 commit comments

Comments
 (0)