VaultSeedTest.kt

2.8 KB · raw

1package com.peachpasswords.qa23import android.content.Context4import androidx.test.core.app.ApplicationProvider5import androidx.test.ext.junit.runners.AndroidJUnit46import com.peachpasswords.di.VaultRepositoryEntryPoint7import com.peachpasswords.vault.CreateVaultResult8import com.peachpasswords.vault.UnlockResult9import com.peachpasswords.vault.VaultEntry10import dagger.hilt.android.EntryPointAccessors11import kotlinx.coroutines.runBlocking12import org.junit.Assert.assertEquals13import org.junit.Assert.assertTrue14import org.junit.Test15import org.junit.runner.RunWith1617/**18 * Emulator-QA harness: seeds a real vault in-process so autofill and19 * keyboard-row chip testing never depends on IME text injection (Gboard20 * corrupts `adb input text`). Idempotent — safe to re-run; existing vaults21 * and entries are left untouched.22 *23 * Deliberately activity-free: the onboarding screen runs an infinite Compose24 * animation, so `ActivityScenario.launch`'s waitForIdleSync never returns.25 * The repository is fetched straight from Hilt instead.26 *27 * The master password below is QA-only and lives solely on throwaway28 * emulator vaults.29 */30@RunWith(AndroidJUnit4::class)31class VaultSeedTest {3233    private val masterPassword = "Tulip9Marble42"3435    @Test36    fun seedVaultWithLoginsForAutofillQA() {37        val context = ApplicationProvider.getApplicationContext<Context>()38        val vault = EntryPointAccessors39            .fromApplication(context, VaultRepositoryEntryPoint::class.java)40            .vaultRepository()41        runBlocking {42            if (!vault.hasVault()) {43                assertEquals(CreateVaultResult.Success, vault.createVault(masterPassword))44            }45            if (!vault.isUnlocked.value) {46                assertEquals(UnlockResult.Success, vault.unlock(masterPassword))47            }48            if (vault.getEntries().isEmpty()) {49                // GitHub gets TOTP for the OTP chip QA path (E2-fix). The seed50                // is the well-known "Hello!Þ­¾ï" base32 string51                // used in every TOTP unit test -- produces a deterministic52                // code that matches what the chip will render.53                vault.addEntry(login("GitHub", "https://github.com").copy(totp = "JBSWY3DPEHPK3PXP"))54                vault.addEntry(login("Proton Mail", "https://account.proton.me/login"))55                vault.addEntry(login("Vercel", "https://vercel.com/login"))56            }57            val entries = vault.getEntries()58            assertEquals(3, entries.size)59            assertTrue(entries.all { it.password != null && it.url != null })60        }61    }6263    private fun login(title: String, url: String) = VaultEntry(64        id = "",65        type = "login",66        title = title,67        username = "june",68        password = "Correct-Horse-$title-42",69        url = url,70        createdAt = 0,71        modifiedAt = 0,72    )73}