mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2024-11-19 01:40:12 +01:00
TST: jest27, remove jasmine, bump detox, split circleci
Co-authored-by: Ivan Vershigora <ivan.vershigora@gmail.com>
This commit is contained in:
parent
6ac594785e
commit
5d4a25840b
@ -1,8 +1,9 @@
|
||||
version: 2
|
||||
version: 2.1
|
||||
jobs:
|
||||
build:
|
||||
|
||||
lint:
|
||||
docker:
|
||||
- image: circleci/node:16.13.1
|
||||
- image: cimg/node:16.15.0
|
||||
|
||||
working_directory: ~/repo
|
||||
|
||||
@ -20,4 +21,60 @@ jobs:
|
||||
- node_modules
|
||||
|
||||
# run tests!
|
||||
- run: npm t || npm t || npm t
|
||||
- run:
|
||||
command: npm run tslint && npm run lint
|
||||
|
||||
unit:
|
||||
docker:
|
||||
- image: cimg/node:16.15.0
|
||||
|
||||
working_directory: ~/repo
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- restore_cache:
|
||||
key: node_modules-{{ checksum "package-lock.json" }}
|
||||
|
||||
- run: test -d node_modules || npm i
|
||||
|
||||
- save_cache:
|
||||
key: node_modules-{{ checksum "package-lock.json" }}
|
||||
paths:
|
||||
- node_modules
|
||||
|
||||
# run tests!
|
||||
- run:
|
||||
command: npm run unit
|
||||
|
||||
|
||||
integration:
|
||||
docker:
|
||||
- image: cimg/node:16.15.0
|
||||
|
||||
working_directory: ~/repo
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- restore_cache:
|
||||
key: node_modules-{{ checksum "package-lock.json" }}
|
||||
|
||||
- run: test -d node_modules || npm i
|
||||
|
||||
- save_cache:
|
||||
key: node_modules-{{ checksum "package-lock.json" }}
|
||||
paths:
|
||||
- node_modules
|
||||
|
||||
# run tests!
|
||||
- run:
|
||||
command: npm run jest || npm run jest || npm run jest
|
||||
|
||||
# Orchestrate our job run sequence
|
||||
workflows:
|
||||
build_and_test:
|
||||
jobs:
|
||||
- lint
|
||||
- unit
|
||||
- integration
|
||||
|
51
.detoxrc.json
Normal file
51
.detoxrc.json
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"testRunner": "jest",
|
||||
"runnerConfig": "tests/e2e/config.json",
|
||||
"skipLegacyWorkersInjection": true,
|
||||
"apps": {
|
||||
"ios": {
|
||||
"type": "ios.app",
|
||||
"binaryPath": "SPECIFY_PATH_TO_YOUR_APP_BINARY",
|
||||
"build": "xcodebuild clean build -workspace ios/BlueWallet.xcworkspace -scheme BlueWallet -configuration Release -derivedDataPath ios/build -sdk iphonesimulator13.2"
|
||||
},
|
||||
"android.debug": {
|
||||
"type": "android.apk",
|
||||
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
|
||||
"build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd .."
|
||||
},
|
||||
"android.release": {
|
||||
"type": "android.apk",
|
||||
"testBinaryPath": "android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk",
|
||||
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
|
||||
"build": "find android | grep '\\.apk' --color=never | xargs -l rm\n\n# creating fresh keystore\nrm detox.keystore\nkeytool -genkeypair -v -keystore detox.keystore -alias detox -keyalg RSA -keysize 2048 -validity 10000 -storepass 123456 -keypass 123456 -dname 'cn=Unknown, ou=Unknown, o=Unknown, c=Unknown'\n\n# building release APK\ncd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..\n\n# wip\nfind $ANDROID_HOME | grep apksigner\n\n# signing\nmv ./android/app/build/outputs/apk/release/app-release-unsigned.apk ./android/app/build/outputs/apk/release/app-release.apk\n$ANDROID_HOME/build-tools/30.0.2/apksigner sign --ks detox.keystore --ks-pass=pass:123456 ./android/app/build/outputs/apk/release/app-release.apk\n$ANDROID_HOME/build-tools/30.0.2/apksigner sign --ks detox.keystore --ks-pass=pass:123456 ./android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"simulator": {
|
||||
"type": "ios.simulator",
|
||||
"device": {
|
||||
"type": "iPhone 11"
|
||||
}
|
||||
},
|
||||
"emulator": {
|
||||
"type": "android.emulator",
|
||||
"device": {
|
||||
"avdName": "Pixel_API_29_AOSP"
|
||||
}
|
||||
}
|
||||
},
|
||||
"configurations": {
|
||||
"ios": {
|
||||
"device": "simulator",
|
||||
"app": "ios"
|
||||
},
|
||||
"android.debug": {
|
||||
"device": "emulator",
|
||||
"app": "android.debug"
|
||||
},
|
||||
"android.release": {
|
||||
"device": "emulator",
|
||||
"app": "android.release"
|
||||
}
|
||||
}
|
||||
}
|
18
.github/workflows/ci.yml
vendored
18
.github/workflows/ci.yml
vendored
@ -50,9 +50,8 @@ jobs:
|
||||
|
||||
e2e:
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout project
|
||||
- name: checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Specify node version
|
||||
@ -76,26 +75,25 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-npm-
|
||||
|
||||
- name: Install node_modules
|
||||
run: npm install
|
||||
|
||||
- name: Use specific Java version for sdkmanager to work
|
||||
uses: joschi/setup-jdk@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
java-version: '11'
|
||||
architecture: 'x64'
|
||||
|
||||
- name: Install node_modules
|
||||
run: npm install
|
||||
|
||||
- name: Build
|
||||
run: npm run e2e:release-build
|
||||
|
||||
- name: Run tests
|
||||
- name: run tests
|
||||
uses: reactivecircus/android-emulator-runner@v2
|
||||
with:
|
||||
api-level: 29
|
||||
emulator-build: 6885378 # tmp fix for https://github.com/ReactiveCircus/android-emulator-runner/issues/160
|
||||
target: google_apis
|
||||
api-level: 31
|
||||
avd-name: Pixel_API_29_AOSP
|
||||
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none -partition-size 2047
|
||||
arch: x86_64
|
||||
script: npm run e2e:release-test || npm run e2e:release-test || npm run e2e:release-test
|
||||
env:
|
||||
TRAVIS: 1
|
||||
|
@ -148,6 +148,10 @@ android {
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a', 'x86_64', 'x86', 'armeabi-v7a'
|
||||
}
|
||||
|
||||
testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type
|
||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||
missingDimensionStrategy 'detox', 'full'
|
||||
}
|
||||
splits {
|
||||
abi {
|
||||
@ -205,10 +209,6 @@ dependencies {
|
||||
exclude group:'com.facebook.flipper'
|
||||
}
|
||||
|
||||
androidTestImplementation('com.wix:detox:+') {
|
||||
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
|
||||
}
|
||||
|
||||
if (enableHermes) {
|
||||
def hermesPath = "../../node_modules/hermes-engine/android/";
|
||||
debugImplementation files(hermesPath + "hermes-debug.aar")
|
||||
@ -216,6 +216,8 @@ dependencies {
|
||||
} else {
|
||||
implementation jscFlavor
|
||||
}
|
||||
|
||||
androidTestImplementation(project(path: ":detox"))
|
||||
}
|
||||
|
||||
// Run this once to be able to run the application with BUCK
|
||||
|
@ -1,24 +1,35 @@
|
||||
package io.bluewallet.bluewallet;
|
||||
|
||||
import com.wix.detox.Detox;
|
||||
import com.wix.detox.Detox;
|
||||
import com.wix.detox.config.DetoxConfig;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.LargeTest;
|
||||
import androidx.test.rule.ActivityTestRule;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.LargeTest;
|
||||
import androidx.test.rule.ActivityTestRule;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
@LargeTest
|
||||
public class DetoxTest {
|
||||
|
||||
// Replace 'MainActivity' with the value of android:name entry in
|
||||
// <activity> in AndroidManifest.xml
|
||||
@Rule
|
||||
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false);
|
||||
|
||||
@Test
|
||||
public void runDetoxTests() {
|
||||
Detox.runTests(mActivityRule);
|
||||
// This is optional - in case you've decided to integrate TestButler
|
||||
// See https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#8-test-butler-support-optional
|
||||
// TestButlerProbe.assertReadyIfInstalled();
|
||||
|
||||
DetoxConfig detoxConfig = new DetoxConfig();
|
||||
detoxConfig.idlePolicyConfig.masterTimeoutSec = 90;
|
||||
detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60;
|
||||
detoxConfig.rnContextLoadTimeoutSec = (io.bluewallet.bluewallet.BuildConfig.DEBUG ? 180 : 60);
|
||||
|
||||
Detox.runTests(mActivityRule, detoxConfig);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,8 @@
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
android:theme="@style/AppTheme"
|
||||
android:networkSecurityConfig="@xml/network_security_config">
|
||||
|
||||
<meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_name"
|
||||
android:value="BlueWallet notifications"/> <!-- YOUR NOTIFICATION CHANNEL NAME -->
|
||||
|
7
android/app/src/main/res/xml/network_security_config.xml
Normal file
7
android/app/src/main/res/xml/network_security_config.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
<domain includeSubdomains="true">10.0.2.2</domain>
|
||||
<domain includeSubdomains="true">localhost</domain>
|
||||
</domain-config>
|
||||
</network-security-config>
|
@ -22,6 +22,7 @@ buildscript {
|
||||
classpath("com.bugsnag:bugsnag-android-gradle-plugin:5.+")
|
||||
classpath 'com.google.gms:google-services:4.3.10' // Google Services plugin
|
||||
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21")
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
@ -63,10 +64,6 @@ allprojects {
|
||||
// Android JSC is installed from npm
|
||||
url("$rootDir/../node_modules/jsc-android/dist")
|
||||
}
|
||||
maven {
|
||||
// All of Detox' artifacts are provided via the npm module
|
||||
url "$rootDir/../node_modules/detox/Detox-android"
|
||||
}
|
||||
google()
|
||||
maven { url 'https://www.jitpack.io' }
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
rootProject.name = 'BlueWallet'
|
||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
|
||||
include ':app'
|
||||
|
||||
include ':detox'
|
||||
project(':detox').projectDir = new File(rootProject.projectDir, '../node_modules/detox/android/detox')
|
@ -11,6 +11,7 @@ const EXCHANGE_RATES_STORAGE_KEY = 'currency';
|
||||
let preferredFiatCurrency = FiatUnit.USD;
|
||||
let exchangeRates = { LAST_UPDATED_ERROR: false };
|
||||
let lastTimeUpdateExchangeRateWasCalled = 0;
|
||||
let skipUpdateExchangeRate = false;
|
||||
|
||||
const LAST_UPDATED = 'LAST_UPDATED';
|
||||
|
||||
@ -70,6 +71,7 @@ async function _restoreSavedPreferredFiatCurrencyFromStorage() {
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
async function updateExchangeRate() {
|
||||
if (skipUpdateExchangeRate) return;
|
||||
if (+new Date() - lastTimeUpdateExchangeRateWasCalled <= 10 * 1000) {
|
||||
// simple debounce so theres no race conditions
|
||||
return;
|
||||
@ -228,6 +230,13 @@ function _setExchangeRate(pair, rate) {
|
||||
exchangeRates[pair] = rate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used in unit tests, so the `currency` module wont launch actual http request
|
||||
*/
|
||||
function _setSkipUpdateExchangeRate() {
|
||||
skipUpdateExchangeRate = true;
|
||||
}
|
||||
|
||||
module.exports.updateExchangeRate = updateExchangeRate;
|
||||
module.exports.init = init;
|
||||
module.exports.satoshiToLocalCurrency = satoshiToLocalCurrency;
|
||||
@ -240,6 +249,7 @@ module.exports.btcToSatoshi = btcToSatoshi;
|
||||
module.exports.getCurrencySymbol = getCurrencySymbol;
|
||||
module.exports._setPreferredFiatCurrency = _setPreferredFiatCurrency; // export it to mock data in tests
|
||||
module.exports._setExchangeRate = _setExchangeRate; // export it to mock data in tests
|
||||
module.exports._setSkipUpdateExchangeRate = _setSkipUpdateExchangeRate; // export it to mock data in tests
|
||||
module.exports.PREFERRED_CURRENCY = PREFERRED_CURRENCY_STORAGE_KEY;
|
||||
module.exports.EXCHANGE_RATES = EXCHANGE_RATES_STORAGE_KEY;
|
||||
module.exports.LAST_UPDATED = LAST_UPDATED;
|
||||
|
@ -20,7 +20,7 @@ export default class PayjoinTransaction {
|
||||
async getPsbt() {
|
||||
// Nasty hack to get this working for now
|
||||
const unfinalized = this._psbt.clone();
|
||||
unfinalized.data.inputs.forEach((input, index) => {
|
||||
for (const [index, input] of unfinalized.data.inputs.entries()) {
|
||||
delete input.finalScriptWitness;
|
||||
|
||||
const address = bitcoin.address.fromOutputScript(input.witnessUtxo.script);
|
||||
@ -28,7 +28,7 @@ export default class PayjoinTransaction {
|
||||
const keyPair = ECPair.fromWIF(wif);
|
||||
|
||||
unfinalized.signInput(index, keyPair);
|
||||
});
|
||||
}
|
||||
|
||||
return unfinalized;
|
||||
}
|
||||
@ -44,15 +44,15 @@ export default class PayjoinTransaction {
|
||||
|
||||
async signPsbt(payjoinPsbt) {
|
||||
// Do this without relying on private methods
|
||||
payjoinPsbt.data.inputs.forEach((input, index) => {
|
||||
|
||||
for (const [index, input] of payjoinPsbt.data.inputs.entries()) {
|
||||
const address = bitcoin.address.fromOutputScript(input.witnessUtxo.script);
|
||||
try {
|
||||
const wif = this._wallet._getWifForAddress(address);
|
||||
const keyPair = ECPair.fromWIF(wif);
|
||||
payjoinPsbt.signInput(index, keyPair).finalizeInput(index);
|
||||
} catch (e) {}
|
||||
});
|
||||
|
||||
}
|
||||
this._payjoinPsbt = payjoinPsbt;
|
||||
return this._payjoinPsbt;
|
||||
}
|
||||
|
@ -422,7 +422,7 @@ export class AbstractWallet {
|
||||
|
||||
getMasterFingerprintFromHex(hexValue: string): number {
|
||||
if (hexValue.length < 8) hexValue = '0' + hexValue;
|
||||
const b = Buffer.from(hexValue, 'hex')
|
||||
const b = Buffer.from(hexValue, 'hex');
|
||||
if (b.length !== 4) throw new Error('invalid fingerprint hex');
|
||||
|
||||
hexValue = hexValue[6] + hexValue[7] + hexValue[4] + hexValue[5] + hexValue[2] + hexValue[3] + hexValue[0] + hexValue[1];
|
||||
|
11603
package-lock.json
generated
11603
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
50
package.json
50
package.json
@ -9,11 +9,11 @@
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.9",
|
||||
"@babel/runtime": "^7.14.6",
|
||||
"@jest/reporters": "^26.4.1",
|
||||
"@jest/reporters": "^27.5.1",
|
||||
"@react-native-community/eslint-config": "^3.0.0",
|
||||
"@types/bs58check": "^2.1.0",
|
||||
"@types/create-hash": "^1.2.2",
|
||||
"@types/jest": "^26.0.24",
|
||||
"@types/jest": "^27.5.1",
|
||||
"@types/react": "^17.0.14",
|
||||
"@types/react-native": "^0.67.0",
|
||||
"@types/react-test-renderer": "^17.0.1",
|
||||
@ -21,7 +21,7 @@
|
||||
"@typescript-eslint/parser": "^4.28.3",
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-jest": "^26.6.3",
|
||||
"babel-jest": "^27.5.1",
|
||||
"eslint": "^7.30.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-config-standard": "^16.0.2",
|
||||
@ -34,7 +34,7 @@
|
||||
"eslint-plugin-promise": "^6.0.0",
|
||||
"eslint-plugin-react": "^7.23.2",
|
||||
"eslint-plugin-standard": "^4.1.0",
|
||||
"jest": "^26.1.0",
|
||||
"jest": "^27.5.1",
|
||||
"node-fetch": "^2.6.2",
|
||||
"prettier": "^2.2.1",
|
||||
"react-test-renderer": "17.0.2",
|
||||
@ -59,16 +59,16 @@
|
||||
"jest": "jest -b tests/integration/*",
|
||||
"windowspatches": "./scripts/windows-patches.sh",
|
||||
"maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh",
|
||||
"e2e:debug-build": "detox build -c android.emu.debug",
|
||||
"e2e:debug-test": "detox test -c android.emu.debug -d 200000 -l info",
|
||||
"e2e:debug-build": "detox build -c android.debug",
|
||||
"e2e:debug-test": "detox test -c android.debug -d 200000 -l info",
|
||||
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test",
|
||||
"e2e:release-build": "detox build -c android.emu.release",
|
||||
"e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless -d 200000 --loglevel info",
|
||||
"e2e:release-build": "detox build -c android.release",
|
||||
"e2e:release-test": "detox test -c android.release --record-videos all --record-logs all --take-screenshots all --headless -d 200000",
|
||||
"tslint": "tsc",
|
||||
"lint": "eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components",
|
||||
"lint:fix": "npm run lint -- --fix",
|
||||
"lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep -E '\\.js|\\.ts' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0",
|
||||
"unit": "jest -b tests/unit/*",
|
||||
"unit": "jest -b -i tests/unit/*",
|
||||
"windows": "react-native run-windows"
|
||||
},
|
||||
"jest": {
|
||||
@ -125,7 +125,7 @@
|
||||
"coinselect": "3.1.12",
|
||||
"crypto-js": "4.1.1",
|
||||
"dayjs": "1.11.2",
|
||||
"detox": "19.4.4",
|
||||
"detox": "19.6.9",
|
||||
"ecpair": "2.0.1",
|
||||
"ecurve": "1.0.6",
|
||||
"electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4",
|
||||
@ -210,36 +210,6 @@
|
||||
"_stream_passthrough": "readable-stream/passthrough",
|
||||
"stream": "stream-browserify"
|
||||
},
|
||||
"detox": {
|
||||
"configurations": {
|
||||
"ios.sim.release": {
|
||||
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/BlueWallet.app",
|
||||
"build": "xcodebuild clean build -workspace ios/BlueWallet.xcworkspace -scheme BlueWallet -configuration Release -derivedDataPath ios/build -sdk iphonesimulator13.2",
|
||||
"type": "ios.simulator",
|
||||
"device": {
|
||||
"type": "iPhone 11"
|
||||
}
|
||||
},
|
||||
"android.emu.debug": {
|
||||
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
|
||||
"build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
|
||||
"type": "android.emulator",
|
||||
"device": {
|
||||
"avdName": "Pixel_API_29_AOSP"
|
||||
}
|
||||
},
|
||||
"android.emu.release": {
|
||||
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
|
||||
"build": "# deleting old artifacts\nfind | grep '\\.apk' --color=never | grep -v node_modules | xargs -l rm\n\n# creating fresh keystore\nrm detox.keystore\nkeytool -genkeypair -v -keystore detox.keystore -alias detox -keyalg RSA -keysize 2048 -validity 10000 -storepass 123456 -keypass 123456 -dname 'cn=Unknown, ou=Unknown, o=Unknown, c=Unknown'\n\n# building release APK\ncd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..\n\n# backup & sign apk1\ncp ./android/app/build/outputs/apk/release/app-release-unsigned.apk ./android/app/build/outputs/apk/release/app-release-unsigned.apk.bak\njarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore detox.keystore ./android/app/build/outputs/apk/release/app-release-unsigned.apk detox -storepass 123456\n\n# move apk1 to expected filename\nmv ./android/app/build/outputs/apk/release/app-release-unsigned.apk ./android/app/build/outputs/apk/release/app-release.apk\n\n# backup and sign apk2\ncp android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk.bak\njarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore detox.keystore android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk detox -storepass 123456",
|
||||
"type": "android.emulator",
|
||||
"device": {
|
||||
"avdName": "Pixel_API_29_AOSP"
|
||||
}
|
||||
}
|
||||
},
|
||||
"test-runner": "jest",
|
||||
"runner-config": "tests/e2e/config.json"
|
||||
},
|
||||
"browser": {
|
||||
"crypto": "react-native-crypto",
|
||||
"path": "path-browserify",
|
||||
|
@ -1,7 +1,6 @@
|
||||
{
|
||||
"env": {
|
||||
"es6": true,
|
||||
"jasmine": true,
|
||||
"jest": true
|
||||
},
|
||||
"globals": {
|
||||
|
@ -12,17 +12,11 @@ import {
|
||||
const bitcoin = require('bitcoinjs-lib');
|
||||
const assert = require('assert');
|
||||
|
||||
jasmine.getEnv().addReporter({
|
||||
specStarted: result => (jasmine.currentTest = result),
|
||||
specDone: result => (jasmine.currentTest = result),
|
||||
});
|
||||
|
||||
describe('BlueWallet UI Tests - no wallets', () => {
|
||||
it('selftest passes', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t1');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t1'), 'as it previously passed on Travis');
|
||||
}
|
||||
await waitFor(element(by.id('WalletsList')))
|
||||
.toBeVisible()
|
||||
@ -43,10 +37,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('all settings screens work', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t2');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t2'), 'as it previously passed on Travis');
|
||||
}
|
||||
await yo('WalletsList');
|
||||
|
||||
@ -179,10 +172,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('can create wallet, reload app and it persists. then go to receive screen, set custom amount and label. Dismiss modal and go to WalletsList.', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t3');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t3'), 'as it previously passed on Travis');
|
||||
}
|
||||
await yo('WalletsList');
|
||||
|
||||
@ -216,10 +208,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('can encrypt storage, with plausible deniabilityl decrypt fake storage', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t4');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t4'), 'as it previously passed on Travis');
|
||||
}
|
||||
await yo('WalletsList');
|
||||
|
||||
@ -370,10 +361,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('can encrypt storage, and decrypt storage works', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t5');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t5'), 'as it previously passed on Travis');
|
||||
}
|
||||
await yo('WalletsList');
|
||||
await helperCreateWallet();
|
||||
@ -447,10 +437,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('can import multisig setup from UR, and create tx, and sign on hw devices', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t6');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t6'), 'as it previously passed on Travis');
|
||||
}
|
||||
|
||||
await yo('WalletsList');
|
||||
@ -575,10 +564,9 @@ describe('BlueWallet UI Tests - no wallets', () => {
|
||||
});
|
||||
|
||||
it('can discover wallet account and import it', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t6');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t6'), 'as it previously passed on Travis');
|
||||
}
|
||||
|
||||
await yo('WalletsList');
|
||||
|
@ -2,11 +2,6 @@ import { helperDeleteWallet, sleep, hashIt, sup, helperImportWallet, yo, extract
|
||||
const bitcoin = require('bitcoinjs-lib');
|
||||
const assert = require('assert');
|
||||
|
||||
jasmine.getEnv().addReporter({
|
||||
specStarted: result => (jasmine.currentTest = result),
|
||||
specDone: result => (jasmine.currentTest = result),
|
||||
});
|
||||
|
||||
beforeAll(async () => {
|
||||
if (!process.env.HD_MNEMONIC_BIP84) {
|
||||
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
|
||||
@ -31,10 +26,9 @@ afterAll(async () => {
|
||||
|
||||
describe('BlueWallet UI Tests - import BIP84 wallet', () => {
|
||||
it('can import BIP84 mnemonic, fetch balance & transactions, then create a transaction; then cosign', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t21');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t21'), 'as it previously passed on Travis');
|
||||
}
|
||||
if (!process.env.HD_MNEMONIC_BIP84) {
|
||||
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
|
||||
@ -344,10 +338,9 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
|
||||
});
|
||||
|
||||
it('should handle URL successfully', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t22');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t22'), 'as it previously passed on Travis');
|
||||
}
|
||||
if (!process.env.HD_MNEMONIC_BIP84) {
|
||||
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
|
||||
@ -384,10 +377,9 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => {
|
||||
});
|
||||
|
||||
it('can manage UTXO', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t23');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t23'), 'as it previously passed on Travis');
|
||||
}
|
||||
if (!process.env.HD_MNEMONIC_BIP84) {
|
||||
console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped');
|
||||
|
@ -1,10 +1,5 @@
|
||||
import { helperDeleteWallet, sleep, hashIt, sup, helperImportWallet, yo } from './helperz';
|
||||
|
||||
jasmine.getEnv().addReporter({
|
||||
specStarted: result => (jasmine.currentTest = result),
|
||||
specDone: result => (jasmine.currentTest = result),
|
||||
});
|
||||
|
||||
describe('BlueWallet UI Tests - import Watch-only wallet (zpub)', () => {
|
||||
/**
|
||||
* test plan:
|
||||
@ -16,10 +11,9 @@ describe('BlueWallet UI Tests - import Watch-only wallet (zpub)', () => {
|
||||
* 6. verify that we can see broadcast button and camera backdorr button is NOT visible
|
||||
*/
|
||||
it('can import zpub as watch-only, import psbt, and then scan signed psbt', async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
const lockFile = '/tmp/travislock.' + hashIt('t31');
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis');
|
||||
if (require('fs').existsSync(lockFile)) return console.warn('skipping', JSON.stringify('t31'), 'as it previously passed on Travis');
|
||||
}
|
||||
await helperImportWallet(
|
||||
'zpub6rDWXE4wbwefeCrHWehXJheXnti5F9PbpamDUeB5eFbqaY89x3jq86JADBuXpnJnSvRVwqkaTnyMaZERUg4BpxD9V4tSZfKeYh1ozPdL1xK',
|
||||
|
@ -1,6 +1,10 @@
|
||||
{
|
||||
"maxWorkers": 1,
|
||||
"testEnvironment": "./environment",
|
||||
"testRunner": "jest-circus/runner",
|
||||
"testTimeout": 321000,
|
||||
"testRegex": "\\.spec\\.js$",
|
||||
"setupFilesAfterEnv": ["./init.js"],
|
||||
"testEnvironment": "node",
|
||||
"reporters": ["detox/runners/jest/streamlineReporter"],
|
||||
"verbose": true
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
# script thats used to build & sign release APK in preparation for Detox e2e testing.
|
||||
# should be copied in package.json - detox - configurations - android.emu.release - build
|
||||
# should be copied in .detoxrc.json - apps - android.release - build
|
||||
|
||||
# deleting old artifacts
|
||||
find | grep '\.apk' --color=never | grep -v node_modules | xargs -l rm
|
||||
find android | grep '\.apk' --color=never | xargs -l rm
|
||||
|
||||
# creating fresh keystore
|
||||
rm detox.keystore
|
||||
@ -11,17 +11,7 @@ keytool -genkeypair -v -keystore detox.keystore -alias detox -keyalg RSA -keysi
|
||||
# building release APK
|
||||
cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..
|
||||
|
||||
# backup & sign apk1
|
||||
cp ./android/app/build/outputs/apk/release/app-release-unsigned.apk ./android/app/build/outputs/apk/release/app-release-unsigned.apk.bak
|
||||
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore detox.keystore ./android/app/build/outputs/apk/release/app-release-unsigned.apk detox -storepass 123456
|
||||
|
||||
# move apk1 to expected filename
|
||||
# signing
|
||||
mv ./android/app/build/outputs/apk/release/app-release-unsigned.apk ./android/app/build/outputs/apk/release/app-release.apk
|
||||
|
||||
# backup and sign apk2
|
||||
cp android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk.bak
|
||||
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore detox.keystore android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk detox -storepass 123456
|
||||
|
||||
|
||||
|
||||
# why the fuck there are 2 apks..? oh well, if it works - dont touch
|
||||
$ANDROID_HOME/build-tools/30.0.2/apksigner sign --ks detox.keystore --ks-pass=pass:123456 ./android/app/build/outputs/apk/release/app-release.apk
|
||||
$ANDROID_HOME/build-tools/30.0.2/apksigner sign --ks detox.keystore --ks-pass=pass:123456 ./android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk
|
||||
|
19
tests/e2e/environment.js
Normal file
19
tests/e2e/environment.js
Normal file
@ -0,0 +1,19 @@
|
||||
const { DetoxCircusEnvironment, SpecReporter, WorkerAssignReporter } = require('detox/runners/jest-circus');
|
||||
|
||||
class CustomDetoxEnvironment extends DetoxCircusEnvironment {
|
||||
constructor(config, context) {
|
||||
super(config, context);
|
||||
|
||||
// Can be safely removed, if you are content with the default value (=300000ms)
|
||||
this.initTimeout = 300000;
|
||||
|
||||
// This takes care of generating status logs on a per-spec basis. By default, Jest only reports at file-level.
|
||||
// This is strictly optional.
|
||||
this.registerListeners({
|
||||
SpecReporter,
|
||||
WorkerAssignReporter,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CustomDetoxEnvironment;
|
@ -1,43 +1,3 @@
|
||||
const detox = require('detox');
|
||||
const config = require('../../package.json').detox;
|
||||
const adapter = require('detox/runners/jest/adapter');
|
||||
const specReporter = require('detox/runners/jest/specReporter');
|
||||
const assignReporter = require('detox/runners/jest/assignReporter');
|
||||
|
||||
jasmine.getEnv().addReporter(adapter);
|
||||
|
||||
// This takes care of generating status logs on a per-spec basis. By default, jest only reports at file-level.
|
||||
// This is strictly optional.
|
||||
jasmine.getEnv().addReporter(specReporter);
|
||||
|
||||
// This will post which device has assigned to run a suite, which can be useful in a multiple-worker tests run.
|
||||
// This is strictly optional.
|
||||
jasmine.getEnv().addReporter(assignReporter);
|
||||
|
||||
// Set the default timeout
|
||||
jest.setTimeout(1200000); // 20 min
|
||||
|
||||
beforeAll(async () => {
|
||||
await detox.init(config);
|
||||
await device.launchApp();
|
||||
}, 1200000);
|
||||
|
||||
beforeEach(async () => {
|
||||
const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName);
|
||||
if (process.env.TRAVIS) {
|
||||
if (require('fs').existsSync(lockFile))
|
||||
// speeds up test pass
|
||||
return;
|
||||
}
|
||||
await adapter.beforeEach();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await adapter.afterAll();
|
||||
await detox.cleanup();
|
||||
});
|
||||
|
||||
function hashIt(s) {
|
||||
const createHash = require('create-hash');
|
||||
return createHash('sha256').update(s).digest().toString('hex');
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import assert from 'assert';
|
||||
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 150 * 1000;
|
||||
jest.setTimeout(150 * 1000);
|
||||
|
||||
afterAll(() => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -3,9 +3,10 @@ import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
|
||||
import { FiatUnit } from '../../models/fiatUnit';
|
||||
|
||||
jest.setTimeout(15 * 1000);
|
||||
|
||||
describe('currency', () => {
|
||||
it('fetches exchange rate and saves to AsyncStorage', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000;
|
||||
const currency = require('../../blue_modules/currency');
|
||||
await currency.init();
|
||||
let cur = await AsyncStorage.getItem(currency.EXCHANGE_RATES);
|
||||
|
@ -2,7 +2,7 @@ import * as bitcoin from 'bitcoinjs-lib';
|
||||
import assert from 'assert';
|
||||
import ElectrumClient from 'electrum-client';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 150 * 1000;
|
||||
jest.setTimeout(150 * 1000);
|
||||
|
||||
const hardcodedPeers = [
|
||||
{ host: 'electrum1.bluewallet.io', ssl: '443' },
|
||||
|
@ -4,7 +4,7 @@ import * as bitcoin from 'bitcoinjs-lib';
|
||||
import { HDLegacyBreadwalletWallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 300 * 1000;
|
||||
jest.setTimeout(300 * 1000);
|
||||
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
||||
|
||||
afterAll(async () => {
|
||||
|
@ -4,7 +4,7 @@ import * as bitcoin from 'bitcoinjs-lib';
|
||||
import { HDSegwitBech32Wallet, SegwitP2SHWallet, HDSegwitBech32Transaction, SegwitBech32Wallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 150 * 1000;
|
||||
jest.setTimeout(150 * 1000);
|
||||
|
||||
afterAll(async () => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -3,7 +3,7 @@ import assert from 'assert';
|
||||
import { HDSegwitBech32Wallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 300 * 1000;
|
||||
jest.setTimeout(30 * 1000);
|
||||
|
||||
afterAll(async () => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -4,7 +4,7 @@ import * as bitcoin from 'bitcoinjs-lib';
|
||||
import { HDSegwitP2SHWallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 300 * 1000;
|
||||
jest.setTimeout(300 * 1000);
|
||||
|
||||
afterAll(() => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -1,11 +1,12 @@
|
||||
import assert from 'assert';
|
||||
import * as bitcoin from 'bitcoinjs-lib';
|
||||
import { LegacyWallet, SegwitBech32Wallet, SegwitP2SHWallet } from '../../class';
|
||||
import { HodlHodlApi } from '../../class/hodl-hodl-api';
|
||||
import { ECPairFactory } from 'ecpair';
|
||||
const ecc = require('tiny-secp256k1');
|
||||
const ECPair = ECPairFactory(ecc);
|
||||
|
||||
const bitcoin = require('bitcoinjs-lib');
|
||||
const assert = require('assert');
|
||||
jest.setTimeout(200 * 1000);
|
||||
|
||||
it.skip('can verify escrow address', () => {
|
||||
const encryptedSeed =
|
||||
@ -93,7 +94,6 @@ describe.skip('HodlHodl API', function () {
|
||||
// dont run here as it always fails
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
const Hodl = new HodlHodlApi();
|
||||
const countries = await Hodl.getCountries();
|
||||
assert.ok(countries[0]);
|
||||
@ -154,7 +154,6 @@ describe.skip('HodlHodl API', function () {
|
||||
// dont run here as it always fails
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.HODLHODL_OFFER_ID) return;
|
||||
const Hodl = new HodlHodlApi();
|
||||
const offer = await Hodl.getOffer(process.env.HODLHODL_OFFER_ID);
|
||||
@ -177,7 +176,6 @@ describe.skip('HodlHodl API', function () {
|
||||
// dont run here as it always fails
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.HODLHODL_CONTRACT_ID) return;
|
||||
const Hodl = new HodlHodlApi();
|
||||
const contract = await Hodl.getContract(process.env.HODLHODL_CONTRACT_ID);
|
||||
@ -191,7 +189,6 @@ describe.skip('HodlHodl API', function () {
|
||||
// dont run here as it always fails
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.HODLHODL_CONTRACT_ID) return;
|
||||
const Hodl = new HodlHodlApi();
|
||||
const result = await Hodl.markContractAsConfirmed(process.env.HODLHODL_CONTRACT_ID);
|
||||
|
@ -17,7 +17,7 @@ import {
|
||||
import startImport from '../../class/wallet-import';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 90000;
|
||||
jest.setTimeout(90 * 1000);
|
||||
|
||||
afterAll(async () => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -3,7 +3,7 @@ import assert from 'assert';
|
||||
import { LegacyWallet, SegwitP2SHWallet, SegwitBech32Wallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
||||
jest.setTimeout(30 * 1000);
|
||||
|
||||
afterAll(async () => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -1,7 +1,8 @@
|
||||
import assert from 'assert';
|
||||
import Frisbee from 'frisbee';
|
||||
import { LightningCustodianWallet } from '../../class';
|
||||
const assert = require('assert');
|
||||
|
||||
jest.setTimeout(200 * 1000);
|
||||
const baseUri = 'https://lndhub-staging.herokuapp.com';
|
||||
|
||||
describe.skip('LightningCustodianWallet', () => {
|
||||
@ -10,7 +11,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
l1.init();
|
||||
|
||||
it.skip('issue credentials', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
assert.ok(l1.refill_addressess.length === 0);
|
||||
assert.ok(l1._refresh_token_created_ts === 0);
|
||||
assert.ok(l1._access_token_created_ts === 0);
|
||||
@ -27,7 +27,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can create, auth and getbtc', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
assert.ok(l1.refill_addressess.length === 0);
|
||||
assert.ok(l1._refresh_token_created_ts === 0);
|
||||
assert.ok(l1._access_token_created_ts === 0);
|
||||
@ -54,7 +53,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can refresh token', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
const oldRefreshToken = l1.refresh_token;
|
||||
const oldAccessToken = l1.access_token;
|
||||
await l1.refreshAcessToken();
|
||||
@ -65,7 +63,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can use existing login/pass', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -98,7 +95,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * 1000;
|
||||
const l2 = new LightningCustodianWallet();
|
||||
l2.setSecret(process.env.BLITZHUB);
|
||||
l2.setBaseURI(baseUri);
|
||||
@ -157,7 +153,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can pay invoice from opennode', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -208,7 +203,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
|
||||
// turned off because acinq strike is shutting down
|
||||
it.skip('can pay invoice (acinq)', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -283,7 +277,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can pay invoice (bitrefill)', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -350,7 +343,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can create invoice and pay other blitzhub invoice', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -456,7 +448,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('can pay invoice with free amount (tippin.me)', async function () {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
@ -536,7 +527,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
const l1 = new LightningCustodianWallet();
|
||||
l1.setBaseURI(baseUri);
|
||||
l1.init();
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
assert.ok(l1.refill_addressess.length === 0);
|
||||
assert.ok(l1._refresh_token_created_ts === 0);
|
||||
assert.ok(l1._access_token_created_ts === 0);
|
||||
@ -570,7 +560,6 @@ describe.skip('LightningCustodianWallet', () => {
|
||||
});
|
||||
|
||||
it('cant pay negative free amount', async () => {
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 * 1000;
|
||||
if (!process.env.BLITZHUB) {
|
||||
console.error('process.env.BLITZHUB not set, skipped');
|
||||
return;
|
||||
|
@ -2,7 +2,7 @@ import assert from 'assert';
|
||||
import { MultisigHDWallet } from '../../class/';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 300 * 1000;
|
||||
jest.setTimeout(300 * 1000);
|
||||
|
||||
afterAll(() => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
|
@ -1,7 +1,7 @@
|
||||
import assert from 'assert';
|
||||
|
||||
import Notifications from '../../blue_modules/notifications';
|
||||
Notifications.default = new Notifications();
|
||||
// Notifications.default = new Notifications();
|
||||
|
||||
describe('notifications', () => {
|
||||
// yeah, lets rely less on external services...
|
||||
|
@ -3,6 +3,8 @@ import assert from 'assert';
|
||||
import { WatchOnlyWallet } from '../../class';
|
||||
import * as BlueElectrum from '../../blue_modules/BlueElectrum';
|
||||
|
||||
jest.setTimeout(500 * 1000);
|
||||
|
||||
afterAll(async () => {
|
||||
// after all tests we close socket so the test suite can actually terminate
|
||||
BlueElectrum.forceDisconnect();
|
||||
@ -14,8 +16,6 @@ beforeAll(async () => {
|
||||
await BlueElectrum.connectMain();
|
||||
});
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 500 * 1000;
|
||||
|
||||
describe('Watch only wallet', () => {
|
||||
it('can fetch balance', async () => {
|
||||
const w = new WatchOnlyWallet();
|
||||
|
@ -1,18 +0,0 @@
|
||||
global.beforeEach(() => {
|
||||
if (process.env.TRAVIS || process.env.CI) return;
|
||||
process.stdout.write(jasmine.currentTest.fullName + '...\r');
|
||||
});
|
||||
|
||||
global.afterEach(() => {
|
||||
if (process.env.TRAVIS || process.env.CI) return;
|
||||
if (jasmine.currentTest.failedExpectations.length) {
|
||||
process.stdout.write(jasmine.currentTest.fullName + '...FAIL\n');
|
||||
} else {
|
||||
process.stdout.write(jasmine.currentTest.fullName + '...OK\n');
|
||||
}
|
||||
});
|
||||
|
||||
jasmine.getEnv().addReporter({
|
||||
specStarted: result => (jasmine.currentTest = result),
|
||||
specDone: result => (jasmine.currentTest = result),
|
||||
});
|
@ -2,6 +2,8 @@ import assert from 'assert';
|
||||
import wif from 'wif';
|
||||
import bip38 from 'bip38';
|
||||
|
||||
jest.setTimeout(180 * 1000);
|
||||
|
||||
it('bip38 decodes', async () => {
|
||||
const encryptedKey = '6PRVWUbkzq2VVjRuv58jpwVjTeN46MeNmzUHqUjQptBJUHGcBakduhrUNc';
|
||||
const decryptedKey = await bip38.decryptAsync(
|
||||
@ -23,7 +25,6 @@ it.skip('bip38 decodes slow', async () => {
|
||||
// run only on CI
|
||||
return;
|
||||
}
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 3 * 60 * 1000;
|
||||
|
||||
const encryptedKey = '6PnU5voARjBBykwSddwCdcn6Eu9EcsK24Gs5zWxbJbPZYW7eiYQP8XgKbN';
|
||||
let callbackWasCalled = false;
|
||||
|
@ -1,6 +1,5 @@
|
||||
import assert from 'assert';
|
||||
import DeeplinkSchemaMatch from '../../class/deeplink-schema-match';
|
||||
const assert = require('assert');
|
||||
jest.useFakeTimers();
|
||||
|
||||
describe('unit - DeepLinkSchemaMatch', function () {
|
||||
it('hasSchema', () => {
|
||||
|
@ -5,6 +5,12 @@ const ECPair = ECPairFactory(ecc);
|
||||
const bitcoin = require('bitcoinjs-lib');
|
||||
const assert = require('assert');
|
||||
|
||||
const consoleWarnOrig = console.warn;
|
||||
console.warn = function () {
|
||||
if (arguments[0].startsWith('WARNING: Sending to a future segwit version address can lead to loss of funds')) return;
|
||||
return consoleWarnOrig.apply(arguments);
|
||||
};
|
||||
|
||||
describe('Legacy wallet', () => {
|
||||
it('can validate addresses', () => {
|
||||
const w = new LegacyWallet();
|
||||
|
@ -1,9 +1,8 @@
|
||||
import assert from 'assert';
|
||||
import { BitcoinUnit } from '../../models/bitcoinUnits';
|
||||
import { FiatUnit } from '../../models/fiatUnit';
|
||||
import { _leaveNumbersAndDots, formatBalanceWithoutSuffix, formatBalancePlain, formatBalance } from '../../loc';
|
||||
const assert = require('assert');
|
||||
const currency = require('../../blue_modules/currency');
|
||||
jest.useFakeTimers();
|
||||
|
||||
describe('Localization', () => {
|
||||
it('internal formatter', () => {
|
||||
@ -60,6 +59,7 @@ describe('Localization', () => {
|
||||
currency._setPreferredFiatCurrency(FiatUnit.USD);
|
||||
if (shouldResetRate) {
|
||||
currency._setExchangeRate('BTC_USD', false);
|
||||
currency._setSkipUpdateExchangeRate();
|
||||
}
|
||||
const actualResult = formatBalanceWithoutSuffix(balance, toUnit, withFormatting);
|
||||
assert.strictEqual(actualResult, expectedResult);
|
||||
|
@ -1,9 +1,8 @@
|
||||
import assert from 'assert';
|
||||
import * as bitcoin from 'bitcoinjs-lib';
|
||||
import { PayjoinClient } from 'payjoin-client';
|
||||
import { HDSegwitBech32Wallet } from '../../class';
|
||||
import PayjoinTransaction from '../../class/payjoin-transaction';
|
||||
import { PayjoinClient } from 'payjoin-client';
|
||||
const bitcoin = require('bitcoinjs-lib');
|
||||
const assert = require('assert');
|
||||
jest.useFakeTimers();
|
||||
|
||||
const utxos = [
|
||||
{
|
||||
@ -105,6 +104,8 @@ describe('PayjoinTransaction', () => {
|
||||
w,
|
||||
);
|
||||
|
||||
wallet.scheduleBroadcastTx = async function () {}; // mock so no real timers are called
|
||||
|
||||
const payjoinRequesterMock = {
|
||||
requestPayjoin: async function () {
|
||||
// should return payjoined PSBT (real result obtained from btcpayserver)
|
||||
|
@ -245,7 +245,7 @@ describe('Watch only wallet', () => {
|
||||
it('can import Electrum compatible backup wallet, and create a tx with master fingerprint hex with a length of 7', async () => {
|
||||
const w = new WatchOnlyWallet();
|
||||
let str = require('fs').readFileSync('./tests/unit/fixtures/skeleton-electrum-hex-only.txt', 'ascii');
|
||||
str = str.replace('b616be56', '616be56')
|
||||
str = str.replace('b616be56', '616be56');
|
||||
// console.log(str)
|
||||
w.setSecret(str);
|
||||
w.init();
|
||||
@ -263,7 +263,7 @@ describe('Watch only wallet', () => {
|
||||
it('will fail to import Electrum compatible backup wallet when fingerprint hex is less than 7', async () => {
|
||||
const w = new WatchOnlyWallet();
|
||||
let str = require('fs').readFileSync('./tests/unit/fixtures/skeleton-electrum-hex-only.txt', 'ascii');
|
||||
str = str.replace('b616be56', '16be56')
|
||||
str = str.replace('b616be56', '16be56');
|
||||
w.setSecret(str);
|
||||
w.init();
|
||||
assert.throws(w.valid, 'invalid fingerprint hex');
|
||||
@ -272,7 +272,7 @@ describe('Watch only wallet', () => {
|
||||
it('will fail to import Electrum compatible backup wallet when fingerprint is an invalid hex value', async () => {
|
||||
const w = new WatchOnlyWallet();
|
||||
let str = require('fs').readFileSync('./tests/unit/fixtures/skeleton-electrum-hex-only.txt', 'ascii');
|
||||
str = str.replace('b616be56', 'j16be56')
|
||||
str = str.replace('b616be56', 'j16be56');
|
||||
w.setSecret(str);
|
||||
w.init();
|
||||
assert.throws(w.valid, 'invalid fingerprint hex');
|
||||
|
Loading…
Reference in New Issue
Block a user