Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Buffer } from 'buffer';
import React from 'react';
import { YStack } from 'tamagui';

import AppNavigation from './src/Navigation';
import AppNavigation from './src/navigation';
import { initSentry, wrapWithSentry } from './src/Sentry';
import { AuthProvider } from './src/stores/authProvider';
import { DatabaseProvider } from './src/stores/databaseProvider';
Expand Down
10 changes: 10 additions & 0 deletions app/jest.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
module.exports = {
preset: 'react-native',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
transformIgnorePatterns: [
'node_modules/(?!(react-native|@react-native|@react-navigation|@react-native-community|@segment/analytics-react-native|@openpassport|react-native-keychain|react-native-check-version|react-native-nfc-manager|react-native-passport-reader|uuid|@stablelib|@react-native-google-signin|react-native-cloud-storage|@react-native-clipboard)/)',
],
setupFiles: ['<rootDir>/jest.setup.js'],
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$',
moduleNameMapper: {
'^@env$': '<rootDir>/tests/__setup__/@env.js',
'^@openpassport/(.*)$': '<rootDir>/../common/node_modules/@openpassport/$1',
},
};
263 changes: 263 additions & 0 deletions app/jest.setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
/* global jest */
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need all these react native mocks for the navigation test to pass

/** @jest-environment jsdom */
require('react-native-gesture-handler/jestSetup');

jest.mock('react-native-reanimated', () => {
const Reanimated = require('react-native-reanimated/mock');
Reanimated.default.call = () => {};
return Reanimated;
});

jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper');

// Mock react-native-haptic-feedback
jest.mock('react-native-haptic-feedback', () => ({
trigger: jest.fn(),
}));

// Mock Segment Analytics
jest.mock('@segment/analytics-react-native', () => {
const mockClient = {
add: jest.fn(),
track: jest.fn(),
identify: jest.fn(),
screen: jest.fn(),
group: jest.fn(),
alias: jest.fn(),
reset: jest.fn(),
};

return {
createClient: jest.fn(() => mockClient),
EventPlugin: jest.fn(),
PluginType: {
ENRICHMENT: 'enrichment',
DESTINATION: 'destination',
BEFORE: 'before',
},
};
});

// Mock react-native-keychain
jest.mock('react-native-keychain', () => ({
SECURITY_LEVEL_ANY: 'MOCK_SECURITY_LEVEL_ANY',
SECURITY_LEVEL_SECURE_SOFTWARE: 'MOCK_SECURITY_LEVEL_SECURE_SOFTWARE',
SECURITY_LEVEL_SECURE_HARDWARE: 'MOCK_SECURITY_LEVEL_SECURE_HARDWARE',
setGenericPassword: jest.fn(),
getGenericPassword: jest.fn(),
resetGenericPassword: jest.fn(),
ACCESSIBLE: {
WHEN_UNLOCKED: 'AccessibleWhenUnlocked',
AFTER_FIRST_UNLOCK: 'AccessibleAfterFirstUnlock',
ALWAYS: 'AccessibleAlways',
WHEN_PASSCODE_SET_THIS_DEVICE_ONLY:
'AccessibleWhenPasscodeSetThisDeviceOnly',
WHEN_UNLOCKED_THIS_DEVICE_ONLY: 'AccessibleWhenUnlockedThisDeviceOnly',
AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY:
'AccessibleAfterFirstUnlockThisDeviceOnly',
ALWAYS_THIS_DEVICE_ONLY: 'AccessibleAlwaysThisDeviceOnly',
},
ACCESS_CONTROL: {
USER_PRESENCE: 'UserPresence',
BIOMETRY_ANY: 'BiometryAny',
BIOMETRY_CURRENT_SET: 'BiometryCurrentSet',
DEVICE_PASSCODE: 'DevicePasscode',
APPLICATION_PASSWORD: 'ApplicationPassword',
BIOMETRY_ANY_OR_DEVICE_PASSCODE: 'BiometryAnyOrDevicePasscode',
BIOMETRY_CURRENT_SET_OR_DEVICE_PASSCODE:
'BiometryCurrentSetOrDevicePasscode',
},
}));

// Mock AsyncStorage
jest.mock('@react-native-async-storage/async-storage', () => ({
setItem: jest.fn(),
getItem: jest.fn(),
removeItem: jest.fn(),
mergeItem: jest.fn(),
clear: jest.fn(),
getAllKeys: jest.fn(),
flushGetRequests: jest.fn(),
multiGet: jest.fn(),
multiSet: jest.fn(),
multiRemove: jest.fn(),
multiMerge: jest.fn(),
}));

// Mock react-native-check-version
jest.mock('react-native-check-version', () => ({
checkVersion: jest.fn().mockResolvedValue({
needsUpdate: false,
currentVersion: '1.0.0',
latestVersion: '1.0.0',
}),
}));

// Mock @react-native-community/netinfo
jest.mock('@react-native-community/netinfo', () => ({
addEventListener: jest.fn(),
useNetInfo: jest.fn().mockReturnValue({
type: 'wifi',
isConnected: true,
isInternetReachable: true,
details: {
isConnectionExpensive: false,
cellularGeneration: '4g',
},
}),
fetch: jest.fn(),
}));

// Mock react-native-nfc-manager
jest.mock('react-native-nfc-manager', () => ({
start: jest.fn(),
isSupported: jest.fn().mockResolvedValue(true),
isEnabled: jest.fn().mockResolvedValue(true),
registerTagEvent: jest.fn(),
unregisterTagEvent: jest.fn(),
requestTechnology: jest.fn(),
cancelTechnologyRequest: jest.fn(),
getTag: jest.fn(),
setAlertMessage: jest.fn(),
sendMifareCommand: jest.fn(),
sendCommandAPDU: jest.fn(),
transceive: jest.fn(),
getMaxTransceiveLength: jest.fn(),
setTimeout: jest.fn(),
connect: jest.fn(),
close: jest.fn(),
cleanUpTag: jest.fn(),
default: {
start: jest.fn(),
isSupported: jest.fn().mockResolvedValue(true),
isEnabled: jest.fn().mockResolvedValue(true),
registerTagEvent: jest.fn(),
unregisterTagEvent: jest.fn(),
requestTechnology: jest.fn(),
cancelTechnologyRequest: jest.fn(),
getTag: jest.fn(),
setAlertMessage: jest.fn(),
sendMifareCommand: jest.fn(),
sendCommandAPDU: jest.fn(),
transceive: jest.fn(),
getMaxTransceiveLength: jest.fn(),
setTimeout: jest.fn(),
connect: jest.fn(),
close: jest.fn(),
cleanUpTag: jest.fn(),
},
}));

// Mock react-native-passport-reader
jest.mock('react-native-passport-reader', () => ({
default: {
initialize: jest.fn(),
scanPassport: jest.fn(),
readPassport: jest.fn(),
cancelPassportRead: jest.fn(),
},
}));

// Mock @stablelib packages
jest.mock('@stablelib/cbor', () => ({
encode: jest.fn(),
decode: jest.fn(),
}));

jest.mock('@stablelib/utf8', () => ({
encode: jest.fn(),
decode: jest.fn(),
}));

// Mock @react-native-google-signin/google-signin
jest.mock('@react-native-google-signin/google-signin', () => ({
GoogleSignin: {
configure: jest.fn(),
hasPlayServices: jest.fn().mockResolvedValue(true),
signIn: jest.fn().mockResolvedValue({
user: {
id: 'mock-user-id',
email: '[email protected]',
name: 'Mock User',
photo: 'mock-photo-url',
},
}),
signOut: jest.fn(),
revokeAccess: jest.fn(),
isSignedIn: jest.fn().mockResolvedValue(false),
getCurrentUser: jest.fn().mockResolvedValue(null),
getTokens: jest.fn().mockResolvedValue({
accessToken: 'mock-access-token',
idToken: 'mock-id-token',
}),
},
statusCodes: {
SIGN_IN_REQUIRED: 'SIGN_IN_REQUIRED',
IN_PROGRESS: 'IN_PROGRESS',
PLAY_SERVICES_NOT_AVAILABLE: 'PLAY_SERVICES_NOT_AVAILABLE',
},
}));

// Mock react-native-cloud-storage
jest.mock('react-native-cloud-storage', () => {
const mockCloudStorage = {
setProviderOptions: jest.fn(),
isCloudAvailable: jest.fn().mockResolvedValue(true),
createFolder: jest.fn(),
deleteFolder: jest.fn(),
listFiles: jest.fn(),
readFile: jest.fn(),
writeFile: jest.fn(),
deleteFile: jest.fn(),
getFileInfo: jest.fn(),
getStorageInfo: jest.fn(),
getProvider: jest.fn(),
mkdir: jest.fn(),
exists: jest.fn(),
rmdir: jest.fn(),
};

return {
__esModule: true,
CloudStorage: mockCloudStorage,
CloudStorageScope: {
AppData: 'AppData',
Documents: 'Documents',
Full: 'Full',
},
CloudStorageProvider: {
GoogleDrive: 'GoogleDrive',
ICloud: 'ICloud',
},
};
});

// Mock @react-native-clipboard/clipboard
jest.mock('@react-native-clipboard/clipboard', () => ({
getString: jest.fn().mockResolvedValue(''),
setString: jest.fn(),
hasString: jest.fn().mockResolvedValue(false),
}));

// Mock react-native-localize
jest.mock('react-native-localize', () => ({
getLocales: jest.fn().mockReturnValue([
{
countryCode: 'US',
languageTag: 'en-US',
languageCode: 'en',
isRTL: false,
},
]),
getCountry: jest.fn().mockReturnValue('US'),
getTimeZone: jest.fn().mockReturnValue('America/New_York'),
getCurrencies: jest.fn().mockReturnValue(['USD']),
getTemperatureUnit: jest.fn().mockReturnValue('celsius'),
getFirstWeekDay: jest.fn().mockReturnValue(0),
uses24HourClock: jest.fn().mockReturnValue(false),
usesMetricSystem: jest.fn().mockReturnValue(false),
findBestAvailableLanguage: jest.fn().mockReturnValue({
languageTag: 'en-US',
isRTL: false,
}),
}));
5 changes: 5 additions & 0 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@
"@react-native/metro-config": "0.75.4",
"@react-native/typescript-config": "0.75.4",
"@tamagui/types": "1.110.0",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/react-native": "^13.2.0",
"@tsconfig/react-native": "^3.0.0",
"@types/add": "^2",
"@types/elliptic": "^6",
Expand All @@ -121,14 +123,17 @@
"@types/react-native": "^0.73.0",
"@types/react-native-dotenv": "^0.2.0",
"@types/react-native-sqlite-storage": "^6.0.5",
"@types/react-test-renderer": "^18",
"eslint": "^8.19.0",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-prettier": "^5.2.6",
"eslint-plugin-simple-import-sort": "^12.1.1",
"jest": "^29.6.3",
"prettier": "^3.5.3",
"react-native-bundle-visualizer": "^3.1.3",
"react-native-reanimated": "^3.17.5",
"react-native-svg-transformer": "^1.5.0",
"react-test-renderer": "18.3.1",
"stream-browserify": "^3.0.0",
"typescript": "5.0.4"
},
Expand Down
27 changes: 0 additions & 27 deletions app/src/Navigation/account.ts
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dupe file. similar to navigation/recovery

This file was deleted.

Loading
Loading