diff --git a/android/app/build.gradle b/android/app/build.gradle index ba312af..09d597e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -63,6 +63,7 @@ dependencies { implementation "androidx.security:security-crypto:1.1.0-alpha02" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' diff --git a/android/app/src/androidTest/java/it/casatta/Common.kt b/android/app/src/androidTest/java/it/casatta/Common.kt index 1eb9245..18a0dba 100644 --- a/android/app/src/androidTest/java/it/casatta/Common.kt +++ b/android/app/src/androidTest/java/it/casatta/Common.kt @@ -1,17 +1,16 @@ package it.casatta -import android.app.Activity import android.view.View -import android.widget.EditText import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.typeText import androidx.test.espresso.assertion.ViewAssertions import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.matcher.BoundedMatcher import androidx.test.espresso.matcher.RootMatchers -import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.* import androidx.test.internal.util.Checks import androidx.test.platform.app.InstrumentationRegistry @@ -42,6 +41,15 @@ open class Common { return network } + fun isTestnet(): Boolean { + return getNetwork() == "testnet" + } + + fun getString(id: Int): String { + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + return appContext.getString(id) + } + fun withItemSubject(subject: String): Matcher? { Checks.checkNotNull(subject) return object : BoundedMatcher( @@ -78,7 +86,7 @@ open class Common { onView(withId(R.id.items_list)).perform( RecyclerViewActions.actionOnHolderItem( withItemSubject(subject), - ViewActions.click() + click() ) ) } @@ -87,7 +95,7 @@ open class Common { onView(withId(R.id.items_list)).check( ViewAssertions.matches( Matchers.not( - ViewMatchers.hasDescendant( + hasDescendant( withText(subject) ) ) @@ -95,19 +103,14 @@ open class Common { ) } - fun setTextInDialogAndConfirm(activity: Activity, value: String) { - setTextInDialogAndConfirm(activity, value, "OK") + fun setTextInDialogAndConfirm(value: String) { + setTextInDialogAndConfirm(value, "OK") } - fun setTextInDialogAndConfirm(activity: Activity, value: String, buttonText: String) { - onView(withClassName(Matchers.containsString("EditText"))) - .check { view, _ -> - activity.runOnUiThread { - (view as EditText).setText(value) - } - } - onView(withText(buttonText)).perform(ViewActions.click()) + fun setTextInDialogAndConfirm(value: String, buttonText: String) { + onView(withClassName(Matchers.containsString("EditText"))).perform(click()).perform(typeText(value)) + onView(withText(buttonText)).perform(click()) } } \ No newline at end of file diff --git a/android/app/src/androidTest/java/it/casatta/KeyTest.kt b/android/app/src/androidTest/java/it/casatta/KeyTest.kt index d6b53df..3274554 100644 --- a/android/app/src/androidTest/java/it/casatta/KeyTest.kt +++ b/android/app/src/androidTest/java/it/casatta/KeyTest.kt @@ -1,48 +1,44 @@ package it.casatta -import android.content.Intent import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.pressBack import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.ext.junit.rules.activityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class KeyTest : Common() { - @get:Rule - var activityRule: ActivityTestRule = ActivityTestRule( - MainActivity::class.java, - true, - false - ) + val activityScenarioRule = activityScenarioRule() @Test fun randomKey() { - val activity = activityRule.launchActivity(Intent()) + if (!isTestnet()) + return + val keyName = "key${System.currentTimeMillis()}" onView(withId(R.id.key_button)).perform(click()) onView(withId(R.id.item_new)).perform(click()) clickElementInList("Random") - setTextInDialogAndConfirm(activity, keyName) + setTextInDialogAndConfirm(keyName) onView(withText(keyName)).check(matches(isDisplayed())) onView(withId(R.id.item_new)).perform(click()) clickElementInList("Random") - setTextInDialogAndConfirm(activity, keyName) + setTextInDialogAndConfirm(keyName) checkAndDismissDialog(R.string.key_exists) onView(isRoot()).perform(pressBack()) clickElementInList(keyName) onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, keyName, "DELETE") + setTextInDialogAndConfirm(keyName, "DELETE") checkAndDismissDialog(R.string.deleted) onView(withId(R.id.key_button)).perform(click()) checkElementNotInList(keyName) @@ -50,7 +46,6 @@ class KeyTest : Common() { @Test fun xprv() { - val activity = activityRule.launchActivity(Intent()) val keyName = "key${System.currentTimeMillis()}" val xprvs = mapOf( "mainnet" to "xprv9s21ZrQH143K2qwMASoVWNtTp23waKvSFEQELUbKKkpiH8c7YL56Uc4zDWrTgyeUrMsDxEt7CuGg3PZBwdygrMa3b4KTSowCQ7LEv48AaRQ", @@ -72,13 +67,13 @@ class KeyTest : Common() { onView(withId(R.id.key_button)).perform(click()) onView(withId(R.id.item_new)).perform(click()) clickElementInList(importsText[network]!!) - setTextInDialogAndConfirm(activity, keyName) - setTextInDialogAndConfirm(activity, xprvs[network]!!) + setTextInDialogAndConfirm(keyName) + setTextInDialogAndConfirm(xprvs[network]!!) onView(withText(keyName)).check(matches(isDisplayed())) clickElementInList(keyName) onView(withText(xpubs[network])).check(matches(isDisplayed())) onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, keyName, "DELETE") + setTextInDialogAndConfirm(keyName, "DELETE") checkAndDismissDialog(R.string.deleted) onView(withId(R.id.key_button)).perform(click()) checkElementNotInList(keyName) @@ -86,14 +81,13 @@ class KeyTest : Common() { val invalidNetwork = invalidNetwork(network) onView(withId(R.id.item_new)).perform(click()) clickElementInList(importsText[network]!!) - setTextInDialogAndConfirm(activity, keyName) - setTextInDialogAndConfirm(activity, xprvs[invalidNetwork]!!) + setTextInDialogAndConfirm(keyName) + setTextInDialogAndConfirm(xprvs[invalidNetwork]!!) checkAndDismissDialog(R.string.invalid_xprv_or_mnemonic) } @Test fun mnemonic() { - val activity = activityRule.launchActivity(Intent()) val keyName = "key${System.currentTimeMillis()}" val expectedXpubTestnet = @@ -111,19 +105,19 @@ class KeyTest : Common() { onView(withId(R.id.key_button)).perform(click()) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.import_mnemonic)) - setTextInDialogAndConfirm(activity, keyName) - setTextInDialogAndConfirm(activity, "invalid") + clickElementInList(getString(R.string.import_mnemonic)) + setTextInDialogAndConfirm(keyName) + setTextInDialogAndConfirm("invalid") checkAndDismissDialog(R.string.invalid_xprv_or_mnemonic) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.import_mnemonic)) - setTextInDialogAndConfirm(activity, keyName) - setTextInDialogAndConfirm(activity, mnemonic) + clickElementInList(getString(R.string.import_mnemonic)) + setTextInDialogAndConfirm(keyName) + setTextInDialogAndConfirm(mnemonic) onView(withText(keyName)).check(matches(isDisplayed())) clickElementInList(keyName) onView(withText(expectedXpub[network])).check(matches(isDisplayed())) onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, keyName, "DELETE") + setTextInDialogAndConfirm(keyName, "DELETE") checkAndDismissDialog(R.string.deleted) onView(withId(R.id.key_button)).perform(click()) checkElementNotInList(keyName) @@ -131,7 +125,6 @@ class KeyTest : Common() { @Test fun dice() { - val activity = activityRule.launchActivity(Intent()) val keyName = "key${System.currentTimeMillis()}" val expectedXpubTestnet = "tpubD6NzVbkrYhZ4YSC7guz8W7xZW1ftPPwsB9bAcEHrmdvmzyUSfhTDE8YV3M8WYegAmGorTpGvVGVKdXS5gWkCQ7GPZNUABkchvCyNpA51h5b" @@ -146,8 +139,8 @@ class KeyTest : Common() { onView(withId(R.id.key_button)).perform(click()) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.dice)) - setTextInDialogAndConfirm(activity, keyName) + clickElementInList(getString(R.string.dice)) + setTextInDialogAndConfirm(keyName) clickElementInList("20") for (i in 1..59) { clickElementInList("2") diff --git a/android/app/src/androidTest/java/it/casatta/SignTest.kt b/android/app/src/androidTest/java/it/casatta/SignTest.kt index 060a029..5c6e847 100644 --- a/android/app/src/androidTest/java/it/casatta/SignTest.kt +++ b/android/app/src/androidTest/java/it/casatta/SignTest.kt @@ -1,13 +1,14 @@ package it.casatta -import android.content.Intent import androidx.test.espresso.Espresso import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.ext.junit.rules.activityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.KotlinModule +import it.casatta.json.Data import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -15,126 +16,125 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class SignTest : Common() { + private val mapper = ObjectMapper().registerModule(KotlinModule()) @get:Rule - var activityRule: ActivityTestRule = ActivityTestRule( - MainActivity::class.java, - true, - false - ) + val activityScenarioRule = activityScenarioRule() @Test fun sign() { - val activity = activityRule.launchActivity(Intent()) - val network = getNetwork() - if ("mainnet" != network) { - val aliceTprv = "tprv8ZgxMBicQKsPfEf2t9eG7j14CDjS3JWL9nY3wgg6ZsLKY4tsR4wZjYuLsXWdyBPrMPo73JgeKmbd8pTkZZgQNWTdvCtDuauf52XGKL9zTDw" - val aliceKeyName = "alice_sign_test" - val bobTprv = "tprv8ZgxMBicQKsPetwSbvkSob1PLvNeBzHftBgG61S37ywMpsCnKMkUhPbKp7FyZDsU2QvMqbF797DRqmwedPQnR5qqmUBkFVb7iNeKcEZv3ck" - val bobKeyName = "bob_sign_test" - val wallet = "{\n" + - " \"name\": \"alice-and-bob\",\n" + - " \"descriptor\": \"wsh(multi(2,tpubD6NzVbkrYhZ4YhgpmoJrX8fAmFFNCdhEj68qECiPz98iNZ9e3Tm9v3XD3fzHZfBoLqeSm9oLtighoeijQ9jGAFm9raQ4JqHZ1N4BHyaBz6Y/0/*,tpubD6NzVbkrYhZ4YMyEVaR3CzfVuwtaMKUaTVH3NXULYFjkfMTYwka4stDBzHhHkxd4MEMVgyyEV1WBCrpwde72w8LzjAE6oRLARBAiCD8cGQV/0/*))#wss3kl0z\",\n" + - " \"fingerprints\": [\n" + - " \"1f5e43d8\",\n" + - " \"a2ebe04e\"\n" + - " ],\n" + - " \"required_sig\": 2,\n" + - " \"created_at_height\": 1835680\n" + - "}\n" - val walletName = "alice-and-bob" - - val tx = "cHNidP8BAFMCAAAAASFSbAAqstjwTxbGtWir21+meBp5LMcUQsBSgZ5bDtD7AQAAAAD+////AV6rCAAAAAAAF6kU4wEfjwloN3dvCV9wNOekdO53E92HAAAAAAX8bmFtZQh0by1jYXJvbAABAKECAAAAAcyd+J9zW1wSNV/mozPMv8mcXFzwQrK1EKq/FvRPJS40AQAAACMiACC+U25ZjJg9CiGsPhlAqQ0GWtFhOWxqopXdDTrh2oBdEP3///8Cp0lVAAAAAAAXqRRUIuqRoByuLh5D6zdViHWG7aGi84cVrAgAAAAAACIAIDz80EGjAUinXjMddGAtfQ3fKqcjgWj9wY5Y+8c7NA1zoAIcAAEBKxWsCAAAAAAAIgAgPPzQQaMBSKdeMx10YC19Dd8qpyOBaP3Bjlj7xzs0DXMBBUdSIQNP26ruccaqcu2cxRFYsPON2gj4ALrAFQ5ApBVtM+z9SiECIwjICs3MMHNnGbXPgSQKezAcOC5HzejKyjATzR8qXiRSriIGAiMIyArNzDBzZxm1z4EkCnswHDguR83oysowE80fKl4kDB9eQ9gAAAAAAAAAACIGA0/bqu5xxqpy7ZzFEViw843aCPgAusAVDkCkFW0z7P1KDKLr4E4AAAAAAAAAAAAA" - val txName = "to-carol" - - /// START importing key, wallet and tx - onView(withId(R.id.key_button)).perform(click()) - - onView(withId(R.id.item_new)).perform(click()) - clickElementInList("Import tprv") - setTextInDialogAndConfirm(activity, aliceKeyName) - setTextInDialogAndConfirm(activity, aliceTprv) - - onView(withId(R.id.item_new)).perform(click()) - clickElementInList("Import tprv") - setTextInDialogAndConfirm(activity, bobKeyName) - setTextInDialogAndConfirm(activity, bobTprv) - - Espresso.pressBack() - - onView(withId(R.id.wallet_button)).perform(click()) - onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, wallet) - - Espresso.pressBack() - - onView(withId(R.id.psbt_button)).perform(click()) - onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, tx) - - Espresso.pressBack() - /// END importing key, wallet and tx - - /// START selecting key, wallet and tx - onView(withId(R.id.key_button)).perform(click()) - clickElementInList(aliceKeyName) - onView(withId(R.id.select)).perform(click()) - - onView(withId(R.id.wallet_button)).perform(click()) - clickElementInList(walletName) - onView(withId(R.id.select)).perform(click()) - - onView(withId(R.id.psbt_button)).perform(click()) - clickElementInList(txName) - onView(withId(R.id.select)).perform(click()) - /// END selecting key, wallet and tx - - /// START signing - onView(withId(R.id.sign_button)).perform(click()) - checkAndDismissDialog(R.string.added_signatures) - - onView(withId(R.id.sign_button)).perform(click()) - checkAndDismissDialog("request to sign a PSBT already containing a signature from this key") - - onView(withId(R.id.key_button)).perform(click()) - clickElementInList(bobKeyName) - onView(withId(R.id.select)).perform(click()) - - onView(withId(R.id.sign_button)).perform(click()) - checkAndDismissDialog(R.string.added_signatures) - - onView(withId(R.id.sign_button)).perform(click()) - checkAndDismissDialog("request to sign a PSBT already containing a signature from this key") - /// END signing - - /// START deleting key, wallet and tx - onView(withId(R.id.psbt_button)).perform(click()) - clickElementInList(txName) - onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, txName, "DELETE") - checkAndDismissDialog(R.string.deleted) - - onView(withId(R.id.wallet_button)).perform(click()) - clickElementInList(walletName) - onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, walletName, "DELETE") - checkAndDismissDialog(R.string.deleted) - - onView(withId(R.id.key_button)).perform(click()) - clickElementInList(aliceKeyName) - onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, aliceKeyName, "DELETE") - checkAndDismissDialog(R.string.deleted) - - onView(withId(R.id.key_button)).perform(click()) - clickElementInList(bobKeyName) - onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, bobKeyName, "DELETE") - checkAndDismissDialog(R.string.deleted) - /// END deleting key, wallet and tx - } + if (!isTestnet()) + return + + val aliceTprv = "tprv8ZgxMBicQKsPfEf2t9eG7j14CDjS3JWL9nY3wgg6ZsLKY4tsR4wZjYuLsXWdyBPrMPo73JgeKmbd8pTkZZgQNWTdvCtDuauf52XGKL9zTDw" + val aliceTpub = "tpubD6NzVbkrYhZ4YhgpmoJrX8fAmFFNCdhEj68qECiPz98iNZ9e3Tm9v3XD3fzHZfBoLqeSm9oLtighoeijQ9jGAFm9raQ4JqHZ1N4BHyaBz6Y" + val aliceKeyName = "alice_sign_test" + val bobTprv = "tprv8ZgxMBicQKsPetwSbvkSob1PLvNeBzHftBgG61S37ywMpsCnKMkUhPbKp7FyZDsU2QvMqbF797DRqmwedPQnR5qqmUBkFVb7iNeKcEZv3ck" + val bobTpub = "tpubD6NzVbkrYhZ4YMyEVaR3CzfVuwtaMKUaTVH3NXULYFjkfMTYwka4stDBzHhHkxd4MEMVgyyEV1WBCrpwde72w8LzjAE6oRLARBAiCD8cGQV" + val bobKeyName = "bob_sign_test" + val requiredSig = 2; + val walletName = "alice-and-bob" + val descriptor = "wsh(multi($requiredSig,$aliceTpub/0/*,$bobTpub/0/*))" + val wallet = Data.WalletJson( + walletName, + descriptor, + listOf("1f5e43d8", "a2ebe04e"), + requiredSig, + 1835680, + null + ) + val walletString = mapper.writeValueAsString(wallet) + + val tx = "cHNidP8BAFMCAAAAASFSbAAqstjwTxbGtWir21+meBp5LMcUQsBSgZ5bDtD7AQAAAAD+////AV6rCAAAAAAAF6kU4wEfjwloN3dvCV9wNOekdO53E92HAAAAAAX8bmFtZQh0by1jYXJvbAABAKECAAAAAcyd+J9zW1wSNV/mozPMv8mcXFzwQrK1EKq/FvRPJS40AQAAACMiACC+U25ZjJg9CiGsPhlAqQ0GWtFhOWxqopXdDTrh2oBdEP3///8Cp0lVAAAAAAAXqRRUIuqRoByuLh5D6zdViHWG7aGi84cVrAgAAAAAACIAIDz80EGjAUinXjMddGAtfQ3fKqcjgWj9wY5Y+8c7NA1zoAIcAAEBKxWsCAAAAAAAIgAgPPzQQaMBSKdeMx10YC19Dd8qpyOBaP3Bjlj7xzs0DXMBBUdSIQNP26ruccaqcu2cxRFYsPON2gj4ALrAFQ5ApBVtM+z9SiECIwjICs3MMHNnGbXPgSQKezAcOC5HzejKyjATzR8qXiRSriIGAiMIyArNzDBzZxm1z4EkCnswHDguR83oysowE80fKl4kDB9eQ9gAAAAAAAAAACIGA0/bqu5xxqpy7ZzFEViw843aCPgAusAVDkCkFW0z7P1KDKLr4E4AAAAAAAAAAAAA" + val txName = "to-carol" + + /// START importing key, wallet and tx + onView(withId(R.id.key_button)).perform(click()) + + onView(withId(R.id.item_new)).perform(click()) + clickElementInList("Import tprv") + setTextInDialogAndConfirm(aliceKeyName) + setTextInDialogAndConfirm(aliceTprv) + + onView(withId(R.id.item_new)).perform(click()) + clickElementInList("Import tprv") + setTextInDialogAndConfirm(bobKeyName) + setTextInDialogAndConfirm(bobTprv) + + Espresso.pressBack() + + onView(withId(R.id.wallet_button)).perform(click()) + onView(withId(R.id.item_new)).perform(click()) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(walletString) + + Espresso.pressBack() + + onView(withId(R.id.psbt_button)).perform(click()) + onView(withId(R.id.item_new)).perform(click()) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(tx) + + Espresso.pressBack() + /// END importing key, wallet and tx + + /// START selecting key, wallet and tx + onView(withId(R.id.key_button)).perform(click()) + clickElementInList(aliceKeyName) + onView(withId(R.id.select)).perform(click()) + + onView(withId(R.id.wallet_button)).perform(click()) + clickElementInList(walletName) + onView(withId(R.id.select)).perform(click()) + + onView(withId(R.id.psbt_button)).perform(click()) + clickElementInList(txName) + onView(withId(R.id.select)).perform(click()) + /// END selecting key, wallet and tx + + /// START signing + onView(withId(R.id.sign_button)).perform(click()) + checkAndDismissDialog(R.string.added_signatures) + + onView(withId(R.id.sign_button)).perform(click()) + checkAndDismissDialog("request to sign a PSBT already containing a signature from this key") + + onView(withId(R.id.key_button)).perform(click()) + clickElementInList(bobKeyName) + onView(withId(R.id.select)).perform(click()) + + onView(withId(R.id.sign_button)).perform(click()) + checkAndDismissDialog(R.string.added_signatures) + + onView(withId(R.id.sign_button)).perform(click()) + checkAndDismissDialog("request to sign a PSBT already containing a signature from this key") + /// END signing + + /// START deleting key, wallet and tx + onView(withId(R.id.psbt_button)).perform(click()) + clickElementInList(txName) + onView(withId(R.id.delete)).perform(click()) + setTextInDialogAndConfirm(txName, "DELETE") + checkAndDismissDialog(R.string.deleted) + + onView(withId(R.id.wallet_button)).perform(click()) + clickElementInList(walletName) + onView(withId(R.id.delete)).perform(click()) + setTextInDialogAndConfirm(walletName, "DELETE") + checkAndDismissDialog(R.string.deleted) + + onView(withId(R.id.key_button)).perform(click()) + clickElementInList(aliceKeyName) + onView(withId(R.id.delete)).perform(click()) + setTextInDialogAndConfirm(aliceKeyName, "DELETE") + checkAndDismissDialog(R.string.deleted) + + onView(withId(R.id.key_button)).perform(click()) + clickElementInList(bobKeyName) + onView(withId(R.id.delete)).perform(click()) + setTextInDialogAndConfirm(bobKeyName, "DELETE") + checkAndDismissDialog(R.string.deleted) + /// END deleting key, wallet and tx } diff --git a/android/app/src/androidTest/java/it/casatta/TransactionTest.kt b/android/app/src/androidTest/java/it/casatta/TransactionTest.kt index 8165e62..07a0e86 100644 --- a/android/app/src/androidTest/java/it/casatta/TransactionTest.kt +++ b/android/app/src/androidTest/java/it/casatta/TransactionTest.kt @@ -1,12 +1,11 @@ package it.casatta -import android.content.Intent import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.ext.junit.rules.activityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -16,15 +15,13 @@ import org.junit.runner.RunWith class TransactionTest : Common() { @get:Rule - var activityRule: ActivityTestRule = ActivityTestRule( - MainActivity::class.java, - true, - false - ) + val activityScenarioRule = activityScenarioRule() @Test fun transaction() { - val activity = activityRule.launchActivity(Intent()) + if (!isTestnet()) + return + val transactionBase64 = "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEDBAEAAAABBCIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQVHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4iBgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8OcxDZDGpPAAAAgAAAAIADAACAIgYDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwQ2QxqTwAAAIAAAACAAgAAgAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA" val psbtName = "psbt-0" @@ -33,28 +30,28 @@ class TransactionTest : Common() { checkElementNotInList(psbtName) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, transactionBase64) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(transactionBase64) onView(withText(psbtName)).check(matches(isDisplayed())) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, transactionBase64) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(transactionBase64) checkAndDismissDialog("PSBT did not change after merge") onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, "InvalidBase64") + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm("InvalidBase64") checkAndDismissDialog("PSBT has bad base64 string encoding") onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, "Y2lhbwo=") // valid base64 but not PSBT + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm("Y2lhbwo=") // valid base64 but not PSBT checkAndDismissDialog("Cannot deserialize PSBT") clickElementInList(psbtName) onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, psbtName, "DELETE") + setTextInDialogAndConfirm(psbtName, "DELETE") } diff --git a/android/app/src/androidTest/java/it/casatta/WalletTest.kt b/android/app/src/androidTest/java/it/casatta/WalletTest.kt index c61ed41..c50dda0 100644 --- a/android/app/src/androidTest/java/it/casatta/WalletTest.kt +++ b/android/app/src/androidTest/java/it/casatta/WalletTest.kt @@ -1,12 +1,11 @@ package it.casatta -import android.content.Intent import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.ext.junit.rules.activityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.KotlinModule import it.casatta.json.Data @@ -20,15 +19,11 @@ class WalletTest : Common() { private val mapper = ObjectMapper().registerModule(KotlinModule()) @get:Rule - var activityRule: ActivityTestRule = ActivityTestRule( - MainActivity::class.java, - true, - false - ) + val activityScenarioRule = activityScenarioRule() @Test fun wallet() { - val activity = activityRule.launchActivity(Intent()) + val descriptorMainMainnet = "wsh(multi(2,xpub661MyMwAqRbcFL1pGULVsWqCN3tRyneHcTKq8rzvt6Mh9vwG5sPM2QPU4pFdRkqi9SMu7S35CNve2gjxPLtHhQVKhMuUoEtfPnjePzX2xWk/0/*,xpub661MyMwAqRbcFL1pGULVsWqCN3tRyneHcTKq8rzvt6Mh9vwG5sPM2QPU4pFdRkqi9SMu7S35CNve2gjxPLtHhQVKhMuUoEtfPnjePzX2xWk/0/*))#q0agyfvx"; val descriptorMainTestnet = @@ -53,16 +48,16 @@ class WalletTest : Common() { onView(withId(R.id.wallet_button)).perform(click()) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, walletString) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(walletString) onView(withText(name)).check(matches(isDisplayed())) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, walletString) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm( walletString) checkAndDismissDialog(R.string.wallet_not_imported) clickElementInList(name) onView(withId(R.id.delete)).perform(click()) - setTextInDialogAndConfirm(activity, name, "DELETE") + setTextInDialogAndConfirm(name, "DELETE") checkAndDismissDialog(R.string.deleted) onView(withId(R.id.wallet_button)).perform(click()) checkElementNotInList(name) @@ -78,9 +73,10 @@ class WalletTest : Common() { ) val invalidWalletString = mapper.writeValueAsString(invalidWallet) onView(withId(R.id.item_new)).perform(click()) - clickElementInList(activity.getString(R.string.insert_manually)) - setTextInDialogAndConfirm(activity, invalidWalletString) + clickElementInList(getString(R.string.insert_manually)) + setTextInDialogAndConfirm(invalidWalletString) checkAndDismissDialog(R.string.wallet_not_imported) + } } diff --git a/android/app/src/main/java/it/casatta/C.kt b/android/app/src/main/java/it/casatta/C.kt index af4eb56..016727f 100644 --- a/android/app/src/main/java/it/casatta/C.kt +++ b/android/app/src/main/java/it/casatta/C.kt @@ -1,6 +1,5 @@ package it.casatta -import android.app.Activity import android.content.Context import android.content.Intent import android.widget.EditText diff --git a/android/app/src/main/java/it/casatta/ListActivity.kt b/android/app/src/main/java/it/casatta/ListActivity.kt index b69500b..176dac1 100644 --- a/android/app/src/main/java/it/casatta/ListActivity.kt +++ b/android/app/src/main/java/it/casatta/ListActivity.kt @@ -353,7 +353,6 @@ class ListActivity : AppCompatActivity() , ItemsAdapter.ItemGesture { } private fun saveWallet(content: String) { - Log.d("LIST", "saveWallet $content") try { val json = mapper.readValue(content, Data.WalletJson::class.java) Rust().importWallet(filesDir.toString(), json)