package org.multibit.mbm.resources.user;
import com.google.common.base.Optional;
import org.junit.Test;
import org.multibit.mbm.api.hal.HalMediaType;
import org.multibit.mbm.api.request.user.WebFormAuthenticationRequest;
import org.multibit.mbm.auth.Authority;
import org.multibit.mbm.db.DatabaseLoader;
import org.multibit.mbm.db.dao.RoleDao;
import org.multibit.mbm.db.dao.UserDao;
import org.multibit.mbm.core.model.Role;
import org.multibit.mbm.core.model.User;
import org.multibit.mbm.test.BaseJerseyHmacResourceTest;
import org.multibit.mbm.test.FixtureAsserts;
import javax.ws.rs.core.MediaType;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Verifies the user resource can be accessed by an authenticated Customer
*/
public class ClientUserResourceTest extends BaseJerseyHmacResourceTest {
private final UserDao userDao=mock(UserDao.class);
private final RoleDao roleDao=mock(RoleDao.class);
private final ClientUserResource testObject=new ClientUserResource();
@Override
protected void setUpResources() {
// Create the User for authenticated access
User clientUser = setUpClientHmacAuthenticator();
clientUser.setId(1L);
// Create the supporting Role
Role customerRole = DatabaseLoader.buildCustomerRole();
Role publicRole = DatabaseLoader.buildPublicRole();
User aliceUser = DatabaseLoader.buildAliceCustomer(customerRole);
User bobUser = DatabaseLoader.buildBobCustomer(customerRole);
// Configure mocks
when(userDao.getByCredentials(anyString(), anyString())).thenReturn(Optional.of(aliceUser));
when(userDao.saveOrUpdate(any(User.class))).thenReturn(bobUser);
when(roleDao.getByName(Authority.ROLE_PUBLIC.name())).thenReturn(Optional.of(publicRole));
// Bind mocks
testObject.setUserDao(userDao);
testObject.setRoleDao(roleDao);
// Configure resources
addSingleton(testObject);
}
@Test
public void clientRegisterAnonymousUserAsHalJson() throws Exception {
// Arrange
// Act
String actualResponse = configureAsClient("/client/user/anonymous")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.post(String.class);
// Assert
FixtureAsserts.assertStringMatchesJsonFixture("Client register their anonymous User as HAL+JSON", actualResponse, "/fixtures/hal/user/expected-client-register-anonymous-user.json");
}
@Test
public void clientAuthenticateUserAsHalJson() throws Exception {
// Arrange
WebFormAuthenticationRequest authenticateUserRequest = new WebFormAuthenticationRequest(
"alice",
"alice1"
);
// Act
String actualResponse = configureAsClient("/client/user/authenticate")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(authenticateUserRequest, MediaType.APPLICATION_JSON_TYPE)
.post(String.class);
// Assert
FixtureAsserts.assertStringMatchesJsonFixture("Client authenticate their User as HAL+JSON", actualResponse, "/fixtures/hal/user/expected-client-authenticate-user.json");
}
}