From 88ad6fc6d20364f9c6c471a1769ab432ec9f084e Mon Sep 17 00:00:00 2001 From: Raul Gomez Date: Sat, 20 Jul 2019 13:29:35 +0100 Subject: [PATCH] Using lean core package from react-native-community + fixing tests --- __mocks__/@react-native-community/netinfo.js | 11 ++++ package.json | 3 +- src/components/NetworkConnectivity.js | 3 +- src/redux/sagas.js | 3 +- src/utils/checkInternetConnection.js | 2 +- test/NetworkConnectivity.test.js | 37 +++++------- test/checkInternetConnection.test.js | 5 +- test/sagaChannels.test.js | 4 +- test/sagas.test.js | 3 +- test/setupTestEnv.js | 9 ++- yarn.lock | 61 +++++++++++++++----- 11 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 __mocks__/@react-native-community/netinfo.js diff --git a/__mocks__/@react-native-community/netinfo.js b/__mocks__/@react-native-community/netinfo.js new file mode 100644 index 00000000..ca3bace7 --- /dev/null +++ b/__mocks__/@react-native-community/netinfo.js @@ -0,0 +1,11 @@ +export default { + getCurrentConnectivity: jest.fn(), + isConnectionMetered: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), + isConnected: { + fetch: jest.fn(() => Promise.resolve(true)), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + }, +}; diff --git a/package.json b/package.json index 0c12a39b..b6d5076e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-offline", - "version": "4.3.2", + "version": "5.0.0", "description": "Handy toolbelt to deal with offline mode in React Native applications. Cross-platform, provides a smooth redux integration.", "main": "./src/index.js", "author": "Raul Gomez Acuña (https://github.com/rgommezz)", @@ -69,6 +69,7 @@ "redux-thunk": "^2.3.0" }, "dependencies": { + "@react-native-community/netinfo": "^4.1.2", "lodash": "^4.17.11", "react-redux": "^6.0.0 || ^7.0.0", "redux": "4.x", diff --git a/src/components/NetworkConnectivity.js b/src/components/NetworkConnectivity.js index d4e34536..b943be42 100644 --- a/src/components/NetworkConnectivity.js +++ b/src/components/NetworkConnectivity.js @@ -1,6 +1,7 @@ /* @flow */ import * as React from 'react'; -import { AppState, NetInfo, Platform } from 'react-native'; +import { AppState, Platform } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import type { HTTPMethod, State } from '../types'; import * as connectivityInterval from '../utils/checkConnectivityInterval'; import checkInternetAccess from '../utils/checkInternetAccess'; diff --git a/src/redux/sagas.js b/src/redux/sagas.js index 8958ea9b..d6db5dd9 100644 --- a/src/redux/sagas.js +++ b/src/redux/sagas.js @@ -2,7 +2,8 @@ /* eslint flowtype/require-parameter-type: 0 */ import { put, select, call, take, cancelled, fork } from 'redux-saga/effects'; import { eventChannel } from 'redux-saga'; -import { AppState, NetInfo, Platform } from 'react-native'; +import { AppState, Platform } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import { networkSelector } from './reducer'; import checkInternetAccess from '../utils/checkInternetAccess'; import { connectionChange } from './actionCreators'; diff --git a/src/utils/checkInternetConnection.js b/src/utils/checkInternetConnection.js index 715eab2c..8fccd3f1 100644 --- a/src/utils/checkInternetConnection.js +++ b/src/utils/checkInternetConnection.js @@ -1,6 +1,6 @@ /* @flow */ -import { NetInfo } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import checkInternetAccess from './checkInternetAccess'; import { DEFAULT_PING_SERVER_URL, DEFAULT_TIMEOUT } from './constants'; diff --git a/test/NetworkConnectivity.test.js b/test/NetworkConnectivity.test.js index f1c93de0..5ce7e16f 100644 --- a/test/NetworkConnectivity.test.js +++ b/test/NetworkConnectivity.test.js @@ -1,5 +1,6 @@ /* @flow */ import * as React from 'react'; +import NetInfo from '@react-native-community/netinfo'; import { View, Platform, AppState } from 'react-native'; import { shallow } from 'enzyme'; import { render } from 'react-native-testing-library'; @@ -13,9 +14,6 @@ type MethodsMap = { [string]: Function, }; -const mockAddEventListener = jest.fn(); -const mockRemoveEventListener = jest.fn(); -const mockFetch = jest.fn(() => false); const mockConnectionChangeHandler = jest.fn(); const mockGetConnectionChangeHandler = jest.fn( () => mockConnectionChangeHandler, @@ -25,14 +23,6 @@ const mockHandleNetInfoChange = jest.fn(); const mockHandleConnectivityChange = jest.fn(); const mockCheckInternet = jest.fn(); -jest.mock('NetInfo', () => ({ - isConnected: { - addEventListener: mockAddEventListener, - removeEventListener: mockRemoveEventListener, - fetch: mockFetch, - }, -})); - jest.mock('../src/utils/checkConnectivityInterval'); jest.mock('../src/utils/checkInternetAccess', () => jest.fn().mockResolvedValue(true), @@ -75,9 +65,9 @@ const getElement = ({ describe('NetworkConnectivity', () => { afterEach(() => { - mockAddEventListener.mockClear(); - mockRemoveEventListener.mockClear(); - mockFetch.mockClear(); + NetInfo.isConnected.addEventListener.mockClear(); + NetInfo.isConnected.removeEventListener.mockClear(); + NetInfo.isConnected.fetch.mockClear(); mockConnectionChangeHandler.mockClear(); mockGetConnectionChangeHandler.mockClear(); mockIntervalHandler.mockClear(); @@ -109,8 +99,8 @@ describe('NetworkConnectivity', () => { Component: MockedNetworkConnectivity, }), ); - expect(mockAddEventListener).toHaveBeenCalledTimes(1); - expect(mockAddEventListener).toHaveBeenCalledWith( + expect(NetInfo.isConnected.addEventListener).toHaveBeenCalledTimes(1); + expect(NetInfo.isConnected.addEventListener).toHaveBeenCalledWith( 'connectionChange', mockConnectionChangeHandler, ); @@ -123,6 +113,9 @@ describe('NetworkConnectivity', () => { AND fetches initial connection AND calls the handler AND does NOT call setupConnectivityCheckInterval`, (done: Function) => { + NetInfo.isConnected.fetch.mockImplementationOnce(() => + Promise.resolve(false), + ); Platform.OS = 'android'; const MockedNetworkConnectivity = mockPrototypeMethods({ getConnectionChangeHandler: mockGetConnectionChangeHandler, @@ -132,12 +125,12 @@ describe('NetworkConnectivity', () => { Component: MockedNetworkConnectivity, }), ); - expect(mockAddEventListener).toHaveBeenCalledTimes(1); - expect(mockAddEventListener).toHaveBeenCalledWith( + expect(NetInfo.isConnected.addEventListener).toHaveBeenCalledTimes(1); + expect(NetInfo.isConnected.addEventListener).toHaveBeenCalledWith( 'connectionChange', mockConnectionChangeHandler, ); - expect(mockFetch).toHaveBeenCalledTimes(1); + expect(NetInfo.isConnected.fetch).toHaveBeenCalledTimes(1); process.nextTick(() => { expect(mockConnectionChangeHandler).toHaveBeenCalledWith(false); expect(setup).not.toHaveBeenCalled(); @@ -177,8 +170,8 @@ describe('NetworkConnectivity', () => { }), ); wrapper.unmount(); - expect(mockRemoveEventListener).toHaveBeenCalledTimes(1); - expect(mockRemoveEventListener).toHaveBeenCalledWith( + expect(NetInfo.isConnected.removeEventListener).toHaveBeenCalledTimes(1); + expect(NetInfo.isConnected.removeEventListener).toHaveBeenCalledWith( 'connectionChange', mockConnectionChangeHandler, ); @@ -344,7 +337,7 @@ describe('NetworkConnectivity', () => { wrapper.setProps({ pingServerUrl: 'https://newServerToPing.com' }); expect(mockCheckInternet).toHaveBeenCalled(); }); - }) + }); describe('props validation', () => { it('throws if prop pingTimeout is not a number', () => { diff --git a/test/checkInternetConnection.test.js b/test/checkInternetConnection.test.js index 01b54f79..eda8592e 100644 --- a/test/checkInternetConnection.test.js +++ b/test/checkInternetConnection.test.js @@ -1,4 +1,4 @@ -import { NetInfo } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import checkInternetConnection from '../src/utils/checkInternetConnection'; import checkInternetAccess from '../src/utils/checkInternetAccess'; import { @@ -16,9 +16,6 @@ describe('checkInternetConnection', () => { }); describe('shouldPing = true', () => { it(`calls checkInternetAccess and resolves the promise with its returned value`, async () => { - NetInfo.isConnected.fetch.mockImplementationOnce(() => - Promise.resolve(true), - ); const isConnected = await checkInternetConnection('foo.com', 3000, true); expect(checkInternetAccess).toHaveBeenCalledWith({ timeout: 3000, diff --git a/test/sagaChannels.test.js b/test/sagaChannels.test.js index f30f430c..5d23cd1e 100644 --- a/test/sagaChannels.test.js +++ b/test/sagaChannels.test.js @@ -1,5 +1,5 @@ import { eventChannel } from 'redux-saga'; -import { NetInfo } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import { createNetInfoConnectionChangeChannel, netInfoEventChannelFn, @@ -8,7 +8,7 @@ import { } from '../src/redux/sagas'; jest.mock('redux-saga'); -jest.mock('NetInfo'); +jest.mock('@react-native-community/netinfo'); describe('createNetInfoConnectionChangeChannel', () => { it('returns a redux-saga channel', () => { diff --git a/test/sagas.test.js b/test/sagas.test.js index 4129b81f..3ee2ca51 100644 --- a/test/sagas.test.js +++ b/test/sagas.test.js @@ -1,6 +1,7 @@ /* @flow */ import { testSaga } from 'redux-saga-test-plan'; -import { Platform, NetInfo, AppState } from 'react-native'; +import { Platform, AppState } from 'react-native'; +import NetInfo from '@react-native-community/netinfo'; import networkSaga, { netInfoChangeSaga, connectionIntervalSaga, diff --git a/test/setupTestEnv.js b/test/setupTestEnv.js index 9f514066..9d9a8e01 100644 --- a/test/setupTestEnv.js +++ b/test/setupTestEnv.js @@ -1,9 +1,16 @@ import React from 'react'; -import 'react-native'; +import { NativeModules } from 'react-native'; import 'jest-enzyme'; import Adapter from 'enzyme-adapter-react-16'; import Enzyme from 'enzyme'; +// Mocking the NetInfo native module +NativeModules.RNCNetInfo = { + getCurrentState: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), +}; + /** * Set up DOM in node.js environment for Enzyme to mount to */ diff --git a/yarn.lock b/yarn.lock index a5c5395b..79fcee50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -607,13 +607,20 @@ pirates "^4.0.0" source-map-support "^0.5.9" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.2.0": +"@babel/runtime@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.4.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" + integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -647,6 +654,11 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@react-native-community/netinfo@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-4.1.2.tgz#006c1c60e29918a47d3da786b28837b7aa15684f" + integrity sha512-3lW3Zv0V/Q14y5mNBa5ZcDfwTDZzivudPrQjY2awJFN8arw23AVe+dJual1VLny5fNXnWhaKPFHT6YYgs30k8w== + "@redux-saga/core@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.0.2.tgz#4336a5bb4253e5ca69681c25a863fbbc03ea6d88" @@ -3500,12 +3512,12 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -hoist-non-react-statics@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" - integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== +hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== dependencies: - react-is "^16.3.2" + react-is "^16.7.0" home-or-tmp@^2.0.0: version "2.0.0" @@ -5921,6 +5933,15 @@ prop-types@^15.5.8, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -6019,11 +6040,16 @@ react-dom@^16.6.3: prop-types "^15.6.2" scheduler "^0.12.0" -react-is@^16.3.2, react-is@^16.6.1, react-is@^16.6.3, react-is@^16.7.0: +react-is@^16.6.1, react-is@^16.7.0: version "16.7.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== +react-is@^16.8.1, react-is@^16.8.6: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + react-native-testing-library@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/react-native-testing-library/-/react-native-testing-library-1.5.0.tgz#02762bf8cb5c1295a220d5e5d40ffc2ebecf31da" @@ -6096,17 +6122,17 @@ react-proxy@^1.1.7: lodash "^4.6.1" react-deep-force-update "^1.0.0" -react-redux@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz#09e86eeed5febb98e9442458ad2970c8f1a173ef" - integrity sha512-EmbC3uLl60pw2VqSSkj6HpZ6jTk12RMrwXMBdYtM6niq0MdEaRq9KYCwpJflkOZj349BLGQm1MI/JO1W96kLWQ== +"react-redux@^6.0.0 || ^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.0.tgz#72af7cf490a74acdc516ea9c1dd80e25af9ea0b2" + integrity sha512-hyu/PoFK3vZgdLTg9ozbt7WF3GgX5+Yn3pZm5/96/o4UueXA+zj08aiSC9Mfj2WtD1bvpIb3C5yvskzZySzzaw== dependencies: - "@babel/runtime" "^7.2.0" - hoist-non-react-statics "^3.2.1" + "@babel/runtime" "^7.4.5" + hoist-non-react-statics "^3.3.0" invariant "^2.2.4" loose-envify "^1.4.0" - prop-types "^15.6.2" - react-is "^16.6.3" + prop-types "^15.7.2" + react-is "^16.8.6" react-test-renderer@^16.0.0-0, react-test-renderer@^16.6.3: version "16.7.0" @@ -6275,6 +6301,11 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"