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 jdenantes on 21/09/16. */ public class GenerateUniquePhoneNumberUsTest { private String output; private AbstractGenerateUniquePhoneNumber gnu = new GenerateUniquePhoneNumberUs(); private GeneratePhoneNumberUS gpn = new GeneratePhoneNumberUS(); private static PhoneNumberUtil GOOGLE_PHONE_UTIL = PhoneNumberUtil.getInstance(); @Before public void setUp() throws Exception { gnu.setRandom(new Random(42)); gnu.setKeepFormat(true); } @Test public void testKeepInvalidPatternTrue() { gnu.setKeepInvalidPattern(true); output = gnu.generateMaskedRow(null); assertEquals(null, output); output = gnu.generateMaskedRow(""); assertEquals("", output); output = gnu.generateMaskedRow("AHDBNSKD"); assertEquals("AHDBNSKD", output); } @Test public void testKeepInvalidPatternFalse() { gnu.setKeepInvalidPattern(false); output = gnu.generateMaskedRow(null); assertEquals(null, output); output = gnu.generateMaskedRow(""); assertEquals("", output); output = gnu.generateMaskedRow("AHDBNSKD"); assertEquals("AHDBNSKD", output); } @Test public void testGood1() { output = gnu.generateMaskedRow("35-6/42-5/9 865"); assertEquals("35-6/41-6/5 815", output); } @Test public void testGood2() { gnu.setKeepFormat(false); // with spaces output = gnu.generateMaskedRow("356-425-9865"); assertEquals("3564165815", output); } @Test public void testWrongSsnFieldNumber() { gnu.setKeepInvalidPattern(false); // with two 1 at the fifth and the sixth position output = gnu.generateMaskedRow("465 311 9856"); assertEquals("308 075 2722", output); } @Test public void testValidAfterMasking() { gnu.setKeepFormat(false); String input; String output; for (int i = 0; i < 100; i++) { gpn.setRandom(new Random()); input = gpn.doGenerateMaskedField(null); if (isValidPhoneNumber(input) && !(input.charAt(5) == '1' && input.charAt(6) == '1')) { for (int j = 0; j < 1000; j++) { long rgenseed = System.nanoTime(); gnu.setRandom(new Random(rgenseed)); output = gnu.generateMaskedRow(input); Assert.assertTrue("Don't worry, report this line to 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.US.getCountry()); } catch (Exception e) { return false; } return GOOGLE_PHONE_UTIL.isValidNumberForRegion(phonenumber, Locale.US.getCountry()); } }