Skip to content

Commit

Permalink
Add tests for Geolocation module (#23987)
Browse files Browse the repository at this point in the history
Summary:
This PR adds a number of unit tests for the Geolocation module, as a follow-up of #23903. I also added two missing documentation strings to that module, with references to the online documentation, for consistency with the other methods in the same module.

Not applicable, since it only adds tests.
Pull Request resolved: #23987

Differential Revision: D14502848

Pulled By: cpojer

fbshipit-source-id: 8f7c1cee6be3fae081d9770e5e942fadda65e6c2
  • Loading branch information
Georgios Andreadis authored and facebook-github-bot committed Mar 18, 2019
1 parent cc3f9a7 commit 6047d42
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 1 deletion.
12 changes: 11 additions & 1 deletion Libraries/Geolocation/Geolocation.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const Geolocation = {
},

/*
* Request suitable Location permission based on the key configured on pList.
* Requests Location permissions based on the key configured on pList.
*
* See https://facebook.github.io/react-native/docs/geolocation.html#requestauthorization
*/
Expand Down Expand Up @@ -126,6 +126,11 @@ const Geolocation = {
return watchID;
},

/*
* Unsubscribes the watcher with the given watchID.
*
* See https://facebook.github.io/react-native/docs/geolocation.html#clearwatch
*/
clearWatch: function(watchID: number) {
const sub = subscriptions[watchID];
if (!sub) {
Expand All @@ -150,6 +155,11 @@ const Geolocation = {
}
},

/*
* Stops observing for device location changes and removes all registered listeners.
*
* See https://facebook.github.io/react-native/docs/geolocation.html#stopobserving
*/
stopObserving: function() {
if (updatesEnabled) {
RCTLocationObserver.stopObserving();
Expand Down
102 changes: 102 additions & 0 deletions Libraries/Geolocation/__tests__/Geolocation-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @emails oncall+react_native
*/

'use strict';

describe('Geolocation', () => {
let Geolocation;
const NativeModules = require('NativeModules');

beforeEach(() => {
jest.resetModules();
Geolocation = jest.requireActual('Geolocation');
});

afterEach(() => {
jest.clearAllMocks();
});

it('should set the location observer configuration', () => {
Geolocation.setRNConfiguration({skipPermissionRequests: true});
expect(
NativeModules.LocationObserver.setConfiguration.mock.calls.length,
).toEqual(1);
});

it('should request authorization for location requests', () => {
Geolocation.requestAuthorization();
expect(
NativeModules.LocationObserver.requestAuthorization.mock.calls.length,
).toEqual(1);
});

it('should get the current position and pass it to the given callback', () => {
const callback = () => {};
Geolocation.getCurrentPosition(callback);
expect(
NativeModules.LocationObserver.getCurrentPosition.mock.calls.length,
).toEqual(1);
expect(
NativeModules.LocationObserver.getCurrentPosition.mock.calls[0][1],
).toBe(callback);
});

it('should add a success listener to the geolocation', () => {
const watchID = Geolocation.watchPosition(() => {});
expect(watchID).toEqual(0);
expect(NativeModules.LocationObserver.addListener.mock.calls[0][0]).toBe(
'geolocationDidChange',
);
});

it('should add an error listener to the geolocation', () => {
const watchID = Geolocation.watchPosition(() => {}, () => {});
expect(watchID).toEqual(0);
expect(NativeModules.LocationObserver.addListener.mock.calls[1][0]).toBe(
'geolocationError',
);
});

it('should clear the listeners associated with a watchID', () => {
const watchID = Geolocation.watchPosition(() => {}, () => {});
Geolocation.clearWatch(watchID);
expect(NativeModules.LocationObserver.stopObserving.mock.calls.length).toBe(
1,
);
});

it('should correctly assess if all listeners have been cleared', () => {
const watchID = Geolocation.watchPosition(() => {}, () => {});
Geolocation.watchPosition(() => {}, () => {});
Geolocation.clearWatch(watchID);
expect(NativeModules.LocationObserver.stopObserving.mock.calls.length).toBe(
0,
);
});

it('should not fail if the watchID one wants to clear does not exist', () => {
Geolocation.watchPosition(() => {}, () => {});
Geolocation.clearWatch(42);
expect(NativeModules.LocationObserver.stopObserving.mock.calls.length).toBe(
0,
);
});

it('should stop observing and warn about removing existing subscriptions', () => {
const warningCallback = jest.fn();
jest.mock('fbjs/lib/warning', () => warningCallback);
Geolocation.watchPosition(() => {}, () => {});
Geolocation.stopObserving();
expect(NativeModules.LocationObserver.stopObserving.mock.calls.length).toBe(
1,
);
expect(warningCallback.mock.calls.length).toBeGreaterThanOrEqual(1);
});
});
4 changes: 4 additions & 0 deletions jest/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,11 @@ const mockNativeModules = {
sendIntent: jest.fn(),
},
LocationObserver: {
addListener: jest.fn(),
getCurrentPosition: jest.fn(),
removeListeners: jest.fn(),
requestAuthorization: jest.fn(),
setConfiguration: jest.fn(),
startObserving: jest.fn(),
stopObserving: jest.fn(),
},
Expand Down

0 comments on commit 6047d42

Please sign in to comment.