/** * */ package com.mcac0006.services.siftscience; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Calendar; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.mcac0006.siftscience.SiftScienceHelper; import com.mcac0006.siftscience.score.domain.Label; import com.mcac0006.siftscience.score.domain.Reason; import com.mcac0006.siftscience.score.domain.SiftScienceScore; /** * @author <a href="mailto:matthew.cachia@gmail.com">Matthew Cachia</a> * */ @RunWith(PowerMockRunner.class) @PrepareForTest(ClientBuilder.class) public class SiftScienceScoreTest { @Mock private Response responseMock; @Before public void setup() { // ... and inject the mock into the static method. final Builder builderMock = Mockito.mock(Builder.class); Mockito.when(builderMock.get()).thenReturn(responseMock); final WebTarget webTargetMock = Mockito.mock(WebTarget.class); Mockito.when(webTargetMock.request(MediaType.APPLICATION_JSON_TYPE)).thenReturn(builderMock); Mockito.when(webTargetMock.path(Mockito.anyString())).thenReturn(webTargetMock); Mockito.when(webTargetMock.queryParam(Mockito.anyString(), Mockito.anyString())).thenReturn(webTargetMock); final Client clientMock = Mockito.mock(Client.class); Mockito.when(clientMock.target(Mockito.anyString())).thenReturn(webTargetMock); PowerMockito.mockStatic(ClientBuilder.class); Mockito.when(ClientBuilder.newClient()).thenReturn(clientMock); } @Test public void testSuccessfulPath() throws IOException { // let's load up the score sample file final InputStream inputStream = new FileInputStream("target/test-classes/score/$sift_score_sample.json"); final SiftScienceScore scoreFromSS = SiftScienceHelper.deserializeScore(IOUtils.toString(inputStream)); final SiftScienceScore scoreToAssertAgainst = new SiftScienceScore(); scoreToAssertAgainst.setStatus((short)0); scoreToAssertAgainst.setErrorMessage("OK"); scoreToAssertAgainst.setScore(0.6022920863521355f); scoreToAssertAgainst.setUserId("mcac0006"); final Reason reason1 = new Reason(); reason1.setName("Users per device"); reason1.setValue("2"); reason1.addDetails("users", "ggre0001"); final Reason reason2 = new Reason(); reason2.setName("Transaction billing bin"); reason2.setValue("444433"); reason2.addDetails("users", "user1"); final Reason reason3 = new Reason(); reason3.setName("Time since previous transaction"); reason3.setValue("0.003"); final Reason reason4 = new Reason(); reason4.setName("Users per browser+IP"); reason4.setValue("9"); reason4.addDetails("users", "JLHBNCCELNGCPDHIFNJGNEGKNDOKDNHDDBJLPLMCIJAMKKNKOCNPPHCFBJGHDMKHCDCDMDNJJLKFMBBNHMHKMMGOBELIMFNKAMEGGDEHFMCOFMDKNOPEGPHDLMNOMAED,ggre0001,FGGFGDAHIFMAGALFDHMBGBENFMLPKMCGFDGOPCAG,al_capoopoo,DMEKDIEEPMLBHEJBPFCMPHJPIGEOBOPFAKGPAMDC,APBBICJCMAGIPNKMDPEMFFAGFCOOHJJCMCNPCLBD,NKDJKDOOFOGLELANDCFFLPOPJFGABIJAKPNIAHAJ,NLMPOHIPDNGDNKDADCAHKFILIBNFBKAJNMNLIEKB"); scoreToAssertAgainst.setReasons(new Reason[]{ reason1, reason2, reason3, reason4 }); Assert.assertEquals(scoreToAssertAgainst, scoreFromSS); } @Test public void testAnotherSuccessfulPath() throws IOException { // let's load up the score sample file final InputStream inputStream = new FileInputStream("target/test-classes/score/$sift_score_sample_2.json"); final SiftScienceScore scoreFromSS = SiftScienceHelper.deserializeScore(IOUtils.toString(inputStream)); final SiftScienceScore scoreToAssertAgainst = new SiftScienceScore(); scoreToAssertAgainst.setStatus((short)0); scoreToAssertAgainst.setErrorMessage("OK"); scoreToAssertAgainst.setScore(0.9340580293938543f); scoreToAssertAgainst.setUserId("FGJJKOIEDDLCAGLNCHLKICOGCCCMCILDJCFCEOIF"); Label label = new Label(); label.setIsBad(true); com.mcac0006.siftscience.types.Reason[] reasons = new com.mcac0006.siftscience.types.Reason[1]; reasons[0] = com.mcac0006.siftscience.types.Reason.CHARGEBACK; final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis((long)1405494666*1000); label.setTime(cal); label.setReasons(reasons); scoreToAssertAgainst.setLatestLabel(label); final Reason reason1 = new Reason(); reason1.setName("Latest billing address country"); reason1.setValue("NZ"); final Reason reason2 = new Reason(); reason2.setName("Failed transactionss per hour"); reason2.setValue("4"); final Reason reason3 = new Reason(); reason3.setName("Latest billing address name"); reason3.setValue("Ray Weston"); final Reason reason4 = new Reason(); reason4.setName("Transactions per hour"); reason4.setValue("6"); final Reason reason5 = new Reason(); reason5.setName("Time since previous transaction"); reason5.setValue("0"); final Reason reason6 = new Reason(); reason6.setName("Time since previous event"); reason6.setValue("0"); final Reason reason7 = new Reason(); reason7.setName("Latest billing address city"); reason7.setValue("Berfaler"); final Reason reason8 = new Reason(); reason8.setName("Failed transactionss per week"); reason8.setValue("40"); final Reason reason9 = new Reason(); reason9.setName("Failed transactionss per day"); reason9.setValue("16"); final Reason reason10 = new Reason(); reason10.setName("Latest billing address address 1"); reason10.setValue("Santorama street 1190-4"); final Reason reason11 = new Reason(); reason11.setName("Original amount"); reason11.setValue("1500"); final Reason reason12 = new Reason(); reason12.setName("Purchase amount in USD"); reason12.setValue("1574.25"); final Reason reason13 = new Reason(); reason13.setName("Email address"); reason13.setValue("futudabehog@hotmail.com"); final Reason reason14 = new Reason(); reason14.setName("Unique Bank Identification Numbers"); reason14.setValue("19"); final Reason reason15 = new Reason(); reason15.setName("Transactions per minute"); reason15.setValue("4"); final Reason reason16 = new Reason(); reason16.setName("Credit card country"); reason16.setValue("AE"); final Reason reason17 = new Reason(); reason17.setName("Purchase totals per week"); reason17.setValue("8144.778"); final Reason reason18 = new Reason(); reason18.setName("Credit card bank"); reason18.setValue("NATIONAL BANK OF RAS AL-KHAIMAH (RAKBANK)"); reason18.addDetails("users", "PDBKKIGJNHCPDLNGLNFGBDDEPGBPPLCJDPMNLPHC,BHONOOMIPOJDMJJMDAKGIAGOMIGLNKLEKNLDBCEB,JEJLAIJJILJEGEINBJNKGJIFDDJPKCGOLCNDFPLO,CJGKAEOGCBIJPMAFBLOEHBPPHKFACOCCPHENOBPK"); final Reason reason19 = new Reason(); reason19.setName("Transactions per day"); reason19.setValue("2"); scoreToAssertAgainst.setReasons(new Reason[]{ reason1, reason2, reason3, reason4, reason5, reason6, reason7, reason8, reason9, reason10, reason11, reason12, reason13, reason14, reason15, reason16, reason17, reason18, reason19 }); Assert.assertEquals(scoreToAssertAgainst, scoreFromSS); } @Test public void testScoreResponseFromDocs() throws IOException { // let's load up the score sample file // from https://siftscience.com/developers/docs/curl/automation-apis/score-api final InputStream inputStream = new FileInputStream("target/test-classes/score/$sift_score_sample_from_docs.json"); final SiftScienceScore scoreFromSS = SiftScienceHelper.deserializeScore(IOUtils.toString(inputStream)); final SiftScienceScore scoreToAssertAgainst = new SiftScienceScore(); scoreToAssertAgainst.setStatus((short)0); scoreToAssertAgainst.setErrorMessage("OK"); scoreToAssertAgainst.setScore(0.5124965408964449f); scoreToAssertAgainst.setUserId("al_capone"); Label label = new Label(); label.setIsBad(true); com.mcac0006.siftscience.types.Reason[] reasons = new com.mcac0006.siftscience.types.Reason[2]; reasons[0] = com.mcac0006.siftscience.types.Reason.CHARGEBACK; reasons[1] = com.mcac0006.siftscience.types.Reason.SPAM; final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(1350201660000L); label.setTime(cal); label.setReasons(reasons); label.setDescription("known fraudster"); scoreToAssertAgainst.setLatestLabel(label); final Reason reason1 = new Reason(); reason1.setName("UsersPerDevice"); reason1.setValue("4"); reason1.addDetails("users", "a, b, c, d"); scoreToAssertAgainst.setReasons(new Reason[]{ reason1 }); Assert.assertEquals(scoreToAssertAgainst, scoreFromSS); } @Test public void testUnknownUser() throws IOException { // let's load up the score sample file final InputStream inputStream = new FileInputStream("target/test-classes/score/$sift_score_unknown_user_sample.json"); final SiftScienceScore scoreFromSS = SiftScienceHelper.deserializeScore(IOUtils.toString(inputStream)); final SiftScienceScore scoreToAssertAgainst = new SiftScienceScore(); scoreToAssertAgainst.setStatus((short)54); scoreToAssertAgainst.setErrorMessage("Specified user_id has no scorable events"); scoreToAssertAgainst.setUserId("mcac0006"); Assert.assertEquals(scoreToAssertAgainst, scoreFromSS); } }