From 89f51d49ba255abb47c0fc6f6c38a8a554eb4e96 Mon Sep 17 00:00:00 2001 From: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> Date: Fri, 26 Jan 2024 19:39:31 +0100 Subject: [PATCH] Revert "dev: removed API mocks and use actual account " --- .../composite/buildAndroidE2EAPK/action.yml | 33 - .github/workflows/e2ePerformanceTests.yml | 12 - metro.config.js | 21 + package-lock.json | 1084 +++++---- package.json | 1 - .../LHNOptionsList/LHNOptionsList.tsx | 16 - .../LHNOptionsList/OptionRowLHN.tsx | 3 +- src/components/LHNOptionsList/types.ts | 7 +- src/libs/E2E/API.mock.ts | 82 + src/libs/E2E/actions/e2eLogin.ts | 43 +- src/libs/E2E/actions/waitForAppLoaded.ts | 19 - src/libs/E2E/apiMocks/authenticatePusher.ts | 11 + src/libs/E2E/apiMocks/beginSignin.ts | 25 + src/libs/E2E/apiMocks/openApp.ts | 2069 +++++++++++++++++ src/libs/E2E/apiMocks/openReport.ts | 1972 ++++++++++++++++ src/libs/E2E/apiMocks/readNewestAction.ts | 15 + src/libs/E2E/apiMocks/signinUser.ts | 53 + src/libs/E2E/client.ts | 93 +- src/libs/E2E/reactNativeLaunchingTest.ts | 22 +- src/libs/E2E/tests/appStartTimeTest.e2e.ts | 7 +- src/libs/E2E/tests/chatOpeningTest.e2e.ts | 27 +- src/libs/E2E/tests/openSearchPageTest.e2e.ts | 7 +- src/libs/E2E/tests/reportTypingTest.e2e.ts | 16 +- src/libs/E2E/types.ts | 21 +- src/libs/E2E/utils/LaunchArgs.ts | 8 - src/libs/E2E/utils/NetworkInterceptor.ts | 172 -- src/libs/E2E/utils/getConfigValueOrThrow.ts | 12 - src/pages/home/sidebar/SidebarLinks.js | 2 +- tests/e2e/README.md | 14 +- tests/e2e/config.js | 13 +- tests/e2e/server/index.js | 34 - tests/e2e/server/routes.js | 6 - tests/e2e/testRunner.js | 8 +- tests/e2e/utils/launchApp.js | 10 +- 34 files changed, 4875 insertions(+), 1063 deletions(-) create mode 100644 src/libs/E2E/API.mock.ts delete mode 100644 src/libs/E2E/actions/waitForAppLoaded.ts create mode 100644 src/libs/E2E/apiMocks/authenticatePusher.ts create mode 100644 src/libs/E2E/apiMocks/beginSignin.ts create mode 100644 src/libs/E2E/apiMocks/openApp.ts create mode 100644 src/libs/E2E/apiMocks/openReport.ts create mode 100644 src/libs/E2E/apiMocks/readNewestAction.ts create mode 100644 src/libs/E2E/apiMocks/signinUser.ts delete mode 100644 src/libs/E2E/utils/LaunchArgs.ts delete mode 100644 src/libs/E2E/utils/NetworkInterceptor.ts delete mode 100644 src/libs/E2E/utils/getConfigValueOrThrow.ts diff --git a/.github/actions/composite/buildAndroidE2EAPK/action.yml b/.github/actions/composite/buildAndroidE2EAPK/action.yml index 0c5f70929c27..b4fc05c7ebe9 100644 --- a/.github/actions/composite/buildAndroidE2EAPK/action.yml +++ b/.github/actions/composite/buildAndroidE2EAPK/action.yml @@ -14,24 +14,6 @@ inputs: MAPBOX_SDK_DOWNLOAD_TOKEN: description: The token to use to download the MapBox SDK required: true - PATH_ENV_FILE: - description: The path to the .env file to use for the build - required: true - EXPENSIFY_PARTNER_NAME: - description: The name of the Expensify partner to use for the build - required: true - EXPENSIFY_PARTNER_PASSWORD: - description: The password of the Expensify partner to use for the build - required: true - EXPENSIFY_PARTNER_USER_ID: - description: The user ID of the Expensify partner to use for the build - required: true - EXPENSIFY_PARTNER_USER_SECRET: - description: The user secret of the Expensify partner to use for the build - required: true - EXPENSIFY_PARTNER_PASSWORD_EMAIL: - description: The email address of the Expensify partner to use for the build - required: true runs: using: composite @@ -55,24 +37,9 @@ runs: - uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef - - name: Append environment variables to env file - shell: bash - run: | - echo "EXPENSIFY_PARTNER_NAME=${EXPENSIFY_PARTNER_NAME}" >> ${{ inputs.PATH_ENV_FILE }} - echo "EXPENSIFY_PARTNER_PASSWORD=${EXPENSIFY_PARTNER_PASSWORD}" >> ${{ inputs.PATH_ENV_FILE }} - echo "EXPENSIFY_PARTNER_USER_ID=${EXPENSIFY_PARTNER_USER_ID}" >> ${{ inputs.PATH_ENV_FILE }} - echo "EXPENSIFY_PARTNER_USER_SECRET=${EXPENSIFY_PARTNER_USER_SECRET}" >> ${{ inputs.PATH_ENV_FILE }} - echo "EXPENSIFY_PARTNER_PASSWORD_EMAIL=${EXPENSIFY_PARTNER_PASSWORD_EMAIL}" >> ${{ inputs.PATH_ENV_FILE }} - - name: Build APK run: npm run ${{ inputs.PACKAGE_SCRIPT_NAME }} shell: bash - env: - EXPENSIFY_PARTNER_NAME: ${{ inputs.EXPENSIFY_PARTNER_NAME }} - EXPENSIFY_PARTNER_PASSWORD: ${{ inputs.EXPENSIFY_PARTNER_PASSWORD }} - EXPENSIFY_PARTNER_USER_ID: ${{ inputs.EXPENSIFY_PARTNER_USER_ID }} - EXPENSIFY_PARTNER_USER_SECRET: ${{ inputs.EXPENSIFY_PARTNER_USER_SECRET }} - EXPENSIFY_PARTNER_PASSWORD_EMAIL: ${{ inputs.EXPENSIFY_PARTNER_PASSWORD_EMAIL }} - name: Upload APK uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 70f70fca60de..bd3af08ae25e 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -52,12 +52,6 @@ jobs: PACKAGE_SCRIPT_NAME: android-build-e2e APP_OUTPUT_PATH: android/app/build/outputs/apk/e2e/release/app-e2e-release.apk MAPBOX_SDK_DOWNLOAD_TOKEN: ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} - EXPENSIFY_PARTNER_NAME: ${{ secrets.EXPENSIFY_PARTNER_NAME }} - EXPENSIFY_PARTNER_PASSWORD: ${{ secrets.EXPENSIFY_PARTNER_PASSWORD }} - EXPENSIFY_PARTNER_USER_ID: ${{ secrets.EXPENSIFY_PARTNER_USER_ID }} - EXPENSIFY_PARTNER_USER_SECRET: ${{ secrets.EXPENSIFY_PARTNER_USER_SECRET }} - EXPENSIFY_PARTNER_PASSWORD_EMAIL: ${{ secrets.EXPENSIFY_PARTNER_PASSWORD_EMAIL }} - PATH_ENV_FILE: tests/e2e/.env.e2e buildDelta: runs-on: ubuntu-latest-xl @@ -120,12 +114,6 @@ jobs: PACKAGE_SCRIPT_NAME: android-build-e2edelta APP_OUTPUT_PATH: android/app/build/outputs/apk/e2edelta/release/app-e2edelta-release.apk MAPBOX_SDK_DOWNLOAD_TOKEN: ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} - EXPENSIFY_PARTNER_NAME: ${{ secrets.EXPENSIFY_PARTNER_NAME }} - EXPENSIFY_PARTNER_PASSWORD: ${{ secrets.EXPENSIFY_PARTNER_PASSWORD }} - EXPENSIFY_PARTNER_USER_ID: ${{ secrets.EXPENSIFY_PARTNER_USER_ID }} - EXPENSIFY_PARTNER_USER_SECRET: ${{ secrets.EXPENSIFY_PARTNER_USER_SECRET }} - EXPENSIFY_PARTNER_PASSWORD_EMAIL: ${{ secrets.EXPENSIFY_PARTNER_PASSWORD_EMAIL }} - PATH_ENV_FILE: tests/e2e/.env.e2edelta runTestsInAWS: runs-on: ubuntu-latest diff --git a/metro.config.js b/metro.config.js index 2422d29aaacf..a4d0da1d85f4 100644 --- a/metro.config.js +++ b/metro.config.js @@ -7,6 +7,12 @@ require('dotenv').config(); const defaultConfig = getDefaultConfig(__dirname); const isE2ETesting = process.env.E2E_TESTING === 'true'; + +if (isE2ETesting) { + // eslint-disable-next-line no-console + console.log('⚠️⚠️⚠️⚠️ Using mock API ⚠️⚠️⚠️⚠️'); +} + const e2eSourceExts = ['e2e.js', 'e2e.ts']; /** @@ -20,6 +26,21 @@ const config = { assetExts: [...defaultAssetExts, 'lottie'], // When we run the e2e tests we want files that have the extension e2e.js to be resolved as source files sourceExts: [...(isE2ETesting ? e2eSourceExts : []), ...defaultSourceExts, 'jsx'], + resolveRequest: (context, moduleName, platform) => { + const resolution = context.resolveRequest(context, moduleName, platform); + if (isE2ETesting && moduleName.includes('/API')) { + const originalPath = resolution.filePath; + const mockPath = originalPath.replace('src/libs/API.ts', 'src/libs/E2E/API.mock.ts').replace('/src/libs/API.ts/', 'src/libs/E2E/API.mock.ts'); + // eslint-disable-next-line no-console + console.log('⚠️⚠️⚠️⚠️ Replacing resolution path', originalPath, ' => ', mockPath); + + return { + ...resolution, + filePath: mockPath, + }; + } + return resolution; + }, }, }; diff --git a/package-lock.json b/package-lock.json index c1328d498c79..543a1366f8d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,6 @@ "react-native-image-picker": "^5.1.0", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#8393b7e58df6ff65fd41f60aee8ece8822c91e2b", "react-native-key-command": "^1.0.6", - "react-native-launch-arguments": "^4.0.2", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", @@ -4002,26 +4001,6 @@ "node": ">=8" } }, - "node_modules/@expo/config-plugins/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/@expo/config-types": { "version": "45.0.0", "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-45.0.0.tgz", @@ -22093,7 +22072,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", @@ -22160,34 +22139,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -27570,7 +27521,26 @@ "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" }, "node_modules/csstype": { "version": "3.1.1", @@ -27615,6 +27585,20 @@ "node": ">= 6" } }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -28345,7 +28329,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0" }, @@ -33657,6 +33641,18 @@ "wbuf": "^1.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -36620,17 +36616,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-environment-jsdom/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -36680,59 +36665,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/jest-environment-jsdom/node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/jest-environment-jsdom/node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/jest-environment-jsdom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -36742,72 +36674,6 @@ "node": ">=8" } }, - "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-jsdom/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/jest-environment-jsdom/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -36820,67 +36686,6 @@ "node": ">=8" } }, - "node_modules/jest-environment-jsdom/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "engines": { - "node": ">=12" - } - }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -38893,6 +38698,130 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/jsdom/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -42118,9 +42047,8 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.2", + "license": "MIT" }, "node_modules/ob1": { "version": "0.80.3", @@ -44031,7 +43959,8 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -44085,9 +44014,9 @@ } }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } @@ -45050,15 +44979,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "node_modules/react-native-launch-arguments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/react-native-launch-arguments/-/react-native-launch-arguments-4.0.2.tgz", - "integrity": "sha512-OaXXOG9jVrmb66cTV8wPdhKxaSVivOBKuYr8wgKCM5uAHkY5B6SkvydgJ3B/x8uGoWqtr87scSYYDm4MMU4rSg==", - "peerDependencies": { - "react": ">=16.8.1", - "react-native": ">=0.60.0-rc.0 <1.0.x" - } - }, "node_modules/react-native-linear-gradient": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.1.tgz", @@ -47503,17 +47423,6 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "license": "ISC" }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/scheduler": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", @@ -50555,9 +50464,8 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.2", + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -50572,10 +50480,23 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/traverse": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", @@ -51788,6 +51709,18 @@ "pbf": "^3.2.1" } }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/wait-port": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", @@ -52198,6 +52131,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -52886,11 +52820,45 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -53224,9 +53192,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, @@ -53278,6 +53246,37 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlbuilder": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", @@ -56316,20 +56315,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" } } }, @@ -69449,27 +69434,6 @@ } } }, - "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - }, - "dependencies": { - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" - }, - "acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==" - } - } - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -73396,6 +73360,21 @@ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, "csstype": { "version": "3.1.1" }, @@ -73429,6 +73408,16 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -77801,6 +77790,14 @@ "wbuf": "^1.1.0" } }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, "html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -79727,99 +79724,20 @@ } } }, - "jest-docblock": { - "version": "29.2.0", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.4.1", - "requires": { - "@jest/types": "^29.4.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.4.1", - "pretty-format": "^29.4.1" - }, - "dependencies": { - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { + "jest-docblock": { + "version": "29.2.0", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { "version": "29.4.1", "requires": { - "@jest/environment": "^29.4.1", - "@jest/fake-timers": "^29.4.1", "@jest/types": "^29.4.1", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.4.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", "jest-util": "^29.4.1", - "jsdom": "^20.0.0" + "pretty-format": "^29.4.1" }, "dependencies": { "@jest/types": { @@ -79843,11 +79761,6 @@ "@types/yargs-parser": "*" } }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -79878,100 +79791,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -79979,49 +79803,85 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + } + } + }, + "jest-environment-jsdom": { + "version": "29.4.1", + "requires": { + "@jest/environment": "^29.4.1", + "@jest/fake-timers": "^29.4.1", + "@jest/types": "^29.4.1", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.4.1", + "jest-util": "^29.4.1", + "jsdom": "^20.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "requires": { - "punycode": "^2.1.1" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" } }, - "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "requires": { - "xml-name-validator": "^4.0.0" + "@types/yargs-parser": "*" } }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "iconv-lite": "0.6.3" + "color-convert": "^2.0.1" } }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" + "color-name": "~1.1.4" } }, - "xml-name-validator": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -81436,6 +81296,91 @@ "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "requires": { + "xmlchars": "^2.2.0" + } + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -83784,9 +83729,7 @@ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" }, "nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.2" }, "ob1": { "version": "0.80.3", @@ -85168,9 +85111,9 @@ } }, "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "pusher-js": { "version": "8.3.0", @@ -85941,12 +85884,6 @@ } } }, - "react-native-launch-arguments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/react-native-launch-arguments/-/react-native-launch-arguments-4.0.2.tgz", - "integrity": "sha512-OaXXOG9jVrmb66cTV8wPdhKxaSVivOBKuYr8wgKCM5uAHkY5B6SkvydgJ3B/x8uGoWqtr87scSYYDm4MMU4rSg==", - "requires": {} - }, "react-native-linear-gradient": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.1.tgz", @@ -87565,14 +87502,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "requires": { - "xmlchars": "^2.2.0" - } - }, "scheduler": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", @@ -89824,9 +89753,7 @@ "dev": true }, "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.2", "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -89841,6 +89768,14 @@ } } }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, "traverse": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", @@ -90688,6 +90623,14 @@ "pbf": "^3.2.1" } }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "requires": { + "xml-name-validator": "^4.0.0" + } + }, "wait-port": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", @@ -91467,11 +91410,33 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + } + }, "whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -91719,9 +91684,9 @@ } }, "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} }, "x-default-browser": { @@ -91749,6 +91714,27 @@ } } }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } + }, "xmlbuilder": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", diff --git a/package.json b/package.json index 96de7fb0ab77..8ceac3912660 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,6 @@ "react-native-image-picker": "^5.1.0", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#8393b7e58df6ff65fd41f60aee8ece8822c91e2b", "react-native-key-command": "^1.0.6", - "react-native-launch-arguments": "^4.0.2", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", diff --git a/src/components/LHNOptionsList/LHNOptionsList.tsx b/src/components/LHNOptionsList/LHNOptionsList.tsx index 15c12afb2609..28b8e253800d 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.tsx +++ b/src/components/LHNOptionsList/LHNOptionsList.tsx @@ -32,23 +32,9 @@ function LHNOptionsList({ currentReportID = '', draftComments = {}, transactionViolations = {}, - onFirstItemRendered = () => {}, }: LHNOptionsListProps) { const styles = useThemeStyles(); const {canUseViolations} = usePermissions(); - - // When the first item renders we want to call the onFirstItemRendered callback. - // At this point in time we know that the list is actually displaying items. - const hasCalledOnLayout = React.useRef(false); - const onLayoutItem = useCallback(() => { - if (hasCalledOnLayout.current) { - return; - } - hasCalledOnLayout.current = true; - - onFirstItemRendered(); - }, [onFirstItemRendered]); - /** * Function which renders a row in the list */ @@ -82,7 +68,6 @@ function LHNOptionsList({ comment={itemComment} transactionViolations={transactionViolations} canUseViolations={canUseViolations} - onLayout={onLayoutItem} /> ); }, @@ -100,7 +85,6 @@ function LHNOptionsList({ transactions, transactionViolations, canUseViolations, - onLayoutItem, ], ); diff --git a/src/components/LHNOptionsList/OptionRowLHN.tsx b/src/components/LHNOptionsList/OptionRowLHN.tsx index ae225b3db9e9..4123e9d20d58 100644 --- a/src/components/LHNOptionsList/OptionRowLHN.tsx +++ b/src/components/LHNOptionsList/OptionRowLHN.tsx @@ -28,7 +28,7 @@ import CONST from '@src/CONST'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import type {OptionRowLHNProps} from './types'; -function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, optionItem, viewMode = 'default', style, onLayout = () => {}}: OptionRowLHNProps) { +function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, optionItem, viewMode = 'default', style}: OptionRowLHNProps) { const theme = useTheme(); const styles = useThemeStyles(); const popoverAnchor = useRef(null); @@ -164,7 +164,6 @@ function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, opti ]} role={CONST.ROLE.BUTTON} accessibilityLabel={translate('accessibilityHints.navigatesToChat')} - onLayout={onLayout} needsOffscreenAlphaCompositing={(optionItem?.icons?.length ?? 0) >= 2} > diff --git a/src/components/LHNOptionsList/types.ts b/src/components/LHNOptionsList/types.ts index 1f2c98301f9a..58b0216d0970 100644 --- a/src/components/LHNOptionsList/types.ts +++ b/src/components/LHNOptionsList/types.ts @@ -1,6 +1,6 @@ import type {ContentStyle} from '@shopify/flash-list'; import type {RefObject} from 'react'; -import type {LayoutChangeEvent, StyleProp, TextStyle, View, ViewStyle} from 'react-native'; +import type {StyleProp, TextStyle, View, ViewStyle} from 'react-native'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import type {CurrentReportIDContextValue} from '@components/withCurrentReportID'; @@ -54,9 +54,6 @@ type CustomLHNOptionsListProps = { /** Whether to allow option focus or not */ shouldDisableFocusOptions?: boolean; - - /** Callback to fire when the list is laid out */ - onFirstItemRendered: () => void; }; type LHNOptionsListProps = CustomLHNOptionsListProps & CurrentReportIDContextValue & LHNOptionsListOnyxProps; @@ -129,8 +126,6 @@ type OptionRowLHNProps = { /** The item that should be rendered */ optionItem?: OptionData; - - onLayout?: (event: LayoutChangeEvent) => void; }; type RenderItemProps = {item: string}; diff --git a/src/libs/E2E/API.mock.ts b/src/libs/E2E/API.mock.ts new file mode 100644 index 000000000000..83b7cb218977 --- /dev/null +++ b/src/libs/E2E/API.mock.ts @@ -0,0 +1,82 @@ +import Onyx from 'react-native-onyx'; +import Log from '@libs/Log'; +import type Response from '@src/types/onyx/Response'; +// mock functions +import mockAuthenticatePusher from './apiMocks/authenticatePusher'; +import mockBeginSignin from './apiMocks/beginSignin'; +import mockOpenApp from './apiMocks/openApp'; +import mockOpenReport from './apiMocks/openReport'; +import mockReadNewestAction from './apiMocks/readNewestAction'; +import mockSigninUser from './apiMocks/signinUser'; + +type ApiCommandParameters = Record; + +type Mocks = Record Response>; + +/** + * A dictionary which has the name of a API command as key, and a function which + * receives the api command parameters as value and is expected to return a response + * object. + */ +const mocks: Mocks = { + BeginSignIn: mockBeginSignin, + SigninUser: mockSigninUser, + OpenApp: mockOpenApp, + ReconnectApp: mockOpenApp, + OpenReport: mockOpenReport, + ReconnectToReport: mockOpenReport, + AuthenticatePusher: mockAuthenticatePusher, + ReadNewestAction: mockReadNewestAction, +}; + +function mockCall(command: string, apiCommandParameters: ApiCommandParameters, tag: string): Promise | Promise | undefined { + const mockResponse = mocks[command]?.(apiCommandParameters); + if (!mockResponse) { + Log.warn(`[${tag}] for command ${command} is not mocked yet! ⚠️`); + return; + } + + if (Array.isArray(mockResponse.onyxData)) { + return Onyx.update(mockResponse.onyxData); + } + + return Promise.resolve(mockResponse); +} + +/** + * All calls to API.write() will be persisted to disk as JSON with the params, successData, and failureData. + * This is so that if the network is unavailable or the app is closed, we can send the WRITE request later. + * + * @param command - Name of API command to call. + * @param apiCommandParameters - Parameters to send to the API. + */ +function write(command: string, apiCommandParameters: ApiCommandParameters = {}): Promise | Promise | undefined { + return mockCall(command, apiCommandParameters, 'API.write'); +} + +/** + * For commands where the network response must be accessed directly or when there is functionality that can only + * happen once the request is finished (eg. calling third-party services like Onfido and Plaid, redirecting a user + * depending on the response data, etc.). + * It works just like API.read(), except that it will return a promise. + * Using this method is discouraged and will throw an ESLint error. Use it sparingly and only when all other alternatives have been exhausted. + * It is best to discuss it in Slack anytime you are tempted to use this method. + * + * @param command - Name of API command to call. + * @param apiCommandParameters - Parameters to send to the API. + */ +function makeRequestWithSideEffects(command: string, apiCommandParameters: ApiCommandParameters = {}): Promise | Promise | undefined { + return mockCall(command, apiCommandParameters, 'API.makeRequestWithSideEffects'); +} + +/** + * Requests made with this method are not be persisted to disk. If there is no network connectivity, the request is ignored and discarded. + * + * @param command - Name of API command to call. + * @param apiCommandParameters - Parameters to send to the API. + */ +function read(command: string, apiCommandParameters: ApiCommandParameters): Promise | Promise | undefined { + return mockCall(command, apiCommandParameters, 'API.read'); +} + +export {write, makeRequestWithSideEffects, read}; diff --git a/src/libs/E2E/actions/e2eLogin.ts b/src/libs/E2E/actions/e2eLogin.ts index f98eab5005e1..6a25705df755 100644 --- a/src/libs/E2E/actions/e2eLogin.ts +++ b/src/libs/E2E/actions/e2eLogin.ts @@ -1,20 +1,8 @@ -/* eslint-disable rulesdir/prefer-actions-set-data */ - /* eslint-disable rulesdir/prefer-onyx-connect-in-libs */ import Onyx from 'react-native-onyx'; -import {Authenticate} from '@libs/Authentication'; -import getConfigValueOrThrow from '@libs/E2E/utils/getConfigValueOrThrow'; -import CONFIG from '@src/CONFIG'; +import * as Session from '@userActions/Session'; import ONYXKEYS from '@src/ONYXKEYS'; -const e2eUserCredentials = { - email: getConfigValueOrThrow('EXPENSIFY_PARTNER_PASSWORD_EMAIL'), - partnerUserID: getConfigValueOrThrow('EXPENSIFY_PARTNER_USER_ID'), - partnerUserSecret: getConfigValueOrThrow('EXPENSIFY_PARTNER_USER_SECRET'), - partnerName: CONFIG.EXPENSIFY.PARTNER_NAME, - partnerPassword: CONFIG.EXPENSIFY.PARTNER_PASSWORD, -}; - /** * Command for e2e test to automatically sign in a user. * If the user is already logged in the function will simply @@ -22,7 +10,7 @@ const e2eUserCredentials = { * * @return Resolved true when the user was actually signed in. Returns false if the user was already logged in. */ -export default function (): Promise { +export default function (email = 'fake@email.com', password = 'Password123'): Promise { const waitForBeginSignInToFinish = (): Promise => new Promise((resolve) => { const id = Onyx.connect({ @@ -42,7 +30,7 @@ export default function (): Promise { let neededLogin = false; // Subscribe to auth token, to check if we are authenticated - return new Promise((resolve, reject) => { + return new Promise((resolve) => { const connectionId = Onyx.connect({ key: ONYXKEYS.SESSION, callback: (session) => { @@ -50,24 +38,15 @@ export default function (): Promise { neededLogin = true; // authenticate with a predefined user - console.debug('[E2E] Signing in…'); - Authenticate(e2eUserCredentials) - .then((response) => { - Onyx.merge(ONYXKEYS.SESSION, { - authToken: response.authToken, - email: e2eUserCredentials.email, - }); - console.debug('[E2E] Signed in finished!'); - return waitForBeginSignInToFinish(); - }) - .catch((error) => { - console.error('[E2E] Error while signing in', error); - reject(error); - }); + Session.beginSignIn(email); + waitForBeginSignInToFinish().then(() => { + Session.signIn(password); + }); + } else { + // signal that auth was completed + resolve(neededLogin); + Onyx.disconnect(connectionId); } - // signal that auth was completed - resolve(neededLogin); - Onyx.disconnect(connectionId); }, }); }); diff --git a/src/libs/E2E/actions/waitForAppLoaded.ts b/src/libs/E2E/actions/waitForAppLoaded.ts deleted file mode 100644 index bea739a1b4c7..000000000000 --- a/src/libs/E2E/actions/waitForAppLoaded.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Onyx from 'react-native-onyx'; -import ONYXKEYS from '@src/ONYXKEYS'; - -// Once we get the sidebar loaded end mark we know that the app is ready to be used: -export default function waitForAppLoaded(): Promise { - return new Promise((resolve) => { - const connectionId = Onyx.connect({ - key: ONYXKEYS.IS_SIDEBAR_LOADED, - callback: (isSidebarLoaded) => { - if (!isSidebarLoaded) { - return; - } - - resolve(); - Onyx.disconnect(connectionId); - }, - }); - }); -} diff --git a/src/libs/E2E/apiMocks/authenticatePusher.ts b/src/libs/E2E/apiMocks/authenticatePusher.ts new file mode 100644 index 000000000000..28f9ebbbee88 --- /dev/null +++ b/src/libs/E2E/apiMocks/authenticatePusher.ts @@ -0,0 +1,11 @@ +import type Response from '@src/types/onyx/Response'; + +const authenticatePusher = (): Response => ({ + auth: 'auth', + // eslint-disable-next-line @typescript-eslint/naming-convention + shared_secret: 'secret', + jsonCode: 200, + requestID: '783ef7fc3991969a-SJC', +}); + +export default authenticatePusher; diff --git a/src/libs/E2E/apiMocks/beginSignin.ts b/src/libs/E2E/apiMocks/beginSignin.ts new file mode 100644 index 000000000000..a578f935c2aa --- /dev/null +++ b/src/libs/E2E/apiMocks/beginSignin.ts @@ -0,0 +1,25 @@ +import type {SigninParams} from '@libs/E2E/types'; +import type Response from '@src/types/onyx/Response'; + +const beginSignin = ({email}: SigninParams): Response => ({ + onyxData: [ + { + onyxMethod: 'merge', + key: 'credentials', + value: { + login: email, + }, + }, + { + onyxMethod: 'merge', + key: 'account', + value: { + validated: true, + }, + }, + ], + jsonCode: 200, + requestID: '783e54ef4b38cff5-SJC', +}); + +export default beginSignin; diff --git a/src/libs/E2E/apiMocks/openApp.ts b/src/libs/E2E/apiMocks/openApp.ts new file mode 100644 index 000000000000..d6dd4a8f8003 --- /dev/null +++ b/src/libs/E2E/apiMocks/openApp.ts @@ -0,0 +1,2069 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type Response from '@src/types/onyx/Response'; + +const openApp = (): Response => ({ + onyxData: [ + { + onyxMethod: 'merge', + key: 'user', + value: { + isFromPublicDomain: false, + }, + }, + { + onyxMethod: 'merge', + key: 'currencyList', + value: { + AED: { + symbol: 'Dhs', + name: 'UAE Dirham', + ISO4217: '784', + }, + AFN: { + symbol: 'Af', + name: 'Afghan Afghani', + ISO4217: '971', + }, + ALL: { + symbol: 'ALL', + name: 'Albanian Lek', + ISO4217: '008', + }, + AMD: { + symbol: '\u0564\u0580', + name: 'Armenian Dram', + ISO4217: '051', + }, + ANG: { + symbol: 'NA\u0192', + name: 'Neth Antilles Guilder', + ISO4217: '532', + }, + AOA: { + symbol: 'Kz', + name: 'Angolan Kwanza', + ISO4217: '973', + }, + ARS: { + symbol: 'AR$', + name: 'Argentine Peso', + ISO4217: '032', + }, + AUD: { + symbol: 'A$', + name: 'Australian Dollar', + ISO4217: '036', + }, + AWG: { + symbol: '\u0192', + name: 'Aruba Florin', + ISO4217: '533', + }, + AZN: { + symbol: 'man', + name: 'Azerbaijani Manat', + ISO4217: '944', + }, + BAM: { + symbol: 'KM', + name: 'Bosnia And Herzegovina Convertible Mark', + ISO4217: '977', + }, + BBD: { + symbol: 'Bds$', + name: 'Barbados Dollar', + ISO4217: '052', + }, + BDT: { + symbol: 'Tk', + name: 'Bangladesh Taka', + ISO4217: '050', + }, + BGN: { + symbol: '\u043b\u0432', + name: 'Bulgarian Lev', + ISO4217: '975', + }, + BHD: { + symbol: 'BHD', + name: 'Bahraini Dinar', + ISO4217: '048', + }, + BIF: { + symbol: 'FBu', + name: 'Burundi Franc', + decimals: 0, + ISO4217: '108', + }, + BMD: { + symbol: 'BD$', + name: 'Bermuda Dollar', + ISO4217: '060', + }, + BND: { + symbol: 'BN$', + name: 'Brunei Dollar', + ISO4217: '096', + }, + BOB: { + symbol: 'Bs', + name: 'Bolivian Boliviano', + ISO4217: '068', + }, + BRL: { + symbol: 'R$', + name: 'Brazilian Real', + ISO4217: '986', + }, + BSD: { + symbol: 'BS$', + name: 'Bahamian Dollar', + ISO4217: '044', + }, + BTN: { + symbol: 'Nu.', + name: 'Bhutan Ngultrum', + ISO4217: '064', + }, + BWP: { + symbol: 'P', + name: 'Botswana Pula', + ISO4217: '072', + }, + BYN: { + symbol: 'BR', + name: 'Belarus Ruble', + ISO4217: '933', + }, + BYR: { + symbol: 'BR', + name: 'Belarus Ruble', + retired: true, + retirementDate: '2016-07-01', + ISO4217: '974', + }, + BZD: { + symbol: 'BZ$', + name: 'Belize Dollar', + ISO4217: '084', + }, + CAD: { + symbol: 'C$', + name: 'Canadian Dollar', + ISO4217: '124', + }, + CDF: { + symbol: 'CDF', + name: 'Congolese Franc', + ISO4217: '976', + }, + CHF: { + symbol: 'CHF', + name: 'Swiss Franc', + ISO4217: '756', + }, + CLP: { + symbol: 'Ch$', + name: 'Chilean Peso', + decimals: 0, + ISO4217: '152', + }, + CNY: { + symbol: '\u00a5', + name: 'Chinese Yuan', + ISO4217: '156', + }, + COP: { + symbol: 'Col$', + name: 'Colombian Peso', + decimals: 0, + ISO4217: '170', + }, + CRC: { + symbol: 'CR\u20a1', + name: 'Costa Rica Colon', + ISO4217: '188', + }, + CUC: { + symbol: 'CUC', + name: 'Cuban Convertible Peso', + ISO4217: '931', + }, + CUP: { + symbol: '$MN', + name: 'Cuban Peso', + ISO4217: '192', + }, + CVE: { + symbol: 'Esc', + name: 'Cape Verde Escudo', + ISO4217: '132', + }, + CZK: { + symbol: 'K\u010d', + name: 'Czech Koruna', + ISO4217: '203', + }, + DJF: { + symbol: 'Fdj', + name: 'Dijibouti Franc', + decimals: 0, + ISO4217: '262', + }, + DKK: { + symbol: 'Dkr', + name: 'Danish Krone', + ISO4217: '208', + }, + DOP: { + symbol: 'RD$', + name: 'Dominican Peso', + ISO4217: '214', + }, + DZD: { + symbol: 'DZD', + name: 'Algerian Dinar', + ISO4217: '012', + }, + EEK: { + symbol: 'KR', + name: 'Estonian Kroon', + ISO4217: '', + retired: true, + }, + EGP: { + symbol: 'EGP', + name: 'Egyptian Pound', + ISO4217: '818', + }, + ERN: { + symbol: 'Nfk', + name: 'Eritrea Nakfa', + ISO4217: '232', + }, + ETB: { + symbol: 'Br', + name: 'Ethiopian Birr', + ISO4217: '230', + }, + EUR: { + symbol: '\u20ac', + name: 'Euro', + ISO4217: '978', + }, + FJD: { + symbol: 'FJ$', + name: 'Fiji Dollar', + ISO4217: '242', + }, + FKP: { + symbol: 'FK\u00a3', + name: 'Falkland Islands Pound', + ISO4217: '238', + }, + GBP: { + symbol: '\u00a3', + name: 'British Pound', + ISO4217: '826', + }, + GEL: { + symbol: '\u10da', + name: 'Georgian Lari', + ISO4217: '981', + }, + GHS: { + symbol: '\u20b5', + name: 'Ghanaian Cedi', + ISO4217: '936', + }, + GIP: { + symbol: '\u00a3G', + name: 'Gibraltar Pound', + ISO4217: '292', + }, + GMD: { + symbol: 'D', + name: 'Gambian Dalasi', + ISO4217: '270', + }, + GNF: { + symbol: 'FG', + name: 'Guinea Franc', + decimals: 0, + ISO4217: '324', + }, + GTQ: { + symbol: 'Q', + name: 'Guatemala Quetzal', + ISO4217: '320', + }, + GYD: { + symbol: 'GY$', + name: 'Guyana Dollar', + ISO4217: '328', + }, + HKD: { + symbol: 'HK$', + name: 'Hong Kong Dollar', + ISO4217: '344', + }, + HNL: { + symbol: 'HNL', + name: 'Honduras Lempira', + ISO4217: '340', + }, + HRK: { + symbol: 'kn', + name: 'Croatian Kuna', + ISO4217: '191', + }, + HTG: { + symbol: 'G', + name: 'Haiti Gourde', + ISO4217: '332', + }, + HUF: { + symbol: 'Ft', + name: 'Hungarian Forint', + ISO4217: '348', + }, + IDR: { + symbol: 'Rp', + name: 'Indonesian Rupiah', + ISO4217: '360', + }, + ILS: { + symbol: '\u20aa', + name: 'Israeli Shekel', + ISO4217: '376', + }, + INR: { + symbol: '\u20b9', + name: 'Indian Rupee', + ISO4217: '356', + }, + IQD: { + symbol: 'IQD', + name: 'Iraqi Dinar', + ISO4217: '368', + }, + IRR: { + symbol: '\ufdfc', + name: 'Iran Rial', + ISO4217: '364', + }, + ISK: { + symbol: 'kr', + name: 'Iceland Krona', + decimals: 0, + ISO4217: '352', + }, + JMD: { + symbol: 'J$', + name: 'Jamaican Dollar', + ISO4217: '388', + }, + JOD: { + symbol: 'JOD', + name: 'Jordanian Dinar', + ISO4217: '400', + }, + JPY: { + symbol: '\u00a5', + name: 'Japanese Yen', + decimals: 0, + ISO4217: '392', + }, + KES: { + symbol: 'KSh', + name: 'Kenyan Shilling', + ISO4217: '404', + }, + KGS: { + symbol: 'KGS', + name: 'Kyrgyzstani Som', + ISO4217: '417', + }, + KHR: { + symbol: 'KHR', + name: 'Cambodia Riel', + ISO4217: '116', + }, + KMF: { + symbol: 'CF', + name: 'Comoros Franc', + ISO4217: '174', + }, + KPW: { + symbol: 'KP\u20a9', + name: 'North Korean Won', + ISO4217: '408', + }, + KRW: { + symbol: '\u20a9', + name: 'Korean Won', + ISO4217: '410', + }, + KWD: { + symbol: 'KWD', + name: 'Kuwaiti Dinar', + ISO4217: '414', + }, + KYD: { + symbol: 'CI$', + name: 'Cayman Islands Dollar', + ISO4217: '136', + }, + KZT: { + symbol: '\u3012', + name: 'Kazakhstan Tenge', + ISO4217: '398', + }, + LAK: { + symbol: '\u20ad', + name: 'Lao Kip', + ISO4217: '418', + }, + LBP: { + symbol: 'LBP', + name: 'Lebanese Pound', + ISO4217: '422', + }, + LKR: { + symbol: 'SL\u20a8', + name: 'Sri Lanka Rupee', + ISO4217: '144', + }, + LRD: { + symbol: 'L$', + name: 'Liberian Dollar', + ISO4217: '430', + }, + LSL: { + symbol: 'M', + name: 'Lesotho Loti', + ISO4217: '426', + }, + LTL: { + symbol: 'Lt', + name: 'Lithuanian Lita', + retirementDate: '2015-08-22', + retired: true, + ISO4217: '440', + }, + LVL: { + symbol: 'Ls', + name: 'Latvian Lat', + ISO4217: '428', + retired: true, + }, + LYD: { + symbol: 'LYD', + name: 'Libyan Dinar', + ISO4217: '434', + }, + MAD: { + symbol: 'MAD', + name: 'Moroccan Dirham', + ISO4217: '504', + }, + MDL: { + symbol: 'MDL', + name: 'Moldovan Leu', + ISO4217: '498', + }, + MGA: { + symbol: 'MGA', + name: 'Malagasy Ariary', + ISO4217: '969', + }, + MKD: { + symbol: '\u0434\u0435\u043d', + name: 'Macedonian Denar', + ISO4217: '807', + }, + MMK: { + symbol: 'Ks', + name: 'Myanmar Kyat', + ISO4217: '104', + }, + MNT: { + symbol: '\u20ae', + name: 'Mongolian Tugrik', + ISO4217: '496', + }, + MOP: { + symbol: 'MOP$', + name: 'Macau Pataca', + ISO4217: '446', + }, + MRO: { + symbol: 'UM', + name: 'Mauritania Ougulya', + decimals: 0, + retired: true, + retirementDate: '2018-07-11', + ISO4217: '478', + }, + MRU: { + symbol: 'UM', + name: 'Mauritania Ougulya', + decimals: 0, + ISO4217: '', + }, + MUR: { + symbol: 'Rs', + name: 'Mauritius Rupee', + ISO4217: '480', + }, + MVR: { + symbol: 'Rf', + name: 'Maldives Rufiyaa', + ISO4217: '462', + }, + MWK: { + symbol: 'MK', + name: 'Malawi Kwacha', + ISO4217: '454', + }, + MXN: { + symbol: 'Mex$', + name: 'Mexican Peso', + ISO4217: '484', + }, + MYR: { + symbol: 'RM', + name: 'Malaysian Ringgit', + ISO4217: '458', + }, + MZN: { + symbol: 'MTn', + name: 'Mozambican Metical', + ISO4217: '943', + }, + NAD: { + symbol: 'N$', + name: 'Namibian Dollar', + ISO4217: '516', + }, + NGN: { + symbol: '\u20a6', + name: 'Nigerian Naira', + ISO4217: '566', + }, + NIO: { + symbol: 'NIO', + name: 'Nicaragua Cordoba', + ISO4217: '558', + }, + NOK: { + symbol: 'Nkr', + name: 'Norwegian Krone', + ISO4217: '578', + }, + NPR: { + symbol: '\u20a8', + name: 'Nepalese Rupee', + ISO4217: '524', + }, + NZD: { + symbol: 'NZ$', + name: 'New Zealand Dollar', + ISO4217: '554', + }, + OMR: { + symbol: 'OMR', + name: 'Omani Rial', + ISO4217: '512', + }, + PAB: { + symbol: 'B', + name: 'Panama Balboa', + ISO4217: '590', + }, + PEN: { + symbol: 'S/.', + name: 'Peruvian Nuevo Sol', + ISO4217: '604', + }, + PGK: { + symbol: 'K', + name: 'Papua New Guinea Kina', + ISO4217: '598', + }, + PHP: { + symbol: '\u20b1', + name: 'Philippine Peso', + ISO4217: '608', + }, + PKR: { + symbol: 'Rs', + name: 'Pakistani Rupee', + ISO4217: '586', + }, + PLN: { + symbol: 'z\u0142', + name: 'Polish Zloty', + ISO4217: '985', + }, + PYG: { + symbol: '\u20b2', + name: 'Paraguayan Guarani', + ISO4217: '600', + }, + QAR: { + symbol: 'QAR', + name: 'Qatar Rial', + ISO4217: '634', + }, + RON: { + symbol: 'RON', + name: 'Romanian New Leu', + ISO4217: '946', + }, + RSD: { + symbol: '\u0420\u0421\u0414', + name: 'Serbian Dinar', + ISO4217: '941', + }, + RUB: { + symbol: '\u20bd', + name: 'Russian Rouble', + ISO4217: '643', + }, + RWF: { + symbol: 'RF', + name: 'Rwanda Franc', + decimals: 0, + ISO4217: '646', + }, + SAR: { + symbol: 'SAR', + name: 'Saudi Arabian Riyal', + ISO4217: '682', + }, + SBD: { + symbol: 'SI$', + name: 'Solomon Islands Dollar', + ISO4217: '090', + }, + SCR: { + symbol: 'SR', + name: 'Seychelles Rupee', + ISO4217: '690', + }, + SDG: { + symbol: 'SDG', + name: 'Sudanese Pound', + ISO4217: '938', + }, + SEK: { + symbol: 'Skr', + name: 'Swedish Krona', + ISO4217: '752', + }, + SGD: { + symbol: 'S$', + name: 'Singapore Dollar', + ISO4217: '702', + }, + SHP: { + symbol: '\u00a3S', + name: 'St Helena Pound', + ISO4217: '654', + }, + SLL: { + symbol: 'Le', + name: 'Sierra Leone Leone', + ISO4217: '694', + }, + SOS: { + symbol: 'So.', + name: 'Somali Shilling', + ISO4217: '706', + }, + SRD: { + symbol: 'SRD', + name: 'Surinamese Dollar', + ISO4217: '968', + }, + STD: { + symbol: 'Db', + name: 'Sao Tome Dobra', + retired: true, + retirementDate: '2018-07-11', + ISO4217: '678', + }, + STN: { + symbol: 'Db', + name: 'Sao Tome Dobra', + ISO4217: '', + }, + SVC: { + symbol: 'SVC', + name: 'El Salvador Colon', + ISO4217: '222', + }, + SYP: { + symbol: 'SYP', + name: 'Syrian Pound', + ISO4217: '760', + }, + SZL: { + symbol: 'E', + name: 'Swaziland Lilageni', + ISO4217: '748', + }, + THB: { + symbol: '\u0e3f', + name: 'Thai Baht', + ISO4217: '764', + }, + TJS: { + symbol: 'TJS', + name: 'Tajikistani Somoni', + ISO4217: '972', + }, + TMT: { + symbol: 'm', + name: 'Turkmenistani Manat', + ISO4217: '934', + }, + TND: { + symbol: 'TND', + name: 'Tunisian Dinar', + ISO4217: '788', + }, + TOP: { + symbol: 'T$', + name: "Tonga Pa'ang", + ISO4217: '776', + }, + TRY: { + symbol: 'TL', + name: 'Turkish Lira', + ISO4217: '949', + }, + TTD: { + symbol: 'TT$', + name: 'Trinidad & Tobago Dollar', + ISO4217: '780', + }, + TWD: { + symbol: 'NT$', + name: 'Taiwan Dollar', + ISO4217: '901', + }, + TZS: { + symbol: 'TZS', + name: 'Tanzanian Shilling', + ISO4217: '834', + }, + UAH: { + symbol: '\u20b4', + name: 'Ukraine Hryvnia', + ISO4217: '980', + }, + UGX: { + symbol: 'USh', + name: 'Ugandan Shilling', + decimals: 0, + ISO4217: '800', + }, + USD: { + symbol: '$', + name: 'United States Dollar', + ISO4217: '840', + }, + UYU: { + symbol: '$U', + name: 'Uruguayan New Peso', + ISO4217: '858', + }, + UZS: { + symbol: 'UZS', + name: 'Uzbekistani Som', + ISO4217: '860', + }, + VEB: { + symbol: 'Bs.', + name: 'Venezuelan Bolivar', + retired: true, + retirementDate: '2008-02-01', + ISO4217: '', + }, + VEF: { + symbol: 'Bs.F', + name: 'Venezuelan Bolivar Fuerte', + retired: true, + retirementDate: '2018-08-20', + ISO4217: '937', + }, + VES: { + symbol: 'Bs.S', + name: 'Venezuelan Bolivar Soberano', + ISO4217: '928', + }, + VND: { + symbol: '\u20ab', + name: 'Vietnam Dong', + decimals: 0, + ISO4217: '704', + }, + VUV: { + symbol: 'Vt', + name: 'Vanuatu Vatu', + ISO4217: '548', + }, + WST: { + symbol: 'WS$', + name: 'Samoa Tala', + ISO4217: '882', + }, + XAF: { + symbol: 'FCFA', + name: 'CFA Franc (BEAC)', + decimals: 0, + ISO4217: '950', + }, + XCD: { + symbol: 'EC$', + name: 'East Caribbean Dollar', + ISO4217: '951', + }, + XOF: { + symbol: 'CFA', + name: 'CFA Franc (BCEAO)', + decimals: 0, + ISO4217: '952', + }, + XPF: { + symbol: 'XPF', + name: 'Pacific Franc', + decimals: 0, + ISO4217: '953', + }, + YER: { + symbol: 'YER', + name: 'Yemen Riyal', + ISO4217: '886', + }, + ZAR: { + symbol: 'R', + name: 'South African Rand', + ISO4217: '710', + }, + ZMK: { + symbol: 'ZK', + name: 'Zambian Kwacha', + retired: true, + retirementDate: '2013-01-01', + ISO4217: '894', + }, + ZMW: { + symbol: 'ZMW', + name: 'Zambian Kwacha', + cacheBurst: 1, + ISO4217: '967', + }, + }, + }, + { + onyxMethod: 'merge', + key: 'nvp_priorityMode', + value: 'default', + }, + { + onyxMethod: 'merge', + key: 'isFirstTimeNewExpensifyUser', + value: false, + }, + { + onyxMethod: 'merge', + key: 'preferredLocale', + value: 'en', + }, + { + onyxMethod: 'merge', + key: 'preferredEmojiSkinTone', + value: -1, + }, + { + onyxMethod: 'set', + key: 'frequentlyUsedEmojis', + value: [ + { + code: '\ud83e\udd11', + count: 155, + keywords: ['rich', 'money_mouth_face', 'face', 'money', 'mouth'], + lastUpdatedAt: 1669657594, + name: 'money_mouth_face', + }, + { + code: '\ud83e\udd17', + count: 91, + keywords: ['hugs', 'face', 'hug', 'hugging'], + lastUpdatedAt: 1669660894, + name: 'hugs', + }, + { + code: '\ud83d\ude0d', + count: 68, + keywords: ['love', 'crush', 'heart_eyes', 'eye', 'face', 'heart', 'smile'], + lastUpdatedAt: 1669659126, + name: 'heart_eyes', + }, + { + code: '\ud83e\udd14', + count: 56, + keywords: ['thinking', 'face'], + lastUpdatedAt: 1669661008, + name: 'thinking', + }, + { + code: '\ud83d\ude02', + count: 55, + keywords: ['tears', 'joy', 'face', 'laugh', 'tear'], + lastUpdatedAt: 1670346435, + name: 'joy', + }, + { + code: '\ud83d\ude05', + count: 41, + keywords: ['hot', 'sweat_smile', 'cold', 'face', 'open', 'smile', 'sweat'], + lastUpdatedAt: 1670346845, + name: 'sweat_smile', + }, + { + code: '\ud83d\ude04', + count: 37, + keywords: ['happy', 'joy', 'laugh', 'pleased', 'smile', 'eye', 'face', 'mouth', 'open'], + lastUpdatedAt: 1669659306, + name: 'smile', + }, + { + code: '\ud83d\ude18', + count: 27, + keywords: ['face', 'heart', 'kiss'], + lastUpdatedAt: 1670346848, + name: 'kissing_heart', + }, + { + code: '\ud83e\udd23', + count: 25, + keywords: ['lol', 'laughing', 'rofl', 'face', 'floor', 'laugh', 'rolling'], + lastUpdatedAt: 1669659311, + name: 'rofl', + }, + { + code: '\ud83d\ude0b', + count: 18, + keywords: ['tongue', 'lick', 'yum', 'delicious', 'face', 'savouring', 'smile', 'um'], + lastUpdatedAt: 1669658204, + name: 'yum', + }, + { + code: '\ud83d\ude0a', + count: 17, + keywords: ['proud', 'blush', 'eye', 'face', 'smile'], + lastUpdatedAt: 1669661018, + name: 'blush', + }, + { + code: '\ud83d\ude06', + count: 17, + keywords: ['happy', 'haha', 'laughing', 'satisfied', 'face', 'laugh', 'mouth', 'open', 'smile'], + lastUpdatedAt: 1669659070, + name: 'laughing', + }, + { + code: '\ud83d\ude10', + count: 17, + keywords: ['deadpan', 'face', 'neutral'], + lastUpdatedAt: 1669658922, + name: 'neutral_face', + }, + { + code: '\ud83d\ude03', + count: 17, + keywords: ['happy', 'joy', 'haha', 'smiley', 'face', 'mouth', 'open', 'smile'], + lastUpdatedAt: 1669636981, + name: 'smiley', + }, + { + code: '\ud83d\ude17', + count: 15, + keywords: ['face', 'kiss'], + lastUpdatedAt: 1669639079, + name: 'kissing', + }, + { + code: '\ud83d\ude1a', + count: 14, + keywords: ['kissing_closed_eyes', 'closed', 'eye', 'face', 'kiss'], + lastUpdatedAt: 1669660248, + name: 'kissing_closed_eyes', + }, + { + code: '\ud83d\ude19', + count: 12, + keywords: ['kissing_smiling_eyes', 'eye', 'face', 'kiss', 'smile'], + lastUpdatedAt: 1669658208, + name: 'kissing_smiling_eyes', + }, + { + code: '\ud83e\udd10', + count: 11, + keywords: ['face', 'mouth', 'zipper'], + lastUpdatedAt: 1670346432, + name: 'zipper_mouth_face', + }, + { + code: '\ud83d\ude25', + count: 11, + keywords: ['disappointed', 'face', 'relieved', 'whew'], + lastUpdatedAt: 1669660257, + name: 'disappointed_relieved', + }, + { + code: '\ud83d\ude0e', + count: 11, + keywords: ['bright', 'cool', 'eye', 'eyewear', 'face', 'glasses', 'smile', 'sun', 'sunglasses', 'weather'], + lastUpdatedAt: 1669660252, + name: 'sunglasses', + }, + { + code: '\ud83d\ude36', + count: 11, + keywords: ['face', 'mouth', 'quiet', 'silent'], + lastUpdatedAt: 1669659075, + name: 'no_mouth', + }, + { + code: '\ud83d\ude11', + count: 11, + keywords: ['expressionless', 'face', 'inexpressive', 'unexpressive'], + lastUpdatedAt: 1669640332, + name: 'expressionless', + }, + { + code: '\ud83d\ude0f', + count: 11, + keywords: ['face', 'smirk'], + lastUpdatedAt: 1666207075, + name: 'smirk', + }, + { + code: '\ud83e\udd70', + count: 1, + keywords: ['love', 'smiling_face_with_three_hearts'], + lastUpdatedAt: 1670581230, + name: 'smiling_face_with_three_hearts', + }, + ], + }, + { + onyxMethod: 'merge', + key: 'private_blockedFromConcierge', + value: {}, + }, + { + onyxMethod: 'merge', + key: 'user', + value: { + isSubscribedToNewsletter: true, + validated: true, + isUsingExpensifyCard: true, + }, + }, + { + onyxMethod: 'set', + key: 'loginList', + value: { + 'applausetester+perf2@applause.expensifail.com': { + partnerName: 'expensify.com', + partnerUserID: 'applausetester+perf2@applause.expensifail.com', + validatedDate: '2022-08-01 05:00:48', + }, + }, + }, + { + onyxMethod: 'merge', + key: 'personalDetailsList', + value: { + 1: { + accountID: 1, + login: 'fake2@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/7a1fd3cdd41564cf04f4305140372b59d1dcd495_128.jpeg', + displayName: 'fake2@gmail.com', + pronouns: '__predefined_zeHirHirs', + timezone: { + automatic: false, + selected: 'Europe/Monaco', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 2: { + accountID: 2, + login: 'fake1@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/d76dfb6912a0095cbfd2a02f64f4d9d2d9c33c29_128.jpeg', + displayName: '"Chat N Laz"', + pronouns: '__predefined_theyThemTheirs', + timezone: { + automatic: true, + selected: 'Europe/Athens', + }, + firstName: '"Chat N', + lastName: 'Laz"', + phoneNumber: '', + validated: true, + }, + 3: { + accountID: 3, + login: 'fake4@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/e769e0edf5fd0bc11cfa7c39ec2605c5310d26de_128.jpeg', + displayName: 'fake4@gmail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Kyiv', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 4: { + accountID: 4, + login: 'fake3@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/301e37631eca9e3127d6b668822e3a53771551f6_128.jpeg', + displayName: '123 Ios', + pronouns: '__predefined_perPers', + timezone: { + automatic: false, + selected: 'Europe/Helsinki', + }, + firstName: '123', + lastName: 'Ios', + phoneNumber: '', + validated: true, + }, + 5: { + accountID: 5, + login: 'fake5@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/2810a38b66d9a60fe41a9cf39c9fd6ecbe2cb35f_128.jpeg', + displayName: 'Qqq Qqq', + pronouns: '__predefined_sheHerHers', + timezone: { + automatic: false, + selected: 'Europe/Lisbon', + }, + firstName: 'Qqq', + lastName: 'Qqq', + phoneNumber: '', + validated: true, + }, + 6: { + accountID: 6, + login: 'andreylazutkinutest@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/2af13161ffcc95fc807769bb22c013c32280f338_128.jpeg', + displayName: 'Main Ios🏴󠁧󠁢󠁳󠁣󠁴󠁿ios', + pronouns: '__predefined_heHimHis', + timezone: { + automatic: false, + selected: 'Europe/London', + }, + firstName: 'Main', + lastName: 'Ios🏴󠁧󠁢󠁳󠁣󠁴󠁿ios', + phoneNumber: '', + validated: true, + }, + 7: { + accountID: 7, + login: 'applausetester+0604lsn@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/ad20184a011ed54383d69e4fe68658522583cbb8_128.jpeg', + displayName: '0604 Lsn', + pronouns: '__predefined_zeHirHirs', + timezone: { + automatic: false, + selected: 'America/Costa_Rica', + }, + firstName: '0604', + lastName: 'Lsn', + phoneNumber: '', + validated: true, + }, + 8: { + accountID: 8, + login: 'applausetester+0704sveta@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/63cc4a392cc64ba1c8f6a1b90d5f1441a23270d1_128.jpeg', + displayName: '07 04 0704 Lsn lsn', + pronouns: '__predefined_callMeByMyName', + timezone: { + automatic: false, + selected: 'Africa/Freetown', + }, + firstName: '07 04 0704', + lastName: 'Lsn lsn', + phoneNumber: '', + validated: true, + }, + 9: { + accountID: 9, + login: 'applausetester+0707abb@applause.expensifail.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_5.png', + displayName: 'Katya Becciv', + pronouns: '__predefined_sheHerHers', + timezone: { + automatic: false, + selected: 'America/New_York', + }, + firstName: 'Katya', + lastName: 'Becciv', + phoneNumber: '', + validated: true, + }, + 10: { + accountID: 10, + login: 'applausetester+0901abb@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/0f6e999ba61695599f092b7652c1e159aee62c65_128.jpeg', + displayName: 'Katie Becciv', + pronouns: '__predefined_faeFaer', + timezone: { + automatic: false, + selected: 'Africa/Accra', + }, + firstName: 'Katie', + lastName: 'Becciv', + phoneNumber: '', + validated: true, + }, + 11: { + accountID: 11, + login: 'applausetester+1904lsn@applause.expensifail.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_5.png', + displayName: '11 11', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Athens', + }, + firstName: '11', + lastName: '11', + phoneNumber: '', + validated: true, + }, + 12: { + accountID: 12, + login: 'applausetester+42222abb@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/d166c112f300a6e30bc70752cd394c3fde099e4f_128.jpeg', + displayName: '"First"', + pronouns: '', + timezone: { + automatic: true, + selected: 'America/New_York', + }, + firstName: '"First"', + lastName: '', + phoneNumber: '', + validated: true, + }, + 13: { + accountID: 13, + login: 'applausetester+bernardo@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/803733b7038bbd5e543315fa9c6c0118eda227af_128.jpeg', + displayName: 'bernardo utest', + pronouns: '', + timezone: { + automatic: true, + selected: 'America/Los_Angeles', + }, + firstName: 'bernardo', + lastName: 'utest', + phoneNumber: '', + validated: false, + }, + 14: { + accountID: 14, + login: 'applausetester+ihchat4@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/1008dcaadc12badbddf4720dcb7ad99b7384c613_128.jpeg', + displayName: 'Chat HT', + pronouns: '__predefined_callMeByMyName', + timezone: { + automatic: true, + selected: 'Europe/Kyiv', + }, + firstName: 'Chat', + lastName: 'HT', + phoneNumber: '', + validated: true, + }, + 15: { + accountID: 15, + login: 'applausetester+pd1005@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/86c9b7dce35aea83b69c6e825a4b3d00a87389b7_128.jpeg', + displayName: 'applausetester+pd1005@applause.expensifail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Lisbon', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 16: { + accountID: 16, + login: 'fake6@gmail.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_7.png', + displayName: 'fake6@gmail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Warsaw', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 17: { + accountID: 17, + login: 'applausetester+perf2@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/1486f9cc6367d8c399ee453ad5b686d157bb4dda_128.jpeg', + displayName: 'applausetester+perf2@applause.expensifail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'America/Los_Angeles', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + localCurrencyCode: 'USD', + }, + 18: { + accountID: 18, + login: 'fake7@gmail.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_2.png', + displayName: 'fake7@gmail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'America/Toronto', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 19: { + accountID: 19, + login: 'fake8@gmail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/7b0a9cf9c93987053be9d6cc707cb1f091a1ef46_128.jpeg', + displayName: 'fake8@gmail.com', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Paris', + }, + firstName: '', + lastName: '', + phoneNumber: '', + validated: true, + }, + 20: { + accountID: 20, + login: 'applausetester@applause.expensifail.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/8ddbb1a4675883ea12b3021f698a8b2dcfc18d42_128.jpeg', + displayName: 'Applause Main Account', + pronouns: '__predefined_coCos', + timezone: { + automatic: true, + selected: 'Europe/Kyiv', + }, + firstName: 'Applause', + lastName: 'Main Account', + phoneNumber: '', + validated: true, + }, + 21: { + accountID: 21, + login: 'christoph+hightraffic@margelo.io', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_1.png', + displayName: 'Christoph Pader', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Vienna', + }, + firstName: 'Christoph', + lastName: 'Pader', + phoneNumber: '', + validated: true, + }, + 22: { + accountID: 22, + login: 'concierge@expensify.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/icons/concierge_2022.png', + displayName: 'Concierge', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Moscow', + }, + firstName: 'Concierge', + lastName: '', + phoneNumber: '', + validated: true, + }, + 23: { + accountID: 23, + login: 'svetlanalazutkinautest+0211@gmail.com', + avatar: 'https://d2k5nsl2zxldvw.cloudfront.net/images/avatars/avatar_6.png', + displayName: 'Chat S', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Kyiv', + }, + firstName: 'Chat S', + lastName: '', + phoneNumber: '', + validated: true, + }, + 24: { + accountID: 24, + login: 'tayla.lay@team.expensify.com', + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/d3196c27ed6bdb2df741af29a3ccfdb0f9919c41_128.jpeg', + displayName: 'Tayla Simmons', + pronouns: '__predefined_sheHerHers', + timezone: { + automatic: true, + selected: 'America/Chicago', + }, + firstName: 'Tayla', + lastName: 'Simmons', + phoneNumber: '', + validated: true, + }, + }, + }, + { + onyxMethod: 'set', + key: 'betas', + value: ['all'], + }, + { + onyxMethod: 'merge', + key: 'countryCode', + value: 1, + }, + { + onyxMethod: 'merge', + key: 'account', + value: { + requiresTwoFactorAuth: false, + }, + }, + { + onyxMethod: 'mergecollection', + key: 'policy_', + value: { + policy_28493C792FA01DAE: { + isFromFullPolicy: false, + id: '28493C792FA01DAE', + name: "applausetester+perf2's Expenses", + role: 'admin', + type: 'personal', + owner: 'applausetester+perf2@applause.expensifail.com', + outputCurrency: 'USD', + avatar: '', + employeeList: [], + }, + policy_A6511FF8D2EE7661: { + isFromFullPolicy: false, + id: 'A6511FF8D2EE7661', + name: "Applause's Workspace", + role: 'admin', + type: 'free', + owner: 'applausetester+perf2@applause.expensifail.com', + outputCurrency: 'INR', + avatar: '', + employeeList: [], + }, + }, + }, + { + onyxMethod: 'mergecollection', + key: 'report_', + value: { + report_98258097: { + reportID: '98258097', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [22], + isPinned: true, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-03 06:45:00', + lastMessageTimestamp: 1659509100000, + lastMessageText: 'You can easily track, approve, and pay bills in Expensify with your custom compa', + lastActorAccountID: 22, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: + 'You can easily track, approve, and pay bills in Expensify with your custom company bill pay email address: ' + + 'applause.expensifail.com@expensify.cash. Learn more ' + + 'here.' + + ' For questions, just reply to this message.', + }, + report_98258458: { + reportID: '98258458', + reportName: '', + chatType: 'policyExpenseChat', + ownerAccountID: 17, + policyID: 'C28C2634DD7226B8', + participantAccountIDs: [20, 17], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-11-03 20:30:55.599', + lastMessageTimestamp: 1667507455599, + lastMessageText: '', + lastActorAccountID: 20, + notificationPreference: 'always', + stateNum: 2, + statusNum: 2, + oldPolicyName: 'Crowded Policy - Definitive Edition', + visibility: null, + isOwnPolicyExpenseChat: true, + lastMessageHtml: '', + }, + report_98344717: { + reportID: '98344717', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [14], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-02 20:03:42', + lastMessageTimestamp: 1659470622000, + lastMessageText: 'Requested \u20b41.67 from applausetester+perf2@applause.expensifail.com', + lastActorAccountID: 14, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Requested \u20b41.67 from applausetester+perf2@applause.expensifail.com', + }, + report_98345050: { + reportID: '98345050', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [4], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-11-04 21:18:00.038', + lastMessageTimestamp: 1667596680038, + lastMessageText: 'Cancelled the \u20b440.00 request', + lastActorAccountID: 4, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Cancelled the \u20b440.00 request', + }, + report_98345315: { + reportID: '98345315', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [4, 16, 18, 19], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-01 20:48:16', + lastMessageTimestamp: 1659386896000, + lastMessageText: 'applausetester+perf2@applause.expensifail.com', + lastActorAccountID: 4, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'applausetester+perf2@applause.expensifail.com', + }, + report_98345625: { + reportID: '98345625', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [2, 1, 4, 3, 5, 16, 18, 19], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-01 20:49:11', + lastMessageTimestamp: 1659386951000, + lastMessageText: 'Say hello\ud83d\ude10', + lastActorAccountID: 4, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Say hello\ud83d\ude10', + }, + report_98345679: { + reportID: '98345679', + reportName: '', + chatType: 'policyExpenseChat', + ownerAccountID: 17, + policyID: '1CE001C4B9F3CA54', + participantAccountIDs: [4, 17], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-16 12:30:57', + lastMessageTimestamp: 1660653057000, + lastMessageText: '', + lastActorAccountID: 4, + notificationPreference: 'always', + stateNum: 2, + statusNum: 2, + oldPolicyName: "Andreylazutkinutest+123's workspace", + visibility: null, + isOwnPolicyExpenseChat: true, + lastMessageHtml: '', + }, + report_98414813: { + reportID: '98414813', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [14, 16], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-08-02 20:03:41', + lastMessageTimestamp: 1659470621000, + lastMessageText: 'Split \u20b45.00 with applausetester+perf2@applause.expensifail.com and applauseteste', + lastActorAccountID: 14, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Split \u20b45.00 with applausetester+perf2@applause.expensifail.com and fake6@gmail.com', + }, + report_98817646: { + reportID: '98817646', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [16], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-12-09 10:17:18.362', + lastMessageTimestamp: 1670581038362, + lastMessageText: 'RR', + lastActorAccountID: 17, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'RR', + iouReportID: '2543745284790730', + }, + report_358751490033727: { + reportID: '358751490033727', + reportName: '#digimobileroom', + chatType: 'policyRoom', + ownerAccountID: 0, + policyID: 'C28C2634DD7226B8', + participantAccountIDs: [15], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-10-12 17:47:45.228', + lastMessageTimestamp: 1665596865228, + lastMessageText: 'STAGING_CHAT_MESSAGE_A2C534B7-3509-416E-A0AD-8463831C29DD', + lastActorAccountID: 25, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: 'restricted', + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'STAGING_CHAT_MESSAGE_A2C534B7-3509-416E-A0AD-8463831C29DD', + }, + report_663424408122117: { + reportID: '663424408122117', + reportName: '#announce', + chatType: 'policyAnnounce', + ownerAccountID: 0, + policyID: 'A6511FF8D2EE7661', + participantAccountIDs: [17], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '', + }, + report_944123936554214: { + reportID: '944123936554214', + reportName: '', + chatType: 'policyExpenseChat', + ownerAccountID: 17, + policyID: 'A6511FF8D2EE7661', + participantAccountIDs: [17], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: true, + lastMessageHtml: '', + }, + report_2242399088152511: { + reportID: '2242399088152511', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [22, 10, 6, 8, 4], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-11-03 20:48:58.815', + lastMessageTimestamp: 1667508538815, + lastMessageText: 'Hi there, thanks for reaching out! How may I help?', + lastActorAccountID: 22, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '

Hi there, thanks for reaching out! How may I help?

', + }, + report_2576922422943214: { + reportID: '2576922422943214', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [12], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-12-01 08:05:11.009', + lastMessageTimestamp: 1669881911009, + lastMessageText: 'Test', + lastActorAccountID: 17, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Test', + }, + report_2752461403207161: { + reportID: '2752461403207161', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [2], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '', + }, + report_3785654888638968: { + reportID: '3785654888638968', + reportName: '#jack', + chatType: 'policyRoom', + ownerAccountID: 0, + policyID: 'C28C2634DD7226B8', + participantAccountIDs: [15], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-10-12 12:20:00.668', + lastMessageTimestamp: 1665577200668, + lastMessageText: 'Room renamed to #jack', + lastActorAccountID: 15, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: 'restricted', + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Room renamed to #jack', + }, + report_4867098979334014: { + reportID: '4867098979334014', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [21], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-12-16 18:14:00.208', + lastMessageTimestamp: 1671214440208, + lastMessageText: 'Requested \u20ac200.00 from Christoph for Essen mit Kunden', + lastActorAccountID: 17, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Requested \u20ac200.00 from Christoph for Essen mit Kunden', + iouReportID: '4249286573496381', + }, + report_5277760851229035: { + reportID: '5277760851229035', + reportName: '#kasper_tha_cat', + chatType: 'policyRoom', + ownerAccountID: 0, + policyID: 'C28C2634DD7226B8', + participantAccountIDs: [15], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-11-29 12:38:15.985', + lastMessageTimestamp: 1669725495985, + lastMessageText: 'fff', + lastActorAccountID: 16, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: 'restricted', + isOwnPolicyExpenseChat: false, + lastMessageHtml: + 'fff
f
f
f
f
f
f
f
f

f
f
f
f

f
' + + 'f
f
f
f
f

f
f
f
f
f
ff', + }, + report_5324367938904284: { + reportID: '5324367938904284', + reportName: '#applause.expensifail.com', + chatType: 'domainAll', + ownerAccountID: 99, + policyID: '_FAKE_', + participantAccountIDs: [13], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-11-29 21:08:00.793', + lastMessageTimestamp: 1669756080793, + lastMessageText: 'Iviviviv8b', + lastActorAccountID: 10, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Iviviviv8b', + }, + report_5654270288238256: { + reportID: '5654270288238256', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [6, 2, 9, 4, 5, 7, 100, 11], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '', + }, + report_6194900075541844: { + reportID: '6194900075541844', + reportName: '#admins', + chatType: 'policyAdmins', + ownerAccountID: 0, + policyID: 'A6511FF8D2EE7661', + participantAccountIDs: [17], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '', + }, + report_6801643744224146: { + reportID: '6801643744224146', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [22, 6, 2, 23, 9, 4, 5, 7], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-09-15 12:57:59.526', + lastMessageTimestamp: 1663246679526, + lastMessageText: "\ud83d\udc4b Welcome to Expensify! I'm Concierge. Is there anything I can help with? Click ", + lastActorAccountID: 22, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: + "\ud83d\udc4b Welcome to Expensify! I'm Concierge. Is there anything I can help with? Click the + icon on the homescreen to explore the features you can use.", + }, + report_7658708888047100: { + reportID: '7658708888047100', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [22, 6, 4, 5, 24, 101], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-09-16 11:12:46.739', + lastMessageTimestamp: 1663326766739, + lastMessageText: 'Hi there! How can I help?\u00a0', + lastActorAccountID: 22, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Hi there! How can I help?\u00a0', + }, + report_7756405299640824: { + reportID: '7756405299640824', + reportName: '#jackd23', + chatType: 'policyRoom', + ownerAccountID: 0, + policyID: 'C28C2634DD7226B8', + participantAccountIDs: [15], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '2022-10-12 12:46:43.577', + lastMessageTimestamp: 1665578803577, + lastMessageText: 'Room renamed to #jackd23', + lastActorAccountID: 15, + notificationPreference: 'daily', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: 'restricted', + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'Room renamed to #jackd23', + }, + report_7819732651025410: { + reportID: '7819732651025410', + reportName: 'Chat Report', + chatType: null, + ownerAccountID: 0, + policyID: '_FAKE_', + participantAccountIDs: [5], + isPinned: false, + lastReadCreated: '1980-01-01 00:00:00.000', + lastVisibleActionCreated: '', + lastMessageTimestamp: 0, + lastMessageText: '', + lastActorAccountID: 0, + notificationPreference: 'always', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: '', + }, + report_2543745284790730: { + reportID: '2543745284790730', + ownerAccountID: 17, + managerID: 16, + currency: 'USD', + chatReportID: '98817646', + cachedTotal: '($1,473.11)', + total: 147311, + stateNum: 1, + statusNum: 1, + }, + report_4249286573496381: { + reportID: '4249286573496381', + ownerAccountID: 17, + managerID: 21, + currency: 'USD', + chatReportID: '4867098979334014', + cachedTotal: '($212.78)', + total: 21278, + stateNum: 1, + statusNum: 1, + }, + }, + }, + ], + jsonCode: 200, + requestID: '783ef7fac81f969a-SJC', +}); + +export default openApp; diff --git a/src/libs/E2E/apiMocks/openReport.ts b/src/libs/E2E/apiMocks/openReport.ts new file mode 100644 index 000000000000..49d44605592d --- /dev/null +++ b/src/libs/E2E/apiMocks/openReport.ts @@ -0,0 +1,1972 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type Response from '@src/types/onyx/Response'; + +export default (): Response => ({ + onyxData: [ + { + onyxMethod: 'merge', + key: 'report_98345625', + value: { + reportID: '98345625', + reportName: 'Chat Report', + type: 'chat', + chatType: null, + ownerAccountID: 0, + managerID: 0, + policyID: '_FAKE_', + participantAccountIDs: [14567013], + isPinned: false, + lastReadTime: '2023-09-14 11:50:21.768', + lastMentionedTime: '2023-07-27 07:37:43.100', + lastReadSequenceNumber: 0, + lastVisibleActionCreated: '2023-08-29 12:38:16.070', + lastVisibleActionLastModified: '2023-08-29 12:38:16.070', + lastMessageText: 'terry+hightraffic@margelo.io owes \u20ac12.00', + lastActorAccountID: 14567013, + notificationPreference: 'always', + welcomeMessage: '', + stateNum: 0, + statusNum: 0, + oldPolicyName: '', + visibility: null, + isOwnPolicyExpenseChat: false, + lastMessageHtml: 'terry+hightraffic@margelo.io owes \u20ac12.00', + iouReportID: '206636935813547', + hasOutstandingChildRequest: false, + policyName: null, + hasParentAccess: null, + parentReportID: null, + parentReportActionID: null, + writeCapability: 'all', + description: null, + isDeletedParentAction: null, + total: 0, + currency: 'USD', + chatReportID: null, + isWaitingOnBankAccount: false, + }, + }, + { + onyxMethod: 'mergecollection', + key: 'transactions_', + value: { + transactions_5509240412000765850: { + amount: 1200, + billable: false, + cardID: 15467728, + category: '', + comment: { + comment: '', + }, + created: '2023-08-29', + currency: 'EUR', + filename: '', + merchant: 'Request', + modifiedAmount: 0, + modifiedCreated: '', + modifiedCurrency: '', + modifiedMerchant: '', + originalAmount: 0, + originalCurrency: '', + parentTransactionID: '', + receipt: {}, + reimbursable: true, + reportID: '206636935813547', + status: 'Pending', + tag: '', + transactionID: '5509240412000765850', + hasEReceipt: false, + }, + }, + }, + { + onyxMethod: 'merge', + key: 'reportActions_98345625', + value: { + '885570376575240776': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: '', + text: '', + isEdited: true, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + edits: [], + html: '', + lastModified: '2023-09-01 07:43:29.374', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-31 07:23:52.892', + timestamp: 1693466632, + reportActionTimestamp: 1693466632892, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '885570376575240776', + previousReportActionID: '6576518341807837187', + lastModified: '2023-09-01 07:43:29.374', + whisperedToAccountIDs: [], + }, + '6576518341807837187': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'terry+hightraffic@margelo.io owes \u20ac12.00', + text: 'terry+hightraffic@margelo.io owes \u20ac12.00', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + lastModified: '2023-08-29 12:38:16.070', + linkedReportID: '206636935813547', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-08-29 12:38:16.070', + timestamp: 1693312696, + reportActionTimestamp: 1693312696070, + automatic: false, + actionName: 'REPORTPREVIEW', + shouldShow: true, + reportActionID: '6576518341807837187', + previousReportActionID: '2658221912430757962', + lastModified: '2023-08-29 12:38:16.070', + childReportID: '206636935813547', + childType: 'iou', + childStatusNum: 1, + childStateNum: 1, + childMoneyRequestCount: 1, + whisperedToAccountIDs: [], + }, + '2658221912430757962': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'Hshshdhdhejje
Cuududdke

F
D
R
D
R
Jfj c
D

D
D
R
D
R', + text: 'Hshshdhdhejje\nCuududdke\n\nF\nD\nR\nD\nR\nJfj c\nD\n\nD\nD\nR\nD\nR', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [ + { + emoji: 'heart', + users: [ + { + accountID: 12883048, + skinTone: -1, + }, + ], + }, + ], + }, + ], + originalMessage: { + html: 'Hshshdhdhejje
Cuududdke

F
D
R
D
R
Jfj c
D

D
D
R
D
R', + lastModified: '2023-08-25 12:39:48.121', + reactions: [ + { + emoji: 'heart', + users: [ + { + accountID: 12883048, + skinTone: -1, + }, + ], + }, + ], + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-25 08:54:06.972', + timestamp: 1692953646, + reportActionTimestamp: 1692953646972, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '2658221912430757962', + previousReportActionID: '6551789403725495383', + lastModified: '2023-08-25 12:39:48.121', + childReportID: '1411015346900020', + childType: 'chat', + childOldestFourAccountIDs: '12883048', + childCommenterCount: 1, + childLastVisibleActionCreated: '2023-08-29 06:08:59.247', + childVisibleActionCount: 1, + whisperedToAccountIDs: [], + }, + '6551789403725495383': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'Typing with the composer is now also reasonably fast again', + text: 'Typing with the composer is now also reasonably fast again', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'Typing with the composer is now also reasonably fast again', + lastModified: '2023-08-25 08:53:57.490', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-25 08:53:57.490', + timestamp: 1692953637, + reportActionTimestamp: 1692953637490, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6551789403725495383', + previousReportActionID: '6184477005811241106', + lastModified: '2023-08-25 08:53:57.490', + whisperedToAccountIDs: [], + }, + '6184477005811241106': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: '\ud83d\ude3a', + text: '\ud83d\ude3a', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '\ud83d\ude3a', + lastModified: '2023-08-25 08:53:41.689', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-25 08:53:41.689', + timestamp: 1692953621, + reportActionTimestamp: 1692953621689, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6184477005811241106', + previousReportActionID: '7473953427765241164', + lastModified: '2023-08-25 08:53:41.689', + whisperedToAccountIDs: [], + }, + '7473953427765241164': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'Skkkkkkrrrrrrrr', + text: 'Skkkkkkrrrrrrrr', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'Skkkkkkrrrrrrrr', + lastModified: '2023-08-25 08:53:31.900', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-25 08:53:31.900', + timestamp: 1692953611, + reportActionTimestamp: 1692953611900, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '7473953427765241164', + previousReportActionID: '872421684593496491', + lastModified: '2023-08-25 08:53:31.900', + whisperedToAccountIDs: [], + }, + '872421684593496491': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'hello this is a new test will my version sync though? i doubt it lolasdasdasdaoe f t asdasd okay und das ging jetzt eh oder? ja schaut ganz gut aus okay geht das immer noch ? schaut gut aus ja true ghw test test 2 test 4 tse 3 oida', + text: 'hello this is a new test will my version sync though? i doubt it lolasdasdasdaoe f t asdasd okay und das ging jetzt eh oder? ja schaut ganz gut aus okay geht das immer noch ? schaut gut aus ja true ghw test test 2 test 4 tse 3 oida', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hello this is a new test will my version sync though? i doubt it lolasdasdasdaoe f t asdasd okay und das ging jetzt eh oder? ja schaut ganz gut aus okay geht das immer noch ? schaut gut aus ja true ghw test test 2 test 4 tse 3 oida', + lastModified: '2023-08-11 13:35:03.962', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-11 13:35:03.962', + timestamp: 1691760903, + reportActionTimestamp: 1691760903962, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '872421684593496491', + previousReportActionID: '175680146540578558', + lastModified: '2023-08-11 13:35:03.962', + whisperedToAccountIDs: [], + }, + '175680146540578558': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: '', + text: '[Attachment]', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '', + lastModified: '2023-08-10 06:59:21.381', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-10 06:59:21.381', + timestamp: 1691650761, + reportActionTimestamp: 1691650761381, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '175680146540578558', + previousReportActionID: '1264289784533901723', + lastModified: '2023-08-10 06:59:21.381', + whisperedToAccountIDs: [], + }, + '1264289784533901723': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: '', + text: '[Attachment]', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '', + lastModified: '2023-08-10 06:59:16.922', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-10 06:59:16.922', + timestamp: 1691650756, + reportActionTimestamp: 1691650756922, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '1264289784533901723', + previousReportActionID: '4870277010164688289', + lastModified: '2023-08-10 06:59:16.922', + whisperedToAccountIDs: [], + }, + '4870277010164688289': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'send test', + text: 'send test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'send test', + lastModified: '2023-08-09 06:43:25.209', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-09 06:43:25.209', + timestamp: 1691563405, + reportActionTimestamp: 1691563405209, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4870277010164688289', + previousReportActionID: '7931783095143103530', + lastModified: '2023-08-09 06:43:25.209', + whisperedToAccountIDs: [], + }, + '7931783095143103530': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'hello terry \ud83d\ude04 this is a test @terry+hightraffic@margelo.io', + text: 'hello terry \ud83d\ude04 this is a test @terry+hightraffic@margelo.io', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hello terry \ud83d\ude04 this is a test @terry+hightraffic@margelo.io', + lastModified: '2023-08-08 14:38:45.035', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-08 14:38:45.035', + timestamp: 1691505525, + reportActionTimestamp: 1691505525035, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '7931783095143103530', + previousReportActionID: '4598496324774172433', + lastModified: '2023-08-08 14:38:45.035', + whisperedToAccountIDs: [], + }, + '4598496324774172433': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: '\ud83d\uddff', + text: '\ud83d\uddff', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '\ud83d\uddff', + lastModified: '2023-08-08 13:21:42.102', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-08 13:21:42.102', + timestamp: 1691500902, + reportActionTimestamp: 1691500902102, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4598496324774172433', + previousReportActionID: '3324110555952451144', + lastModified: '2023-08-08 13:21:42.102', + whisperedToAccountIDs: [], + }, + '3324110555952451144': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'test \ud83d\uddff', + text: 'test \ud83d\uddff', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test \ud83d\uddff', + lastModified: '2023-08-08 13:21:32.101', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-08 13:21:32.101', + timestamp: 1691500892, + reportActionTimestamp: 1691500892101, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '3324110555952451144', + previousReportActionID: '5389364980227777980', + lastModified: '2023-08-08 13:21:32.101', + whisperedToAccountIDs: [], + }, + '5389364980227777980': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'okay now it will work again y \ud83d\udc42', + text: 'okay now it will work again y \ud83d\udc42', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'okay now it will work again y \ud83d\udc42', + lastModified: '2023-08-07 10:54:38.141', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-08-07 10:54:38.141', + timestamp: 1691405678, + reportActionTimestamp: 1691405678141, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '5389364980227777980', + previousReportActionID: '4717622390560689493', + lastModified: '2023-08-07 10:54:38.141', + whisperedToAccountIDs: [], + }, + '4717622390560689493': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'hmmmm', + text: 'hmmmm', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hmmmm', + lastModified: '2023-07-27 18:13:45.322', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 18:13:45.322', + timestamp: 1690481625, + reportActionTimestamp: 1690481625322, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4717622390560689493', + previousReportActionID: '745721424446883075', + lastModified: '2023-07-27 18:13:45.322', + whisperedToAccountIDs: [], + }, + '745721424446883075': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'test', + text: 'test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test', + lastModified: '2023-07-27 18:13:32.595', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 18:13:32.595', + timestamp: 1690481612, + reportActionTimestamp: 1690481612595, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '745721424446883075', + previousReportActionID: '3986429677777110818', + lastModified: '2023-07-27 18:13:32.595', + whisperedToAccountIDs: [], + }, + '3986429677777110818': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'I will', + text: 'I will', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'I will', + lastModified: '2023-07-27 17:03:11.250', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 17:03:11.250', + timestamp: 1690477391, + reportActionTimestamp: 1690477391250, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '3986429677777110818', + previousReportActionID: '7317910228472011573', + lastModified: '2023-07-27 17:03:11.250', + childReportID: '3338245207149134', + childType: 'chat', + whisperedToAccountIDs: [], + }, + '7317910228472011573': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'will you>', + text: 'will you>', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'will you>', + lastModified: '2023-07-27 16:46:58.988', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 16:46:58.988', + timestamp: 1690476418, + reportActionTimestamp: 1690476418988, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '7317910228472011573', + previousReportActionID: '6779343397958390319', + lastModified: '2023-07-27 16:46:58.988', + whisperedToAccountIDs: [], + }, + '6779343397958390319': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'i will always send :#', + text: 'i will always send :#', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'i will always send :#', + lastModified: '2023-07-27 07:55:33.468', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:55:33.468', + timestamp: 1690444533, + reportActionTimestamp: 1690444533468, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6779343397958390319', + previousReportActionID: '5084145419388195535', + lastModified: '2023-07-27 07:55:33.468', + whisperedToAccountIDs: [], + }, + '5084145419388195535': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'new test', + text: 'new test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'new test', + lastModified: '2023-07-27 07:55:22.309', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:55:22.309', + timestamp: 1690444522, + reportActionTimestamp: 1690444522309, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '5084145419388195535', + previousReportActionID: '6742067600980190659', + lastModified: '2023-07-27 07:55:22.309', + whisperedToAccountIDs: [], + }, + '6742067600980190659': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'okay good', + text: 'okay good', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'okay good', + lastModified: '2023-07-27 07:55:15.362', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:55:15.362', + timestamp: 1690444515, + reportActionTimestamp: 1690444515362, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6742067600980190659', + previousReportActionID: '7811212427986810247', + lastModified: '2023-07-27 07:55:15.362', + whisperedToAccountIDs: [], + }, + '7811212427986810247': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'test 2', + text: 'test 2', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test 2', + lastModified: '2023-07-27 07:55:10.629', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:55:10.629', + timestamp: 1690444510, + reportActionTimestamp: 1690444510629, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '7811212427986810247', + previousReportActionID: '4544757211729131829', + lastModified: '2023-07-27 07:55:10.629', + whisperedToAccountIDs: [], + }, + '4544757211729131829': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'new test', + text: 'new test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'new test', + lastModified: '2023-07-27 07:53:41.960', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:53:41.960', + timestamp: 1690444421, + reportActionTimestamp: 1690444421960, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4544757211729131829', + previousReportActionID: '8290114634148431001', + lastModified: '2023-07-27 07:53:41.960', + whisperedToAccountIDs: [], + }, + '8290114634148431001': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'something was real', + text: 'something was real', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'something was real', + lastModified: '2023-07-27 07:53:27.836', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:53:27.836', + timestamp: 1690444407, + reportActionTimestamp: 1690444407836, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '8290114634148431001', + previousReportActionID: '5597494166918965742', + lastModified: '2023-07-27 07:53:27.836', + whisperedToAccountIDs: [], + }, + '5597494166918965742': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'oida', + text: 'oida', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'oida', + lastModified: '2023-07-27 07:53:20.783', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:53:20.783', + timestamp: 1690444400, + reportActionTimestamp: 1690444400783, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '5597494166918965742', + previousReportActionID: '7445709165354739065', + lastModified: '2023-07-27 07:53:20.783', + whisperedToAccountIDs: [], + }, + '7445709165354739065': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'test 12', + text: 'test 12', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test 12', + lastModified: '2023-07-27 07:53:17.393', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:53:17.393', + timestamp: 1690444397, + reportActionTimestamp: 1690444397393, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '7445709165354739065', + previousReportActionID: '1985264407541504554', + lastModified: '2023-07-27 07:53:17.393', + whisperedToAccountIDs: [], + }, + '1985264407541504554': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'new test', + text: 'new test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'new test', + lastModified: '2023-07-27 07:53:07.894', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:53:07.894', + timestamp: 1690444387, + reportActionTimestamp: 1690444387894, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '1985264407541504554', + previousReportActionID: '6101278009725036288', + lastModified: '2023-07-27 07:53:07.894', + whisperedToAccountIDs: [], + }, + '6101278009725036288': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'grrr', + text: 'grrr', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'grrr', + lastModified: '2023-07-27 07:52:56.421', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:52:56.421', + timestamp: 1690444376, + reportActionTimestamp: 1690444376421, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6101278009725036288', + previousReportActionID: '6913024396112106680', + lastModified: '2023-07-27 07:52:56.421', + whisperedToAccountIDs: [], + }, + '6913024396112106680': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'ne w test', + text: 'ne w test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'ne w test', + lastModified: '2023-07-27 07:52:53.352', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:52:53.352', + timestamp: 1690444373, + reportActionTimestamp: 1690444373352, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6913024396112106680', + previousReportActionID: '3663318486255461038', + lastModified: '2023-07-27 07:52:53.352', + whisperedToAccountIDs: [], + }, + '3663318486255461038': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'well', + text: 'well', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'well', + lastModified: '2023-07-27 07:52:47.044', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:52:47.044', + timestamp: 1690444367, + reportActionTimestamp: 1690444367044, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '3663318486255461038', + previousReportActionID: '6652909175804277965', + lastModified: '2023-07-27 07:52:47.044', + whisperedToAccountIDs: [], + }, + '6652909175804277965': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'hu', + text: 'hu', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hu', + lastModified: '2023-07-27 07:52:43.489', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:52:43.489', + timestamp: 1690444363, + reportActionTimestamp: 1690444363489, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6652909175804277965', + previousReportActionID: '4738491624635492834', + lastModified: '2023-07-27 07:52:43.489', + whisperedToAccountIDs: [], + }, + '4738491624635492834': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'test', + text: 'test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test', + lastModified: '2023-07-27 07:52:40.145', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:52:40.145', + timestamp: 1690444360, + reportActionTimestamp: 1690444360145, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4738491624635492834', + previousReportActionID: '1621235410433805703', + lastModified: '2023-07-27 07:52:40.145', + whisperedToAccountIDs: [], + }, + '1621235410433805703': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'test 4', + text: 'test 4', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test 4', + lastModified: '2023-07-27 07:48:36.809', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 07:48:36.809', + timestamp: 1690444116, + reportActionTimestamp: 1690444116809, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '1621235410433805703', + previousReportActionID: '1024550225871474566', + lastModified: '2023-07-27 07:48:36.809', + whisperedToAccountIDs: [], + }, + '1024550225871474566': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'test 3', + text: 'test 3', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test 3', + lastModified: '2023-07-27 07:48:24.183', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:48:24.183', + timestamp: 1690444104, + reportActionTimestamp: 1690444104183, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '1024550225871474566', + previousReportActionID: '5598482410513625723', + lastModified: '2023-07-27 07:48:24.183', + whisperedToAccountIDs: [], + }, + '5598482410513625723': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'test2', + text: 'test2', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test2', + lastModified: '2023-07-27 07:42:25.340', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:42:25.340', + timestamp: 1690443745, + reportActionTimestamp: 1690443745340, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '5598482410513625723', + previousReportActionID: '115121137377026405', + lastModified: '2023-07-27 07:42:25.340', + whisperedToAccountIDs: [], + }, + '115121137377026405': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'test', + text: 'test', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'test', + lastModified: '2023-07-27 07:42:22.583', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 07:42:22.583', + timestamp: 1690443742, + reportActionTimestamp: 1690443742583, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '115121137377026405', + previousReportActionID: '2167420855737359171', + lastModified: '2023-07-27 07:42:22.583', + whisperedToAccountIDs: [], + }, + '2167420855737359171': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'new message', + text: 'new message', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'new message', + lastModified: '2023-07-27 07:42:09.177', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:42:09.177', + timestamp: 1690443729, + reportActionTimestamp: 1690443729177, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '2167420855737359171', + previousReportActionID: '6106926938128802897', + lastModified: '2023-07-27 07:42:09.177', + whisperedToAccountIDs: [], + }, + '6106926938128802897': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'oh', + text: 'oh', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'oh', + lastModified: '2023-07-27 07:42:03.902', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:42:03.902', + timestamp: 1690443723, + reportActionTimestamp: 1690443723902, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '6106926938128802897', + previousReportActionID: '4366704007455141347', + lastModified: '2023-07-27 07:42:03.902', + whisperedToAccountIDs: [], + }, + '4366704007455141347': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'hm lol', + text: 'hm lol', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hm lol', + lastModified: '2023-07-27 07:42:00.734', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:42:00.734', + timestamp: 1690443720, + reportActionTimestamp: 1690443720734, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4366704007455141347', + previousReportActionID: '2078794664797360607', + lastModified: '2023-07-27 07:42:00.734', + whisperedToAccountIDs: [], + }, + '2078794664797360607': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'hi?', + text: 'hi?', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hi?', + lastModified: '2023-07-27 07:41:49.724', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:41:49.724', + timestamp: 1690443709, + reportActionTimestamp: 1690443709724, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '2078794664797360607', + previousReportActionID: '2030060194258527427', + lastModified: '2023-07-27 07:41:49.724', + whisperedToAccountIDs: [], + }, + '2030060194258527427': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'lets have a thread about it, will ya?', + text: 'lets have a thread about it, will ya?', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'lets have a thread about it, will ya?', + lastModified: '2023-07-27 07:40:49.146', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 07:40:49.146', + timestamp: 1690443649, + reportActionTimestamp: 1690443649146, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '2030060194258527427', + previousReportActionID: '5540483153987237906', + lastModified: '2023-07-27 07:40:49.146', + childReportID: '5860710623453234', + childType: 'chat', + childOldestFourAccountIDs: '14567013,12883048', + childCommenterCount: 2, + childLastVisibleActionCreated: '2023-07-27 07:41:03.550', + childVisibleActionCount: 2, + whisperedToAccountIDs: [], + }, + '5540483153987237906': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: '@hanno@margelo.io i mention you lasagna :)', + text: '@hanno@margelo.io i mention you lasagna :)', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '@hanno@margelo.io i mention you lasagna :)', + lastModified: '2023-07-27 07:37:43.100', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:37:43.100', + timestamp: 1690443463, + reportActionTimestamp: 1690443463100, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '5540483153987237906', + previousReportActionID: '8050559753491913991', + lastModified: '2023-07-27 07:37:43.100', + whisperedToAccountIDs: [], + }, + '8050559753491913991': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: '@terry+hightraffic@margelo.io', + text: '@terry+hightraffic@margelo.io', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: '@terry+hightraffic@margelo.io', + lastModified: '2023-07-27 07:36:41.708', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:36:41.708', + timestamp: 1690443401, + reportActionTimestamp: 1690443401708, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '8050559753491913991', + previousReportActionID: '881015235172878574', + lastModified: '2023-07-27 07:36:41.708', + whisperedToAccountIDs: [], + }, + '881015235172878574': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'yeah lets see', + text: 'yeah lets see', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'yeah lets see', + lastModified: '2023-07-27 07:25:15.997', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-27 07:25:15.997', + timestamp: 1690442715, + reportActionTimestamp: 1690442715997, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '881015235172878574', + previousReportActionID: '4800357767877651330', + lastModified: '2023-07-27 07:25:15.997', + whisperedToAccountIDs: [], + }, + '4800357767877651330': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'asdasdasd', + text: 'asdasdasd', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'asdasdasd', + lastModified: '2023-07-27 07:25:03.093', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-27 07:25:03.093', + timestamp: 1690442703, + reportActionTimestamp: 1690442703093, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '4800357767877651330', + previousReportActionID: '9012557872554910346', + lastModified: '2023-07-27 07:25:03.093', + whisperedToAccountIDs: [], + }, + '9012557872554910346': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'yeah', + text: 'yeah', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'yeah', + lastModified: '2023-07-26 19:49:40.471', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-26 19:49:40.471', + timestamp: 1690400980, + reportActionTimestamp: 1690400980471, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '9012557872554910346', + previousReportActionID: '8440677969068645500', + lastModified: '2023-07-26 19:49:40.471', + whisperedToAccountIDs: [], + }, + '8440677969068645500': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'hello motor', + text: 'hello motor', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'hello motor', + lastModified: '2023-07-26 19:49:36.262', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-26 19:49:36.262', + timestamp: 1690400976, + reportActionTimestamp: 1690400976262, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '8440677969068645500', + previousReportActionID: '306887996337608775', + lastModified: '2023-07-26 19:49:36.262', + whisperedToAccountIDs: [], + }, + '306887996337608775': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'a new messagfe', + text: 'a new messagfe', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'a new messagfe', + lastModified: '2023-07-26 19:49:29.512', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-26 19:49:29.512', + timestamp: 1690400969, + reportActionTimestamp: 1690400969512, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '306887996337608775', + previousReportActionID: '587892433077506227', + lastModified: '2023-07-26 19:49:29.512', + whisperedToAccountIDs: [], + }, + '587892433077506227': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Hanno J. G\u00f6decke', + }, + ], + actorAccountID: 12883048, + message: [ + { + type: 'COMMENT', + html: 'good', + text: 'good', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'good', + lastModified: '2023-07-26 19:49:20.473', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/fc1b8880216a5a76c8fd9998aaa33c080dacda5d_128.jpeg', + created: '2023-07-26 19:49:20.473', + timestamp: 1690400960, + reportActionTimestamp: 1690400960473, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '587892433077506227', + previousReportActionID: '1433103421804347060', + lastModified: '2023-07-26 19:49:20.473', + whisperedToAccountIDs: [], + }, + '1433103421804347060': { + person: [ + { + type: 'TEXT', + style: 'strong', + text: 'Terry Hightraffic1337', + }, + ], + actorAccountID: 14567013, + message: [ + { + type: 'COMMENT', + html: 'ah', + text: 'ah', + isEdited: false, + whisperedTo: [], + isDeletedParentAction: false, + reactions: [], + }, + ], + originalMessage: { + html: 'ah', + lastModified: '2023-07-26 19:49:12.762', + }, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + created: '2023-07-26 19:49:12.762', + timestamp: 1690400952, + reportActionTimestamp: 1690400952762, + automatic: false, + actionName: 'ADDCOMMENT', + shouldShow: true, + reportActionID: '1433103421804347060', + previousReportActionID: '8774157052628183778', + lastModified: '2023-07-26 19:49:12.762', + whisperedToAccountIDs: [], + }, + }, + }, + { + onyxMethod: 'mergecollection', + key: 'reportActionsReactions_', + value: { + reportActionsReactions_2658221912430757962: { + heart: { + createdAt: '2023-08-25 12:37:45', + users: { + 12883048: { + skinTones: { + '-1': '2023-08-25 12:37:45', + }, + }, + }, + }, + }, + }, + }, + { + onyxMethod: 'merge', + key: 'personalDetailsList', + value: { + 14567013: { + accountID: 14567013, + avatar: 'https://d1wpcgnaa73g0y.cloudfront.net/49a4c96c366f9a32905b30462f91ea39e5eee5e8_128.jpeg', + displayName: 'Terry Hightraffic1337', + firstName: 'Terry', + lastName: 'Hightraffic1337', + status: null, + login: 'terry+hightraffic@margelo.io', + pronouns: '', + timezone: { + automatic: true, + selected: 'Europe/Kyiv', + }, + phoneNumber: '', + validated: true, + }, + }, + }, + ], + jsonCode: 200, + requestID: '81b8b8509a7f5b54-VIE', +}); diff --git a/src/libs/E2E/apiMocks/readNewestAction.ts b/src/libs/E2E/apiMocks/readNewestAction.ts new file mode 100644 index 000000000000..eb3800a98b81 --- /dev/null +++ b/src/libs/E2E/apiMocks/readNewestAction.ts @@ -0,0 +1,15 @@ +import type Response from '@src/types/onyx/Response'; + +export default (): Response => ({ + jsonCode: 200, + requestID: '81b8c48e3bfe5a84-VIE', + onyxData: [ + { + onyxMethod: 'merge', + key: 'report_98345625', + value: { + lastReadTime: '2023-10-25 07:32:48.915', + }, + }, + ], +}); diff --git a/src/libs/E2E/apiMocks/signinUser.ts b/src/libs/E2E/apiMocks/signinUser.ts new file mode 100644 index 000000000000..7063e56f94be --- /dev/null +++ b/src/libs/E2E/apiMocks/signinUser.ts @@ -0,0 +1,53 @@ +import type {SigninParams} from '@libs/E2E/types'; +import type Response from '@src/types/onyx/Response'; + +const signinUser = ({email}: SigninParams): Response => ({ + onyxData: [ + { + onyxMethod: 'merge', + key: 'session', + value: { + authToken: 'fakeAuthToken', + accountID: 12313081, + email, + encryptedAuthToken: 'fakeEncryptedAuthToken', + }, + }, + { + onyxMethod: 'set', + key: 'shouldShowComposeInput', + value: true, + }, + { + onyxMethod: 'merge', + key: 'credentials', + value: { + autoGeneratedLogin: 'fake', + autoGeneratedPassword: 'fake', + }, + }, + { + onyxMethod: 'merge', + key: 'user', + value: { + isUsingExpensifyCard: false, + }, + }, + { + onyxMethod: 'set', + key: 'betas', + value: ['all'], + }, + { + onyxMethod: 'merge', + key: 'account', + value: { + requiresTwoFactorAuth: false, + }, + }, + ], + jsonCode: 200, + requestID: '783e5f3cadfbcfc0-SJC', +}); + +export default signinUser; diff --git a/src/libs/E2E/client.ts b/src/libs/E2E/client.ts index 265c55c4a230..472567cc6c1d 100644 --- a/src/libs/E2E/client.ts +++ b/src/libs/E2E/client.ts @@ -1,6 +1,5 @@ import Config from '../../../tests/e2e/config'; import Routes from '../../../tests/e2e/server/routes'; -import type {NetworkCacheMap, TestConfig} from './types'; type TestResult = { name: string; @@ -10,6 +9,10 @@ type TestResult = { renderCount?: number; }; +type TestConfig = { + name: string; +}; + type NativeCommandPayload = { text: string; }; @@ -21,31 +24,26 @@ type NativeCommand = { const SERVER_ADDRESS = `http://localhost:${Config.SERVER_PORT}`; -const defaultHeaders = { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'X-E2E-Server-Request': 'true', -}; - -const defaultRequestInit: RequestInit = { - headers: defaultHeaders, -}; - -const sendRequest = (url: string, data: Record): Promise => - fetch(url, { +/** + * Submits a test result to the server. + * Note: a test can have multiple test results. + */ +const submitTestResults = (testResult: TestResult): Promise => { + console.debug(`[E2E] Submitting test result '${testResult.name}'…`); + return fetch(`${SERVER_ADDRESS}${Routes.testResults}`, { method: 'POST', headers: { // eslint-disable-next-line @typescript-eslint/naming-convention 'Content-Type': 'application/json', - ...defaultHeaders, }, - body: JSON.stringify(data), + body: JSON.stringify(testResult), }).then((res) => { if (res.status === 200) { - return res; + console.debug(`[E2E] Test result '${testResult.name}' submitted successfully`); + return; } - const errorMsg = `[E2E] Client failed to send request to "${url}". Returned status: ${res.status}`; - return res - .json() + const errorMsg = `Test result submission failed with status code ${res.status}`; + res.json() .then((responseText) => { throw new Error(`${errorMsg}: ${responseText}`); }) @@ -53,24 +51,14 @@ const sendRequest = (url: string, data: Record): Promise => { - console.debug(`[E2E] Submitting test result '${testResult.name}'…`); - return sendRequest(`${SERVER_ADDRESS}${Routes.testResults}`, testResult).then(() => { - console.debug(`[E2E] Test result '${testResult.name}' submitted successfully`); - }); }; -const submitTestDone = () => fetch(`${SERVER_ADDRESS}${Routes.testDone}`, defaultRequestInit); +const submitTestDone = () => fetch(`${SERVER_ADDRESS}${Routes.testDone}`); let currentActiveTestConfig: TestConfig | null = null; const getTestConfig = (): Promise => - fetch(`${SERVER_ADDRESS}${Routes.testConfig}`, defaultRequestInit) + fetch(`${SERVER_ADDRESS}${Routes.testConfig}`) .then((res: Response): Promise => res.json()) .then((config: TestConfig) => { currentActiveTestConfig = config; @@ -79,30 +67,27 @@ const getTestConfig = (): Promise => const getCurrentActiveTestConfig = () => currentActiveTestConfig; -const sendNativeCommand = (payload: NativeCommand) => { - console.debug(`[E2E] Sending native command '${payload.actionName}'…`); - return sendRequest(`${SERVER_ADDRESS}${Routes.testNativeCommand}`, payload).then(() => { - console.debug(`[E2E] Native command '${payload.actionName}' sent successfully`); - }); -}; - -const updateNetworkCache = (appInstanceId: string, networkCache: NetworkCacheMap) => { - console.debug('[E2E] Updating network cache…'); - return sendRequest(`${SERVER_ADDRESS}${Routes.testUpdateNetworkCache}`, { - appInstanceId, - cache: networkCache, - }).then(() => { - console.debug('[E2E] Network cache updated successfully'); +const sendNativeCommand = (payload: NativeCommand) => + fetch(`${SERVER_ADDRESS}${Routes.testNativeCommand}`, { + method: 'POST', + headers: { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }).then((res) => { + if (res.status === 200) { + return true; + } + const errorMsg = `Sending native command failed with status code ${res.status}`; + res.json() + .then((responseText) => { + throw new Error(`${errorMsg}: ${responseText}`); + }) + .catch(() => { + throw new Error(errorMsg); + }); }); -}; - -const getNetworkCache = (appInstanceId: string): Promise => - sendRequest(`${SERVER_ADDRESS}${Routes.testGetNetworkCache}`, {appInstanceId}) - .then((res): Promise => res.json()) - .then((networkCache: NetworkCacheMap) => { - console.debug('[E2E] Network cache fetched successfully'); - return networkCache; - }); export default { submitTestResults, @@ -110,6 +95,4 @@ export default { getTestConfig, getCurrentActiveTestConfig, sendNativeCommand, - updateNetworkCache, - getNetworkCache, }; diff --git a/src/libs/E2E/reactNativeLaunchingTest.ts b/src/libs/E2E/reactNativeLaunchingTest.ts index 79276e7a5d75..cbd63270e736 100644 --- a/src/libs/E2E/reactNativeLaunchingTest.ts +++ b/src/libs/E2E/reactNativeLaunchingTest.ts @@ -8,14 +8,10 @@ import type {ValueOf} from 'type-fest'; import * as Metrics from '@libs/Metrics'; import Performance from '@libs/Performance'; -import Config from 'react-native-config'; import E2EConfig from '../../../tests/e2e/config'; import E2EClient from './client'; -import installNetworkInterceptor from './utils/NetworkInterceptor'; -import LaunchArgs from './utils/LaunchArgs'; -import type { TestConfig } from './types'; -type Tests = Record, (config: TestConfig) => void>; +type Tests = Record, () => void>; console.debug('=========================='); console.debug('==== Running e2e test ===='); @@ -26,12 +22,6 @@ if (!Metrics.canCapturePerformanceMetrics()) { throw new Error('Performance module not available! Please set CAPTURE_METRICS=true in your environment file!'); } -const appInstanceId = Config.E2E_BRANCH -if (!appInstanceId) { - throw new Error('E2E_BRANCH not set in environment file!'); -} - - // import your test here, define its name and config first in e2e/config.js const tests: Tests = { [E2EConfig.TEST_NAMES.AppStartTime]: require('./tests/appStartTimeTest.e2e').default, @@ -51,18 +41,10 @@ const appReady = new Promise((resolve) => { }); }); -// Install the network interceptor -installNetworkInterceptor( - () => E2EClient.getNetworkCache(appInstanceId), - (networkCache) => E2EClient.updateNetworkCache(appInstanceId, networkCache), - LaunchArgs.mockNetwork ?? false -) - E2EClient.getTestConfig() .then((config): Promise | undefined => { const test = tests[config.name]; if (!test) { - console.error(`[E2E] Test '${config.name}' not found`); // instead of throwing, report the error to the server, which is better for DX return E2EClient.submitTestResults({ name: config.name, @@ -75,7 +57,7 @@ E2EClient.getTestConfig() .then(() => { console.debug('[E2E] App is ready, running test…'); Performance.measureFailSafe('appStartedToReady', 'regularAppStart'); - test(config); + test(); }) .catch((error) => { console.error('[E2E] Error while waiting for app to become ready', error); diff --git a/src/libs/E2E/tests/appStartTimeTest.e2e.ts b/src/libs/E2E/tests/appStartTimeTest.e2e.ts index 5720af8b3641..6589e594dac6 100644 --- a/src/libs/E2E/tests/appStartTimeTest.e2e.ts +++ b/src/libs/E2E/tests/appStartTimeTest.e2e.ts @@ -1,7 +1,6 @@ import Config from 'react-native-config'; import type {PerformanceEntry} from 'react-native-performance'; import E2ELogin from '@libs/E2E/actions/e2eLogin'; -import waitForAppLoaded from '@libs/E2E/actions/waitForAppLoaded'; import E2EClient from '@libs/E2E/client'; import Performance from '@libs/Performance'; @@ -9,10 +8,8 @@ const test = () => { // check for login (if already logged in the action will simply resolve) E2ELogin().then((neededLogin) => { if (neededLogin) { - return waitForAppLoaded().then(() => - // we don't want to submit the first login to the results - E2EClient.submitTestDone(), - ); + // we don't want to submit the first login to the results + return E2EClient.submitTestDone(); } console.debug('[E2E] Logged in, getting metrics and submitting them…'); diff --git a/src/libs/E2E/tests/chatOpeningTest.e2e.ts b/src/libs/E2E/tests/chatOpeningTest.e2e.ts index ef380f847c3f..ff948c298b4a 100644 --- a/src/libs/E2E/tests/chatOpeningTest.e2e.ts +++ b/src/libs/E2E/tests/chatOpeningTest.e2e.ts @@ -1,25 +1,34 @@ import E2ELogin from '@libs/E2E/actions/e2eLogin'; -import waitForAppLoaded from '@libs/E2E/actions/waitForAppLoaded'; +import mockReport from '@libs/E2E/apiMocks/openReport'; import E2EClient from '@libs/E2E/client'; -import type {TestConfig} from '@libs/E2E/types'; -import getConfigValueOrThrow from '@libs/E2E/utils/getConfigValueOrThrow'; import Navigation from '@libs/Navigation/Navigation'; import Performance from '@libs/Performance'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -const test = (config: TestConfig) => { +type ReportValue = { + reportID: string; +}; + +type OnyxData = { + value: ReportValue; +}; + +type MockReportResponse = { + onyxData: OnyxData[]; +}; + +const test = () => { // check for login (if already logged in the action will simply resolve) console.debug('[E2E] Logging in for chat opening'); + const report = mockReport() as MockReportResponse; - const reportID = getConfigValueOrThrow('reportID', config); + const {reportID} = report.onyxData[0].value; E2ELogin().then((neededLogin) => { if (neededLogin) { - return waitForAppLoaded().then(() => - // we don't want to submit the first login to the results - E2EClient.submitTestDone(), - ); + // we don't want to submit the first login to the results + return E2EClient.submitTestDone(); } console.debug('[E2E] Logged in, getting chat opening metrics and submitting them…'); diff --git a/src/libs/E2E/tests/openSearchPageTest.e2e.ts b/src/libs/E2E/tests/openSearchPageTest.e2e.ts index 86da851396f6..c68553d6de8a 100644 --- a/src/libs/E2E/tests/openSearchPageTest.e2e.ts +++ b/src/libs/E2E/tests/openSearchPageTest.e2e.ts @@ -1,6 +1,5 @@ import Config from 'react-native-config'; import E2ELogin from '@libs/E2E/actions/e2eLogin'; -import waitForAppLoaded from '@libs/E2E/actions/waitForAppLoaded'; import E2EClient from '@libs/E2E/client'; import Navigation from '@libs/Navigation/Navigation'; import Performance from '@libs/Performance'; @@ -13,10 +12,8 @@ const test = () => { E2ELogin().then((neededLogin: boolean): Promise | undefined => { if (neededLogin) { - return waitForAppLoaded().then(() => - // we don't want to submit the first login to the results - E2EClient.submitTestDone(), - ); + // we don't want to submit the first login to the results + return E2EClient.submitTestDone(); } console.debug('[E2E] Logged in, getting search metrics and submitting them…'); diff --git a/src/libs/E2E/tests/reportTypingTest.e2e.ts b/src/libs/E2E/tests/reportTypingTest.e2e.ts index 4e0678aeb020..90d0dc9e0bb6 100644 --- a/src/libs/E2E/tests/reportTypingTest.e2e.ts +++ b/src/libs/E2E/tests/reportTypingTest.e2e.ts @@ -1,10 +1,7 @@ import Config from 'react-native-config'; import E2ELogin from '@libs/E2E/actions/e2eLogin'; -import waitForAppLoaded from '@libs/E2E/actions/waitForAppLoaded'; import waitForKeyboard from '@libs/E2E/actions/waitForKeyboard'; import E2EClient from '@libs/E2E/client'; -import type {TestConfig} from '@libs/E2E/types'; -import getConfigValueOrThrow from '@libs/E2E/utils/getConfigValueOrThrow'; import Navigation from '@libs/Navigation/Navigation'; import Performance from '@libs/Performance'; import {getRerenderCount, resetRerenderCount} from '@pages/home/report/ReportActionCompose/ComposerWithSuggestions/index.e2e'; @@ -12,18 +9,14 @@ import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import * as NativeCommands from '../../../../tests/e2e/nativeCommands/NativeCommandsAction'; -const test = (config: TestConfig) => { +const test = () => { // check for login (if already logged in the action will simply resolve) console.debug('[E2E] Logging in for typing'); - const reportID = getConfigValueOrThrow('reportID', config); - E2ELogin().then((neededLogin) => { if (neededLogin) { - return waitForAppLoaded().then(() => - // we don't want to submit the first login to the results - E2EClient.submitTestDone(), - ); + // we don't want to submit the first login to the results + return E2EClient.submitTestDone(); } console.debug('[E2E] Logged in, getting typing metrics and submitting them…'); @@ -34,8 +27,7 @@ const test = (config: TestConfig) => { } console.debug(`[E2E] Sidebar loaded, navigating to a report…`); - // Crowded Policy (Do Not Delete) Report, has a input bar available: - Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(reportID)); + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute('98345625')); // Wait until keyboard is visible (so we are focused on the input): waitForKeyboard().then(() => { diff --git a/src/libs/E2E/types.ts b/src/libs/E2E/types.ts index 2d48813fa115..fcdfa01d7132 100644 --- a/src/libs/E2E/types.ts +++ b/src/libs/E2E/types.ts @@ -4,23 +4,4 @@ type SigninParams = { type IsE2ETestSession = () => boolean; -type NetworkCacheEntry = { - url: string; - options: RequestInit; - status: number; - statusText: string; - headers: Record; - body: string; -}; - -type NetworkCacheMap = Record< - string, // hash - NetworkCacheEntry ->; - -type TestConfig = { - name: string; - [key: string]: string; -}; - -export type {SigninParams, IsE2ETestSession, NetworkCacheMap, NetworkCacheEntry, TestConfig}; +export type {SigninParams, IsE2ETestSession}; diff --git a/src/libs/E2E/utils/LaunchArgs.ts b/src/libs/E2E/utils/LaunchArgs.ts deleted file mode 100644 index 4e452d766eff..000000000000 --- a/src/libs/E2E/utils/LaunchArgs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {LaunchArguments} from 'react-native-launch-arguments'; - -type ExpectedArgs = { - mockNetwork?: boolean; -}; -const LaunchArgs = LaunchArguments.value(); - -export default LaunchArgs; diff --git a/src/libs/E2E/utils/NetworkInterceptor.ts b/src/libs/E2E/utils/NetworkInterceptor.ts deleted file mode 100644 index 361e14d9fdb7..000000000000 --- a/src/libs/E2E/utils/NetworkInterceptor.ts +++ /dev/null @@ -1,172 +0,0 @@ -/* eslint-disable @lwc/lwc/no-async-await */ -import type {NetworkCacheEntry, NetworkCacheMap} from '@libs/E2E/types'; - -const LOG_TAG = `[E2E][NetworkInterceptor]`; -// Requests with these headers will be ignored: -const IGNORE_REQUEST_HEADERS = ['X-E2E-Server-Request']; - -let globalResolveIsNetworkInterceptorInstalled: () => void; -let globalRejectIsNetworkInterceptorInstalled: (error: Error) => void; -const globalIsNetworkInterceptorInstalledPromise = new Promise((resolve, reject) => { - globalResolveIsNetworkInterceptorInstalled = resolve; - globalRejectIsNetworkInterceptorInstalled = reject; -}); -let networkCache: NetworkCacheMap | null = null; - -/** - * The headers of a fetch request can be passed as an array of tuples or as an object. - * This function converts the headers to an object. - */ -function getFetchRequestHeadersAsObject(fetchRequest: RequestInit): Record { - const headers: Record = {}; - if (Array.isArray(fetchRequest.headers)) { - fetchRequest.headers.forEach(([key, value]) => { - headers[key] = value; - }); - } else if (typeof fetchRequest.headers === 'object') { - Object.entries(fetchRequest.headers).forEach(([key, value]) => { - headers[key] = value; - }); - } - return headers; -} - -/** - * This function extracts the RequestInit from the arguments of fetch. - * It is needed because the arguments can be passed in different ways. - */ -function fetchArgsGetRequestInit(args: Parameters): RequestInit { - const [firstArg, secondArg] = args; - if (typeof firstArg === 'string' || (typeof firstArg === 'object' && firstArg instanceof URL)) { - if (secondArg == null) { - return {}; - } - return secondArg; - } - return firstArg; -} - -/** - * This function extracts the url from the arguments of fetch. - */ -function fetchArgsGetUrl(args: Parameters): string { - const [firstArg] = args; - if (typeof firstArg === 'string') { - return firstArg; - } - if (typeof firstArg === 'object' && firstArg instanceof URL) { - return firstArg.href; - } - if (typeof firstArg === 'object' && firstArg instanceof Request) { - return firstArg.url; - } - throw new Error('Could not get url from fetch args'); -} - -/** - * This function transforms a NetworkCacheEntry (internal representation) to a (fetch) Response. - */ -function networkCacheEntryToResponse({headers, status, statusText, body}: NetworkCacheEntry): Response { - // Transform headers to Headers object: - const newHeaders = new Headers(); - Object.entries(headers).forEach(([key, value]) => { - newHeaders.append(key, value); - }); - - return new Response(body, { - status, - statusText, - headers: newHeaders, - }); -} - -/** - * This function hashes the arguments of fetch. - */ -function hashFetchArgs(args: Parameters) { - const url = fetchArgsGetUrl(args); - const options = fetchArgsGetRequestInit(args); - const headers = getFetchRequestHeadersAsObject(options); - // Note: earlier we were using the body value as well, however - // the body for the same request might be different due to including - // times or app versions. - return `${url}${JSON.stringify(headers)}`; -} - -/** - * Install a network interceptor by overwriting the global fetch function: - * - Overwrites fetch globally with a custom implementation - * - For each fetch request we cache the request and the response - * - The cache is send to the test runner server to persist the network cache in between sessions - * - On e2e test start the network cache is requested and loaded - * - If a fetch request is already in the NetworkInterceptors cache instead of making a real API request the value from the cache is used. - */ -export default function installNetworkInterceptor( - getNetworkCache: () => Promise, - updateNetworkCache: (networkCache: NetworkCacheMap) => Promise, - shouldReturnRecordedResponse: boolean, -) { - console.debug(LOG_TAG, 'installing with shouldReturnRecordedResponse:', shouldReturnRecordedResponse); - const originalFetch = global.fetch; - - if (networkCache == null && shouldReturnRecordedResponse) { - console.debug(LOG_TAG, 'fetching network cache …'); - getNetworkCache() - .then((newCache) => { - networkCache = newCache; - globalResolveIsNetworkInterceptorInstalled(); - console.debug(LOG_TAG, 'network cache fetched!'); - }, globalRejectIsNetworkInterceptorInstalled) - .catch(globalRejectIsNetworkInterceptorInstalled); - } else { - networkCache = {}; - globalResolveIsNetworkInterceptorInstalled(); - } - - // @ts-expect-error Fetch global types weirdly include URL - global.fetch = async (...args: Parameters) => { - const options = fetchArgsGetRequestInit(args); - const headers = getFetchRequestHeadersAsObject(options); - const url = fetchArgsGetUrl(args); - // Check if headers contain any of the ignored headers, or if react native metro server: - if (IGNORE_REQUEST_HEADERS.some((header) => headers[header] != null) || url.includes('8081')) { - return originalFetch(...args); - } - - await globalIsNetworkInterceptorInstalledPromise; - - const hash = hashFetchArgs(args); - const cachedResponse = networkCache?.[hash]; - if (shouldReturnRecordedResponse && cachedResponse != null) { - const response = networkCacheEntryToResponse(cachedResponse); - console.debug(LOG_TAG, 'Returning recorded response for url:', url); - return Promise.resolve(response); - } - if (shouldReturnRecordedResponse) { - console.debug('!!! Missed cache hit for url:', url); - } - - return originalFetch(...args) - .then(async (res) => { - if (networkCache != null) { - const body = await res.clone().text(); - networkCache[hash] = { - url, - options, - body, - headers: getFetchRequestHeadersAsObject(options), - status: res.status, - statusText: res.statusText, - }; - console.debug(LOG_TAG, 'Updating network cache for url:', url); - // Send the network cache to the test server: - return updateNetworkCache(networkCache).then(() => res); - } - return res; - }) - .then((res) => { - console.debug(LOG_TAG, 'Network cache updated!'); - return res; - }); - }; -} diff --git a/src/libs/E2E/utils/getConfigValueOrThrow.ts b/src/libs/E2E/utils/getConfigValueOrThrow.ts deleted file mode 100644 index a694d6709ed6..000000000000 --- a/src/libs/E2E/utils/getConfigValueOrThrow.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Config from 'react-native-config'; - -/** - * Gets a config value or throws an error if the value is not defined. - */ -export default function getConfigValueOrThrow(key: string, config = Config): string { - const value = config[key]; - if (value == null) { - throw new Error(`Missing config value for ${key}`); - } - return value; -} diff --git a/src/pages/home/sidebar/SidebarLinks.js b/src/pages/home/sidebar/SidebarLinks.js index 71f53b109e00..09362d88555c 100644 --- a/src/pages/home/sidebar/SidebarLinks.js +++ b/src/pages/home/sidebar/SidebarLinks.js @@ -70,6 +70,7 @@ function SidebarLinks({onLinkClick, insets, optionListItems, isLoading, priority }, [isSmallScreenWidth]); useEffect(() => { + App.setSidebarLoaded(); SidebarUtils.setIsSidebarLoadedReady(); InteractionManager.runAfterInteractions(() => { @@ -197,7 +198,6 @@ function SidebarLinks({onLinkClick, insets, optionListItems, isLoading, priority onSelectRow={showReportPage} shouldDisableFocusOptions={isSmallScreenWidth} optionMode={viewMode} - onFirstItemRendered={App.setSidebarLoaded} /> {isLoading && optionListItems.length === 0 && ( diff --git a/tests/e2e/README.md b/tests/e2e/README.md index a142530d4388..8c7be011502d 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -2,7 +2,7 @@ This directory contains the scripts and configuration files for running the performance regression tests. These tests are called E2E tests because they -run the actual app on a real device (physical or emulated). +run the app on a real device (physical or emulated). ![Example of a e2e test run](https://raw.githubusercontent.com/hannojg/expensify-app/5f945c25e2a0650753f47f3f541b984f4d114f6d/e2e/example.gif) @@ -116,18 +116,6 @@ from one test (e.g. measuring multiple things at the same time). To finish a test call `E2EClient.submitTestDone()`. -## Network calls - -Network calls can add a variance to the test results. To mitigate this in the past we used to provide mocks for the API -calls. However, this is not a realistic scenario, as we want to test the app in a realistic environment. - -Now we have a module called `NetworkInterceptor`. The interceptor will intercept all network calls and will -cache the request and response. The next time the same request is made, it will return the cached response. - -When writing a test you usually don't need to care about this, as the interceptor is enabled by default. -However, look out for "!!! Missed cache hit for url" logs when developing your test. This can indicate a bug -with the NetworkInterceptor where a request should have been cached but wasn't (which would introduce variance in your test!). - ## Android specifics diff --git a/tests/e2e/config.js b/tests/e2e/config.js index a7447a29c954..41c1668fb6ba 100644 --- a/tests/e2e/config.js +++ b/tests/e2e/config.js @@ -1,5 +1,10 @@ const OUTPUT_DIR = process.env.WORKING_DIRECTORY || './tests/e2e/results'; +/** + * @typedef TestConfig + * @property {string} name + */ + // add your test name here … const TEST_NAMES = { AppStartTime: 'App start time', @@ -26,10 +31,6 @@ module.exports = { ENTRY_FILE: 'src/libs/E2E/reactNativeLaunchingTest.ts', - // The path to the activity within the app that we want to launch. - // Note: even though we have different package _names_, this path doesn't change. - ACTIVITY_PATH: 'com.expensify.chat.MainActivity', - // The port of the testing server that communicates with the app SERVER_PORT: 4723, @@ -77,13 +78,9 @@ module.exports = { reportScreen: { autoFocus: true, }, - // Crowded Policy (Do Not Delete) Report, has a input bar available: - reportID: '8268282951170052', }, [TEST_NAMES.ChatOpening]: { name: TEST_NAMES.ChatOpening, - // #announce Chat with many messages - reportID: '5421294415618529', }, }, }; diff --git a/tests/e2e/server/index.js b/tests/e2e/server/index.js index c2365f259bb7..4c2e00126fd5 100644 --- a/tests/e2e/server/index.js +++ b/tests/e2e/server/index.js @@ -84,7 +84,6 @@ const createServerInstance = () => { const [testDoneListeners, addTestDoneListener] = createListenerState(); let activeTestConfig; - const networkCache = {}; /** * @param {TestConfig} testConfig @@ -147,39 +146,6 @@ const createServerInstance = () => { break; } - case Routes.testGetNetworkCache: { - getPostJSONRequestData(req, res).then((data) => { - const appInstanceId = data && data.appInstanceId; - if (!appInstanceId) { - res.statusCode = 400; - res.end('Invalid request missing appInstanceId'); - return; - } - - const cachedData = networkCache[appInstanceId] || {}; - res.end(JSON.stringify(cachedData)); - }); - - break; - } - - case Routes.testUpdateNetworkCache: { - getPostJSONRequestData(req, res).then((data) => { - const appInstanceId = data && data.appInstanceId; - const cache = data && data.cache; - if (!appInstanceId || !cache) { - res.statusCode = 400; - res.end('Invalid request missing appInstanceId or cache'); - return; - } - - networkCache[appInstanceId] = cache; - res.end('ok'); - }); - - break; - } - default: res.statusCode = 404; res.end('Page not found!'); diff --git a/tests/e2e/server/routes.js b/tests/e2e/server/routes.js index 0d23866ec808..84fc2f89fd9b 100644 --- a/tests/e2e/server/routes.js +++ b/tests/e2e/server/routes.js @@ -10,10 +10,4 @@ module.exports = { // Commands to execute from the host machine (there are pre-defined types like scroll or type) testNativeCommand: '/test_native_command', - - // Updates the network cache - testUpdateNetworkCache: '/test_update_network_cache', - - // Gets the network cache - testGetNetworkCache: '/test_get_network_cache', }; diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index 98faff32397d..880e8641dd6f 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -335,9 +335,7 @@ const runTests = async () => { await killApp('android', config.MAIN_APP_PACKAGE); Logger.log('Starting main app'); - await launchApp('android', config.MAIN_APP_PACKAGE, config.ACTIVITY_PATH, { - mockNetwork: true, - }); + await launchApp('android', config.MAIN_APP_PACKAGE); // Wait for a test to finish by waiting on its done call to the http server try { @@ -361,9 +359,7 @@ const runTests = async () => { await killApp('android', config.MAIN_APP_PACKAGE); Logger.log('Starting delta app'); - await launchApp('android', config.DELTA_APP_PACKAGE, config.ACTIVITY_PATH, { - mockNetwork: true, - }); + await launchApp('android', config.DELTA_APP_PACKAGE); // Wait for a test to finish by waiting on its done call to the http server try { diff --git a/tests/e2e/utils/launchApp.js b/tests/e2e/utils/launchApp.js index f63e2e71cd8b..e0726d081086 100644 --- a/tests/e2e/utils/launchApp.js +++ b/tests/e2e/utils/launchApp.js @@ -1,15 +1,11 @@ -/* eslint-disable rulesdir/prefer-underscore-method */ -const {APP_PACKAGE, ACTIVITY_PATH} = require('../config'); +const {APP_PACKAGE} = require('../config'); const execAsync = require('./execAsync'); -module.exports = function (platform = 'android', packageName = APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs = {}) { +module.exports = function (platform = 'android', packageName = APP_PACKAGE) { if (platform !== 'android') { throw new Error(`launchApp() missing implementation for platform: ${platform}`); } // Use adb to start the app - const launchArgsString = Object.keys(launchArgs) - .map((key) => `${typeof launchArgs[key] === 'boolean' ? '--ez' : '--es'} ${key} ${launchArgs[key]}`) - .join(' '); - return execAsync(`adb shell am start -n ${packageName}/${activityPath} ${launchArgsString}`); + return execAsync(`adb shell monkey -p ${packageName} -c android.intent.category.LAUNCHER 1`); };