ContactHeuristicParserTest.kt 69 lignes · 2645 octets
package fr.ebii.card2vcf.contact

import fr.ebii.card2vcf.ocr.OcrPostProcessor
import fr.ebii.card2vcf.ocr.OcrResult
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue

class ContactHeuristicParserTest {

    @Test fun parseCarteDimoBruitee() {
        val text = """
            dimo
            SOFTWARE &—
            Jean Pau! GENOUX
            Directeur Général/CEO
            jpgenoux@dimosoftware.com
            Mobile : +33 (0)6 74 64 05 44 / Tél. : +33 (0)4 72 86 O1 92
            Siège Social
            561, alée des Noisetiers - 69 760 Limonest - France
            Lyon - Paris - Nantes - Biarritz - Madrid — Toronto
            www.dimosoftware.fr
        """.trimIndent()
        val ocr = OcrPostProcessor.process(text)
        val card = ContactHeuristicParser.parse(ocr)

        assertEquals("Jean Paul Genoux", card.fullName)
        assertEquals("Jean Paul", card.firstName)
        assertEquals("Genoux", card.lastName)
        assertTrue(card.jobTitle!!.contains("Directeur", ignoreCase = true))
        assertTrue(card.company!!.contains("Software", ignoreCase = true) || card.company!!.contains("dimo", ignoreCase = true))
        assertTrue(card.emails.contains("jpgenoux@dimosoftware.com"))
        assertTrue(card.phones.any { it.endsWith("674640544") })
        assertTrue(card.phones.any { it.contains("472860192") })
        assertTrue(card.website!!.contains("dimosoftware.fr"))
        assertNotNull(card.address)
        assertTrue(card.address!!.contains("Noisetiers") || card.address!!.contains("Limonest"))
    }

    @Test fun splitNomAvecNomFamilleMajuscules() {
        val (first, last, full) = ContactHeuristicParser.splitPersonName("Marie CURIE")
        assertEquals("Marie", first)
        assertEquals("Curie", last)
        assertEquals("Marie Curie", full)
    }

    @Test fun societeDepuisEmail() {
        assertEquals("Dimo Software", ContactHeuristicParser.companyFromEmailDomain("jp@dimosoftware.com"))
    }

    @Test fun mergeSansLlmRemplitQuandMemeLesChamps() {
        val ocr = OcrPostProcessor.process(
            """
            Acme SAS
            Alice Martin
            CEO
            alice@acme.fr
            01 23 45 67 89
            10 rue de Paris 75001 Paris
            """.trimIndent()
        )
        val merged = ContactDraftMerge.merge(null, ocr)
        assertEquals("Alice Martin", merged.fullName)
        assertTrue(merged.emails.contains("alice@acme.fr"))
        assertTrue(merged.jobTitle!!.contains("CEO", ignoreCase = true))
        assertNotNull(merged.company)
    }
}