package com.mozu.api.security;
import static org.junit.Assert.*;
import java.io.IOException;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import org.joda.time.DateTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.mozu.api.ApiException;
import com.mozu.api.MozuClient;
import com.mozu.api.MozuClientFactory;
import com.mozu.api.contracts.appdev.AppAuthInfo;
import com.mozu.api.contracts.appdev.AuthTicket;
import com.mozu.api.contracts.appdev.AuthTicketRequest;
import com.mozu.api.resources.platform.applications.AuthTicketResource;
import com.mozu.api.security.AppAuthenticator;
/**
* This test aims to test the AppAuthenticator by mocking out the
* rest calls.
*
*/
public class AppAuthenticatorUnitTest {
private static final String GOOD_URL = "https://home.mozu.com/api/platform/applications/authtickets";
private static final String REFRESH_URL = GOOD_URL + "/refresh-ticket";
private static final String APP_ID = "12342341234132";
private static final String SHARED_SECRET = "12342341234132";
@Mocked MozuClient<?> mockHttpClient;
@Mocked AuthTicket mockAuthTicket;
@Mocked AuthTicketRequest mockAuthTicketRequest;
@Before
public void setUp() throws Exception {
new MockUp<MozuClientFactory<?>>() {
@Mock
public MozuClient<?> getInstance(Class<?> clz) throws Exception {
return mockHttpClient;
}
};
}
/**
* The AppAuthenticator is static in the test class. This is run after
* each test to clear out the instance.
*/
@After
public void tearDown() throws Exception {
new MockUp<AuthTicketResource>() {
@Mock public void deleteAppAuthTicket(String refreshToken) throws Exception {};
};
AppAuthenticator.invalidateAuth();
}
/**
* Initialize passing explicit AppAuthInfo and default base url
*
* @throws Exception
*/
@Test
public void initializeWithURLTest() throws Exception {
final AppAuthInfo appAuthInfo = new AppAuthInfo();
appAuthInfo.setApplicationId(APP_ID);
appAuthInfo.setSharedSecret(SHARED_SECRET);
new Expectations() {
{ mockHttpClient.executePostRequest(appAuthInfo, GOOD_URL, null); returns(mockAuthTicket); }
{ mockAuthTicket.getAccessTokenExpiration(); returns(new DateTime()); }
{ mockAuthTicket.getRefreshTokenExpiration(); returns(new DateTime()); }
};
AppAuthenticator.initialize(appAuthInfo);
}
/**
* Test an error in I/O when making the request
*
* @throws Exception
*/
@Test
public void initializeIOExceptionTest() throws Exception {
final AppAuthInfo appAuthInfo = new AppAuthInfo();
appAuthInfo.setApplicationId(APP_ID);
appAuthInfo.setSharedSecret(SHARED_SECRET);
new Expectations() {
{ mockHttpClient.executePostRequest(appAuthInfo, GOOD_URL, null); result=new IOException("Test IO Exception"); }
};
try {
AppAuthenticator.initialize(appAuthInfo);
fail("API exception expected");
} catch (ApiException e) {
//expected
assertEquals("Exception getting Mozu client: Test IO Exception", e.getMessage());
}
}
/**
* Initialize, then refresh the app auth ticket.
*
* @throws Exception
*/
@Test
public void refreshAppAuthTest() throws Exception {
final AppAuthInfo appAuthInfo = new AppAuthInfo();
appAuthInfo.setApplicationId(APP_ID);
appAuthInfo.setSharedSecret(SHARED_SECRET);
new MockUp<AuthTicketRequest>() {
@Mock
public void $init() {}
@Mock
public void setRefreshToken(String refreshToken) {}
};
new Expectations() {
{ mockHttpClient.executePostRequest(appAuthInfo, GOOD_URL, null); returns(mockAuthTicket); }
{ mockAuthTicket.getAccessTokenExpiration(); returns(new DateTime()); }
{ mockAuthTicket.getRefreshTokenExpiration(); returns(new DateTime()); }
{ mockAuthTicket.getRefreshToken(); returns("RefreshToken"); }
{ mockHttpClient.executePutRequest(any, REFRESH_URL, null); returns(mockAuthTicket); }
};
AppAuthenticator.initialize(appAuthInfo);
AppAuthenticator auth = AppAuthenticator.getInstance();
auth.refreshAppAuthTicket();
}
}