/**
*
*/
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.result.domain.SiftScienceResponse;
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:jburnim@siftscience.com">Jacob Burnim</a>
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClientBuilder.class)
public class SiftScienceResponseTest {
@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 testScoreError() throws IOException {
// let's load up the score sample file
final InputStream inputStream = new FileInputStream("target/test-classes/result/$sift_result_sample_from_docs.json");
final SiftScienceResponse responseFromSS = SiftScienceHelper.deserializeResponse(IOUtils.toString(inputStream));
final SiftScienceResponse responseToAssertAgainst = new SiftScienceResponse();
responseToAssertAgainst.setStatus(0);
responseToAssertAgainst.setError_message("OK");
responseToAssertAgainst.setRequest("body_of_the_request_you_sent");
responseToAssertAgainst.setTime(1454517138);
final SiftScienceScore score = new SiftScienceScore();
score.setStatus((short)0);
score.setErrorMessage("OK");
score.setUserId("sample_user2");
score.setScore(0.39944676614045643f);
responseToAssertAgainst.setScoreResponse(score);
Label label = new Label();
label.setIsBad(false);
com.mcac0006.siftscience.types.Reason[] reasons = new com.mcac0006.siftscience.types.Reason[1];
reasons[0] = com.mcac0006.siftscience.types.Reason.SPAM;
final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(1454517070000L);
label.setTime(cal);
label.setReasons(reasons);
score.setLatestLabel(label);
final Reason reason1 = new Reason();
reason1.setName("Number of users with the same billing address");
reason1.setValue("3");
reason1.addDetails("users", "sample_user3,sample_user4");
score.setReasons(new Reason[]{ reason1 });
Assert.assertEquals(responseToAssertAgainst, responseFromSS);
}
@Test
public void testSuccessfulPath() throws IOException {
// let's load up the score sample file
final InputStream inputStream = new FileInputStream("target/test-classes/result/$sift_result_sample_with_score_error.json");
final SiftScienceResponse responseFromSS = SiftScienceHelper.deserializeResponse(IOUtils.toString(inputStream));
final SiftScienceResponse responseToAssertAgainst = new SiftScienceResponse();
responseToAssertAgainst.setStatus(0);
responseToAssertAgainst.setError_message("OK");
responseToAssertAgainst.setRequest("...request_body...");
responseToAssertAgainst.setTime(1454519952);
final SiftScienceScore score = new SiftScienceScore();
score.setStatus((short)-3);
score.setErrorMessage("Server-side timeout processing request. Please try again later.");
responseToAssertAgainst.setScoreResponse(score);
Assert.assertEquals(responseToAssertAgainst, responseFromSS);
}
}