OnboardingTest.kt

3.9 KB · raw

1package com.peachpasswords.ui.onboarding23import com.peachpasswords.ui.PeachNav4import org.junit.Assert.assertEquals5import org.junit.Assert.assertFalse6import org.junit.Assert.assertNotNull7import org.junit.Assert.assertNull8import org.junit.Assert.assertTrue9import org.junit.Test1011class OnboardingTest {1213    // ── Launch guard ──────────────────────────────────────────────────────────1415    @Test fun onboarding_shows_first_launch() {16        assertEquals(PeachNav.Onboarding, onboardingStartDestination(hasVault = false, onboarded = false))17    }1819    @Test fun onboarding_skipped_after_completion() {20        // Onboarded → Lock even with no vault yet (quit mid-create returns to Lock).21        assertEquals(PeachNav.Lock, onboardingStartDestination(hasVault = false, onboarded = true))22        // Existing vault → always Lock, regardless of flag.23        assertEquals(PeachNav.Lock, onboardingStartDestination(hasVault = true, onboarded = false))24        assertEquals(PeachNav.Lock, onboardingStartDestination(hasVault = true, onboarded = true))25    }2627    // ── Card copy (the spec is ONBOARDING_CARDS, ported from the browser) ──────2829    @Test fun onboarding_has_three_cards() {30        assertEquals(3, ONBOARDING_CARDS.size)31    }3233    @Test fun onboarding_card_copy_card1_matches_spec() {34        val c = ONBOARDING_CARDS[0]35        assertTrue(c.headline.contains("live here"))36        assertEquals(2, c.body.size)37        assertTrue(c.body[0].contains("No account. No server."))38        assertTrue(c.body[1].contains("encrypted on your device"))39    }4041    @Test fun onboarding_card_copy_card2_matches_spec() {42        val c = ONBOARDING_CARDS[1]43        assertEquals("two keys.", c.headline)44        assertEquals(2, c.body.size)45        assertTrue(c.body[0].contains("master password is yours alone"))46        assertTrue(c.body[1].contains("12 recovery words"))47    }4849    @Test fun onboarding_card_copy_card3_matches_spec() {50        val c = ONBOARDING_CARDS[2]51        assertTrue(c.headline.contains("everything"))52        assertEquals(2, c.body.size)53        assertTrue(c.body[0].contains("Free includes"))54        assertTrue(c.body[1].contains("Pro adds"))55    }5657    // Card 2 ("two keys.") carries the warning, not card 3 — verified against58    // the browser's BASE_CARDS (Onboarding.tsx); a prior pass had this on the59    // wrong card (ONBOARDING_ADDENDUM.md §1).60    @Test fun onboarding_card2_has_warning_row() {61        assertNotNull("card 2 carries the warning", ONBOARDING_CARDS[1].warning)62        assertTrue(ONBOARDING_CARDS[1].warning!!.contains("cannot be opened"))63        assertNull(ONBOARDING_CARDS[0].warning)64        assertNull(ONBOARDING_CARDS[2].warning)65    }6667    // ── Nav row ───────────────────────────────────────────────────────────────6869    @Test fun back_is_hidden_on_first_card() {70        assertFalse(onboardingBackVisible(0))71    }7273    @Test fun back_is_visible_on_later_cards() {74        assertTrue(onboardingBackVisible(1))75        assertTrue(onboardingBackVisible(2))76    }7778    @Test fun forward_label_is_next_until_last_card() {79        val count = ONBOARDING_CARDS.size80        assertEquals("next →", onboardingNextLabel(0, count))81        assertEquals("next →", onboardingNextLabel(1, count))82    }8384    @Test fun forward_label_is_create_vault_on_last_card() {85        val count = ONBOARDING_CARDS.size86        assertEquals("create vault", onboardingNextLabel(count - 1, count))87    }8889    @Test fun existing_user_choices_put_pairing_first_and_name_restore_separately() {90        assertEquals("Create a new vault", ONBOARD_CREATE_LABEL)91        assertEquals("Pair with another device", ONBOARD_PAIR_LABEL)92        assertEquals("Restore a backup", ONBOARD_RESTORE_LABEL)93    }94}