package org.talend.dataquality.datamasking.functions; import static org.junit.Assert.assertEquals; import java.util.Locale; import java.util.Random; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; /** * Created by jteuladedenantes on 22/09/16. */ public class GenerateUniquePhoneNumberFrTest { private String output; private AbstractGenerateUniquePhoneNumber gnf = new GenerateUniquePhoneNumberFr(); private GeneratePhoneNumberFrench gpn = new GeneratePhoneNumberFrench(); private static PhoneNumberUtil GOOGLE_PHONE_UTIL = PhoneNumberUtil.getInstance(); @Before public void setUp() throws Exception { gnf.setRandom(new Random(42)); gnf.setKeepFormat(true); } @Test public void testValidWithFormat() { output = gnf.generateMaskedRow("01.42.95.45.24"); assertEquals("01.42.64.32.92", output); output = gnf.generateMaskedRow("(0033) 6 48 98 75 12"); assertEquals("(0033) 6 48 65 98 96", output); } @Test public void testValidWithoutFormat() { gnf.setKeepFormat(false); // with spaces output = gnf.generateMaskedRow("01.42.95.45.24"); assertEquals("0142643292", output); } @Test public void testInvalid() { // without a number output = gnf.generateMaskedRow("35686"); assertEquals("30807", output); gnf.setKeepInvalidPattern(true); // with a letter output = gnf.generateMaskedRow("35686"); assertEquals("35686", output); } @Test public void testValidAfterMasking() { gnf.setKeepFormat(false); String input; String output; for (int i = 0; i < 100; i++) { gpn.setRandom(new Random()); input = gpn.doGenerateMaskedField(null); if (isValidPhoneNumber(input)) { for (int j = 0; j < 1000; j++) { long rgenseed = System.nanoTime(); gnf.setRandom(new Random(rgenseed)); output = gnf.generateMaskedRow(input); Assert.assertTrue("Don't worry, report this line to the Data Quality team: with a seed = " + rgenseed + ", " + input + " is valid, but after the masking " + output + " is not valid", isValidPhoneNumber(output)); } } } } /** * * whether a phone number is valid for a certain region. * * @param data the data that we want to validate * @return a boolean that indicates whether the number is of a valid pattern */ public static boolean isValidPhoneNumber(Object data) { Phonenumber.PhoneNumber phonenumber = null; try { phonenumber = GOOGLE_PHONE_UTIL.parse(data.toString(), Locale.FRANCE.getCountry()); } catch (Exception e) { return false; } return GOOGLE_PHONE_UTIL.isValidNumberForRegion(phonenumber, Locale.FRANCE.getCountry()); } }