package com.peachpasswords.ui.vault import com.peachpasswords.vault.VaultEntry import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test class ExportRoundTripTest { // PeachScript packs the id as 16 raw UUID bytes (browser parity), so test // entries use real UUIDs as production entries do (addEntry assigns one). private fun entry() = VaultEntry( id = "11111111-2222-3333-4444-555555555555", title = "GitHub", type = "login", username = "june", password = "hunter2", url = "https://github.com", notes = "my note", totp = "JBSWY3DPEHPK3PXP", createdAt = 0, modifiedAt = 0, ) @Test fun csv_formula_injection_is_guarded() { assertEquals("'=1+1", CsvExport.encodeField("=1+1")) assertEquals("'@cmd", CsvExport.encodeField("@cmd")) assertEquals("'-2", CsvExport.encodeField("-2")) } @Test fun csv_quotes_fields_with_commas_and_quotes() { assertEquals("\"a,b\"", CsvExport.encodeField("a,b")) assertEquals("\"he\"\"llo\"", CsvExport.encodeField("he\"llo")) assertEquals("plain", CsvExport.encodeField("plain")) } @Test fun csv_has_header_and_row() { val csv = CsvExport.toCsv(listOf(entry())) val lines = csv.trim().split("\r\n") assertEquals("title,username,password,url,notes", lines[0]) assertTrue(lines[1].startsWith("GitHub,june,hunter2,")) } @Test fun peachscript_export_is_peachscript_text() { val out = PeachScriptExport.buildEncrypted(listOf(entry()), "backup-pass-12") assertTrue(PeachScriptImport.looksLikePeachScript(out)) assertTrue(PeachScriptImport.isEncrypted(out)) } @Test fun peachscript_encrypted_round_trips_with_correct_password() { val blob = PeachScriptExport.buildEncrypted(listOf(entry()), "backup-pass-12") assertTrue(PeachScriptImport.isEncrypted(blob)) val ok = PeachScriptImport.decryptAndParse(blob, "backup-pass-12") assertTrue(ok is PeachScriptImport.DecryptResult.Success) ok as PeachScriptImport.DecryptResult.Success assertEquals(1, ok.entries.size) assertEquals("hunter2", ok.entries[0].password) assertEquals("june", ok.entries[0].username) assertEquals("my note", ok.entries[0].notes) assertEquals("JBSWY3DPEHPK3PXP", ok.entries[0].totp) } @Test fun peachscript_encrypted_rejects_wrong_password() { val blob = PeachScriptExport.buildEncrypted(listOf(entry()), "backup-pass-12") val r = PeachScriptImport.decryptAndParse(blob, "wrong-password") assertTrue(r is PeachScriptImport.DecryptResult.WrongPassword) } }