vcard visualiation

This commit is contained in:
Hadrian Burkhardt
2026-02-26 05:11:34 +01:00
parent 027d2391b7
commit 3d2d451815
10 changed files with 1088 additions and 49 deletions
@@ -1,6 +1,9 @@
package com.clean.scanner.util
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Test
class ScanContentParsersTest {
@@ -23,4 +26,141 @@ class ScanContentParsersTest {
assertEquals("x@y.com", ScanContentParsers.extractEmail("mailto:x@y.com?subject=hi"))
assertEquals("a.b+c@d.dev", ScanContentParsers.extractEmail("contact me at a.b+c@d.dev now"))
}
@Test
fun parseContact_handlesVCard() {
val raw = """
BEGIN:VCARD
VERSION:3.0
FN:Jane Doe
ORG:Acme Corp
TITLE:Ops Lead
TEL;TYPE=CELL:+1234567
EMAIL:jane@acme.com
ADR:;;Main Street 1;Berlin;;;Germany
NOTE:VIP
END:VCARD
""".trimIndent()
val parsed = ScanContentParsers.parseContact(raw)
assertNotNull(parsed)
assertEquals("Jane Doe", parsed?.fullName)
assertEquals("Acme Corp", parsed?.organization)
assertEquals("Ops Lead", parsed?.title)
assertEquals("+1234567", parsed?.phones?.firstOrNull())
assertEquals("jane@acme.com", parsed?.emails?.firstOrNull())
assertTrue(parsed?.address?.contains("Main Street 1") == true)
assertEquals("VIP", parsed?.note)
}
@Test
fun parseContact_handlesMeCard() {
val raw = "MECARD:N:Doe,John;TEL:+49111;EMAIL:john@doe.dev;ADR:Street 9;NOTE:Friend;;"
val parsed = ScanContentParsers.parseContact(raw)
assertNotNull(parsed)
assertEquals("John Doe", parsed?.fullName)
assertEquals("+49111", parsed?.phones?.firstOrNull())
assertEquals("john@doe.dev", parsed?.emails?.firstOrNull())
assertEquals("Street 9", parsed?.address)
assertEquals("Friend", parsed?.note)
}
@Test
fun parseContact_handlesParameterizedVCardKeysAndNameOrder() {
val raw = """
BEGIN:VCARD
VERSION:3.0
N:Doe;John;;Dr.;
ORG;CHARSET=UTF-8:ACME Inc
TITLE;LANGUAGE=en:Engineering Manager
TEL;TYPE=WORK,VOICE:+12025550123
EMAIL;TYPE=INTERNET:john.doe@acme.com
END:VCARD
""".trimIndent()
val parsed = ScanContentParsers.parseContact(raw)
assertNotNull(parsed)
assertEquals("Dr. John Doe", parsed?.fullName)
assertEquals("ACME Inc", parsed?.organization)
assertEquals("Engineering Manager", parsed?.title)
assertEquals("+12025550123", parsed?.phones?.firstOrNull())
assertEquals("john.doe@acme.com", parsed?.emails?.firstOrNull())
}
@Test
fun parseCalendarEvent_handlesVEvent() {
val raw = """
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Team Sync
DESCRIPTION:Weekly planning
LOCATION:Room A
DTSTART:20270110T103000Z
DTEND:20270110T110000Z
END:VEVENT
END:VCALENDAR
""".trimIndent()
val parsed = ScanContentParsers.parseCalendarEvent(raw)
assertNotNull(parsed)
assertEquals("Team Sync", parsed?.title)
assertEquals("Weekly planning", parsed?.description)
assertEquals("Room A", parsed?.location)
assertNotNull(parsed?.startMillis)
assertNotNull(parsed?.endMillis)
assertFalse(parsed?.allDay ?: true)
}
@Test
fun parseContact_handlesTecItVCardPayload() {
val raw = """
BEGIN:VCARD
VERSION:3.0
N:Doe;John;;;
FN:John Doe
ORG:TEC-IT
TITLE:Position
ADR;TYPE=WORK:;;203 New York Ave;New York;NY;11377;USA
TEL;TYPE=WORK,VOICE:+43 7252 72720
TEL;TYPE=CELL:+43 660 1234567
TEL;TYPE=FAX:+43 7252 72720-77
EMAIL;TYPE=INTERNET:support@tec-it.com
URL:http://www.tec-it.com
LOGO;VALUE=URI:http://lh5.googleusercontent.com/-7RwzuzOVTsw/SypSXHmWr7I/AAAAAAAAAB0/5vE5NqugtLQ/TEC-IT_Banner_120x29.gif
END:VCARD
""".trimIndent()
val parsed = ScanContentParsers.parseContact(raw)
assertNotNull(parsed)
assertEquals("John Doe", parsed?.fullName)
assertEquals("TEC-IT", parsed?.organization)
assertEquals("Position", parsed?.title)
assertEquals("support@tec-it.com", parsed?.emails?.firstOrNull())
assertTrue(parsed?.phones?.contains("+43 7252 72720") == true)
assertTrue(parsed?.phones?.contains("+43 660 1234567") == true)
assertTrue(parsed?.phones?.contains("+43 7252 72720-77") == true)
assertTrue(parsed?.address?.contains("203 New York Ave") == true)
assertTrue(parsed?.address?.contains("New York") == true)
assertTrue(parsed?.address?.contains("NY") == true)
assertTrue(parsed?.address?.contains("11377") == true)
assertTrue(parsed?.address?.contains("USA") == true)
}
@Test
fun parseContact_handlesTecItMeCardPayload() {
val raw = "MECARD:N:Doe,John;ORG:TEC-IT;TITLE:Position;ADR:203 New York Ave, New York, NY 11377, USA;TEL:+43 7252 72720;TEL:+43 660 1234567;TEL:+43 7252 72720-77;EMAIL:support@tec-it.com;URL:http://www.tec-it.com;NOTE:Logo http://lh5.googleusercontent.com/-7RwzuzOVTsw/SypSXHmWr7I/AAAAAAAAAB0/5vE5NqugtLQ/TEC-IT_Banner_120x29.gif;;"
val parsed = ScanContentParsers.parseContact(raw)
assertNotNull(parsed)
assertEquals("John Doe", parsed?.fullName)
assertEquals("TEC-IT", parsed?.organization)
assertEquals("Position", parsed?.title)
assertEquals("support@tec-it.com", parsed?.emails?.firstOrNull())
assertTrue(parsed?.phones?.contains("+43 7252 72720") == true)
assertTrue(parsed?.phones?.contains("+43 660 1234567") == true)
assertTrue(parsed?.phones?.contains("+43 7252 72720-77") == true)
assertEquals("203 New York Ave, New York, NY 11377, USA", parsed?.address)
}
}