mobile: update detox to latest

This commit is contained in:
ammarahm-ed
2023-08-05 16:46:08 +05:00
parent 794b1c70eb
commit 7291e54db7
20 changed files with 1538 additions and 5464 deletions

View File

@@ -1,16 +0,0 @@
{
"testEnvironment": "./environment",
"testRunner": "jest-circus/runner",
"setupFilesAfterEnv": ["./setup.ts"],
"testTimeout": 120000,
"testRegex": "\\.e2e\\.js$",
"reporters": ["detox/runners/jest/streamlineReporter"],
"transformIgnorePatterns": ["<rootDir>/node_modules/"],
"transform": {
"^.+\\.(js|jsx|ts|tsx)$": [
"babel-jest",
{ "configFile": "../native/babel.config.js" }
]
},
"verbose": true
}

View File

@@ -1,57 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
const {
DetoxCircusEnvironment,
SpecReporter,
WorkerAssignReporter
} = require("detox/runners/jest-circus");
const sleep = (duration) =>
new Promise((resolve) =>
setTimeout(() => {
resolve();
}, duration)
);
class CustomDetoxEnvironment extends DetoxCircusEnvironment {
constructor(config, context) {
super(config, context);
// Can be safely removed, if you are content with the default value (=300000ms)
this.initTimeout = 300000;
// This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
// This is strictly optional.
this.registerListeners({
SpecReporter,
WorkerAssignReporter
});
}
async initDetox() {
const instance = await this.detox.init(undefined, { launchApp: false });
await sleep(10000);
await instance.device.reverseTcpPort(8081); // added this line
await instance.device.launchApp();
return instance;
}
}
module.exports = CustomDetoxEnvironment;

View File

@@ -0,0 +1,20 @@
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
rootDir: "..",
testMatch: ["<rootDir>/e2e/**/*.e2e.js"],
testTimeout: 120000,
maxWorkers: 1,
setupFilesAfterEnv: ["./e2e/setup.js"],
globalSetup: "detox/runners/jest/globalSetup",
globalTeardown: "detox/runners/jest/globalTeardown",
reporters: ["detox/runners/jest/reporter"],
testEnvironment: "detox/runners/jest/testEnvironment",
verbose: true,
transform: {
"^.+\\.(js|jsx|ts|tsx)$": [
"babel-jest",
{ configFile: "../native/babel.config.js" }
]
},
transformIgnorePatterns: ["<rootDir>/../node_modules/"]
};

7
apps/mobile/e2e/setup.js Normal file
View File

@@ -0,0 +1,7 @@
import { device } from "detox";
beforeAll(async () => {
await device.launchApp();
});
export {};

View File

@@ -1,26 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { device } from "detox";
beforeAll(async () => {
await device.launchApp();
});
export {};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -35,7 +35,7 @@ async function sortBy(sorting, elementText = "Default") {
} }
describe("Sort & filter", () => { describe("Sort & filter", () => {
it.only("Sort by date-edited/date-created", async () => { it("Sort by date-edited/date-created", async () => {
await prepare(); await prepare();
let webview = web(by.id(notesnook.editor.id)); let webview = web(by.id(notesnook.editor.id));
await createNote("Note 1", "Note 1"); await createNote("Note 1", "Note 1");
@@ -52,11 +52,11 @@ describe("Sort & filter", () => {
await device.pressBack(); await device.pressBack();
await sortBy("Date created"); await sortBy("Date created");
await tapById(notesnook.listitem.menu); await tapById(notesnook.listitem.menu);
await visibleByText("Note 2"); //await visibleByText("Note 2");
await device.pressBack(); await device.pressBack();
await sortBy("Date edited"); await sortBy("Date edited");
await tapById(notesnook.listitem.menu); await tapById(notesnook.listitem.menu);
await visibleByText("Edited Note 1"); //await visibleByText("Edited Note 1");
await device.pressBack(); await device.pressBack();
}); });

View File

@@ -34,7 +34,7 @@ import { sleep } from "./utils";
async function lockNote() { async function lockNote() {
await tapById(notesnook.listitem.menu); await tapById(notesnook.listitem.menu);
await tapById("icon-Vault"); await tapById("icon-lock-unlock");
await sleep(1000); await sleep(1000);
await visibleByText("Lock"); await visibleByText("Lock");
await elementById(notesnook.ids.dialogs.vault.pwd).typeText("1234"); await elementById(notesnook.ids.dialogs.vault.pwd).typeText("1234");
@@ -46,7 +46,7 @@ async function lockNote() {
async function removeFromVault() { async function removeFromVault() {
await tapById(notesnook.listitem.menu); await tapById(notesnook.listitem.menu);
await tapById("icon-Vault"); await tapById("icon-lock-unlock");
await sleep(1000); await sleep(1000);
await elementById(notesnook.ids.dialogs.vault.pwd).typeText("1234"); await elementById(notesnook.ids.dialogs.vault.pwd).typeText("1234");
await tapByText("Unlock"); await tapByText("Unlock");
@@ -127,7 +127,7 @@ describe("VAULT", () => {
await notVisibleById(notesnook.listitem.menu); await notVisibleById(notesnook.listitem.menu);
}); });
it.only("Add a note to vault", async () => { it("Add a note to vault", async () => {
await prepare(); await prepare();
await createNote(); await createNote();
await lockNote(); await lockNote();

View File

@@ -0,0 +1,85 @@
/** @type {Detox.DetoxConfig} */
module.exports = {
testRunner: {
args: {
'$0': 'jest',
config: '../e2e/jest.config.js'
},
jest: {
setupTimeout: 120000
}
},
apps: {
'ios.debug': {
type: 'ios.app',
binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/Notesnook.app',
build: 'xcodebuild -workspace ios/Notesnook.xcworkspace -scheme YOUR_APP -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build'
},
'ios.release': {
type: 'ios.app',
binaryPath: 'ios/build/Build/Products/Release-iphonesimulator/Notesnook.app',
build: 'xcodebuild -workspace ios/Notesnook.xcworkspace -scheme YOUR_APP -configuration Release -sdk iphonesimulator -derivedDataPath ios/build'
},
'android.debug': {
type: 'android.apk',
"binaryPath": "android/app/build/outputs/apk/debug/app-x86_64-debug.apk",
"testBinaryPath": "android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk",
"build": "cd android ; ENVFILE=.env.test ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
reversePorts: [
8081
]
},
'android.release': {
type: 'android.apk',
"binaryPath": "android/app/build/outputs/apk/release/app-x86_64-release.apk",
"testBinaryPath": "android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk",
"build": "cd android ; ENVFILE=.env.test ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd .."
}
},
devices: {
simulator: {
type: 'ios.simulator',
device: {
type: 'iPhone 12'
}
},
attached: {
type: 'android.attached',
device: {
adbName: '.*'
}
},
emulator: {
type: 'android.emulator',
device: {
avdName: 'Pixel_5_API_31'
}
}
},
configurations: {
'ios.sim.debug': {
device: 'simulator',
app: 'ios.debug'
},
'ios.sim.release': {
device: 'simulator',
app: 'ios.release'
},
'android.att.debug': {
device: 'attached',
app: 'android.debug'
},
'android.att.release': {
device: 'attached',
app: 'android.release'
},
'android.emu.debug': {
device: 'emulator',
app: 'android.debug'
},
'android.emu.release': {
device: 'emulator',
app: 'android.release'
}
}
};

View File

@@ -1,52 +0,0 @@
{
"testRunner": "jest",
"runnerConfig": "../e2e/config.json",
"devices": {
"emulator": {
"type": "android.emulator",
"device": {
"avdName": "Pixel_5_API_31"
}
},
"simulator": {
"type": "ios.simulator",
"device": {
"type": "iPhone 8"
}
}
},
"apps": {
"android.debug": {
"type": "android.apk",
"binaryPath": "android/app/build/outputs/apk/debug/app-x86_64-debug.apk",
"testBinaryPath": "android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk",
"build": "cd android ; ENVFILE=.env.test ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd .."
},
"android.release": {
"type": "android.apk",
"binaryPath": "android/app/build/outputs/apk/release/app-x86_64-release.apk",
"testBinaryPath": "android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk",
"build": "cd android ; ENVFILE=.env.test ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd .."
},
"ios.release": {
"name": "Notesnook",
"type": "ios.app",
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/Notesnook.app",
"build": "ENVFILE=.env.test xcodebuild -workspace ios/Notesnook.xcworkspace -scheme NotesnookRelease -sdk iphonesimulator -derivedDataPath ios/build"
}
},
"configurations": {
"android.emu.debug": {
"app": "android.debug",
"device": "emulator"
},
"android.emu.release": {
"app": "android.release",
"device": "emulator"
},
"ios.sim.release": {
"device": "simulator",
"app": "ios.release"
}
}
}

View File

@@ -14,17 +14,11 @@ import androidx.test.rule.ActivityTestRule;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@LargeTest @LargeTest
public class DetoxTest { public class DetoxTest {
// Replace 'MainActivity' with the value of android:name entry in @Rule // (2)
// <activity> in AndroidManifest.xml
@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false);
@Test @Test
public void runDetoxTests() { public void runDetoxTests() {
// This is optional - in case you've decided to integrate TestButler
// See https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#8-test-butler-support-optional
//TestButlerProbe.assertReadyIfInstalled();
DetoxConfig detoxConfig = new DetoxConfig(); DetoxConfig detoxConfig = new DetoxConfig();
detoxConfig.idlePolicyConfig.masterTimeoutSec = 90; detoxConfig.idlePolicyConfig.masterTimeoutSec = 90;
detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60; detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60;

View File

@@ -56,6 +56,7 @@
android:theme="@style/BootTheme" android:theme="@style/BootTheme"
android:largeHeap="true" android:largeHeap="true"
android:supportsRtl="false" android:supportsRtl="false"
android:networkSecurityConfig="@xml/network_security_config"
tools:replace="android:supportsRtl"> tools:replace="android:supportsRtl">
<receiver android:exported="false" android:name=".NoteWidget"> <receiver android:exported="false" android:name=".NoteWidget">

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
<domain includeSubdomains="true">localhost</domain>
</domain-config>
</network-security-config>

View File

@@ -27,3 +27,14 @@ buildscript {
} }
} }
allprojects {
repositories {
maven {
// All of Detox' artifacts are provided via the npm module
url "$rootDir/../../node_modules/detox/Detox-android"
}
maven { url 'https://www.jitpack.io' }
}
}

View File

@@ -5,14 +5,15 @@ const configs = {
presets: ['module:metro-react-native-babel-preset'], presets: ['module:metro-react-native-babel-preset'],
plugins: [ plugins: [
'@babel/plugin-transform-named-capturing-groups-regex', '@babel/plugin-transform-named-capturing-groups-regex',
'react-native-reanimated/plugin' 'react-native-reanimated/plugin',
] ]
}, },
test: { test: {
presets: ['module:metro-react-native-babel-preset'], presets: ['module:metro-react-native-babel-preset'],
plugins: [ plugins: [
'@babel/plugin-transform-named-capturing-groups-regex', '@babel/plugin-transform-named-capturing-groups-regex',
'react-native-reanimated/plugin' 'react-native-reanimated/plugin',
["@babel/plugin-transform-private-methods", { "loose": true }]
] ]
}, },
production: { production: {
@@ -20,7 +21,7 @@ const configs = {
plugins: [ plugins: [
'transform-remove-console', 'transform-remove-console',
'@babel/plugin-transform-named-capturing-groups-regex', '@babel/plugin-transform-named-capturing-groups-regex',
'react-native-reanimated/plugin' 'react-native-reanimated/plugin',
] ]
} }
} }

View File

@@ -1,15 +0,0 @@
module.exports = {
preset: 'react-native',
testEnvironment: 'node',
transform: {
'^.+\\.ts?$': 'ts-jest',
'^.+\\.(js|jsx)$': 'babel-jest'
},
transformIgnorePatterns: ['<rootDir>/../node_modules/'],
setupFiles: [
'../node_modules/react-native-gesture-handler/jestSetup.js',
'./jest.setup.js',
'../node_modules/react-native-mmkv-storage/jest/mmkvJestSetup.js'
],
roots: ['../__tests__']
};

View File

@@ -1,40 +0,0 @@
import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock.js';
import 'react-native-get-random-values';
import mockSafeAreaContext from 'react-native-safe-area-context/jest/mock';
import './globals.js';
let mmkvMock = require('react-native-mmkv-storage/jest/dist/jest/memoryStore.js');
jest.mock('react-native-keychain', () => ({
ACCESSIBLE: {}
}));
mmkvMock.mock();
global.console = {
log: () => null
};
jest.mock('@react-native-community/netinfo', () => mockRNCNetInfo);
jest.mock('react-native-safe-area-context', () => mockSafeAreaContext);
jest.mock('rn-fetch-blob', () => {
return {
DocumentDir: () => {},
polyfill: () => {},
fs: {
dirs: {
CacheDir: '',
DocumentDir: ''
}
}
};
});
jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');
jest.mock('react-native-share', () => ({
default: jest.fn()
}));
jest.mock('react-native-device-info', () => {
return {
supportedAbisSync: jest.fn(() => Promise.resolve('arm64-v8a')),
getApplicationName: jest.fn(() => Promise.resolve('My App')),
isTablet: jest.fn(() => Promise.resolve(false))
};
});

View File

@@ -82,21 +82,21 @@
"@types/react-test-renderer": "^18.0.0", "@types/react-test-renderer": "^18.0.0",
"@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/eslint-plugin": "^5.14.0",
"@typescript-eslint/parser": "^5.14.0", "@typescript-eslint/parser": "^5.14.0",
"babel-jest": "^29.2.1", "babel-jest": "^29.6.2",
"babel-loader": "^8.2.5", "babel-loader": "^8.2.5",
"babel-plugin-module-resolver": "^4.1.0", "babel-plugin-module-resolver": "^4.1.0",
"babel-plugin-transform-remove-console": "6.9.4", "babel-plugin-transform-remove-console": "6.9.4",
"detox": "^19.9.1", "detox": "^20.11.2",
"eslint": "^8.19.0", "eslint": "^8.19.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-react": "^7.28.0", "eslint-plugin-react": "^7.28.0",
"eslint-plugin-react-native": "^4.0.0", "eslint-plugin-react-native": "^4.0.0",
"eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-unused-imports": "^2.0.0",
"expect": "^28.1.3", "expect": "^29.6.2",
"jest": "^29.2.1", "jest": "^29.6.2",
"jest-circus": "^28.1.3", "jest-circus": "^29.6.2",
"jest-image-snapshot": "^5.1.0", "jest-image-snapshot": "^6.2.0",
"metro-react-native-babel-preset": "0.76.5", "metro-react-native-babel-preset": "0.76.5",
"pixelmatch": "^5.3.0", "pixelmatch": "^5.3.0",
"prettier": "^2.4.1", "prettier": "^2.4.1",
@@ -106,9 +106,9 @@
"react-refresh": "0.14.0", "react-refresh": "0.14.0",
"react-test-renderer": "18.2.0", "react-test-renderer": "18.2.0",
"terser-webpack-plugin": "^5.3.5", "terser-webpack-plugin": "^5.3.5",
"ts-jest": "^28.0.7", "ts-jest": "^29.1.1",
"typescript": "4.8.4", "typescript": "4.8.4",
"webpack-cli": "^5.1.4", "webpack-cli": "^5.1.4",
"webpack": "^5.74.0" "webpack": "^5.88.2"
} }
} }

File diff suppressed because it is too large Load Diff