package org.multibit.mbm.resources.user; import com.google.common.base.Optional; import com.google.common.collect.Lists; import org.junit.Test; import org.multibit.mbm.api.hal.HalMediaType; import org.multibit.mbm.api.request.AdminDeleteEntityRequest; import org.multibit.mbm.api.request.user.AdminCreateUserRequest; import org.multibit.mbm.api.request.user.AdminUpdateUserRequest; import org.multibit.mbm.db.DatabaseLoader; 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 java.util.List; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.isNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class AdminUserResourceTest extends BaseJerseyHmacResourceTest { private final UserDao userDao = mock(UserDao.class); private final AdminUserResource testObject = new AdminUserResource(); @Override protected void setUpResources() { // Create the User for authenticated access User adminUser = setUpTrentHmacAuthenticator(); adminUser.setId(1L); // Create the supporting Role Role customerRole = DatabaseLoader.buildCustomerRole(); // Create the customer Users User aliceUser = DatabaseLoader.buildAliceCustomer(customerRole); aliceUser.setId(1L); User bobUser = DatabaseLoader.buildBobCustomer(customerRole); bobUser.setId(2L); // Create pages List<User> usersPage1 = Lists.newArrayList(); usersPage1.add(aliceUser); List<User> usersPage2 = Lists.newArrayList(); usersPage2.add(bobUser); // Configure the mock DAO // Create when(userDao.saveOrUpdate((User) isNotNull())).thenReturn(aliceUser); when(userDao.getByCredentials(anyString(), anyString())).thenReturn(Optional.<User>absent()); // Retrieve when(userDao.getAllByPage(1, 0)).thenReturn(usersPage1); when(userDao.getAllByPage(1, 1)).thenReturn(usersPage2); // Update when(userDao.getById(1L)).thenReturn(Optional.of(aliceUser)); testObject.setUserDao(userDao); // Configure resources addSingleton(testObject); } @Test public void adminCreateUserAsHalJson() throws Exception { AdminCreateUserRequest createUserRequest = new AdminCreateUserRequest(); createUserRequest.setUsername("charlie"); createUserRequest.setPasswordDigest("charlie1"); String actualResponse = configureAsClient("/admin/user") .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(createUserRequest, MediaType.APPLICATION_JSON_TYPE) .post(String.class); FixtureAsserts.assertStringMatchesJsonFixture("CreateUser by admin response render to HAL+JSON", actualResponse, "/fixtures/hal/user/expected-admin-create-user.json"); } @Test public void adminRetrieveUserAsHalJson() throws Exception { String actualResponse = configureAsClient("/admin/user") .queryParam("ps", "1") .queryParam("pn", "0") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("User list 1 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/user/expected-admin-retrieve-users-page-1.json"); actualResponse = configureAsClient("/admin/user") .queryParam("ps", "1") .queryParam("pn", "1") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("User list 2 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/user/expected-admin-retrieve-users-page-2.json"); } @Test public void adminUpdateUserAsHalJson() throws Exception { AdminUpdateUserRequest updateUserRequest = new AdminUpdateUserRequest(); updateUserRequest.setUsername("charlie"); updateUserRequest.setPasswordDigest("charlie1"); String actualResponse = configureAsClient("/admin/user/1") .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(updateUserRequest, MediaType.APPLICATION_JSON_TYPE) .put(String.class); FixtureAsserts.assertStringMatchesJsonFixture("UpdateUser by admin response render to HAL+JSON", actualResponse, "/fixtures/hal/user/expected-admin-update-user.json"); } @Test public void adminDeleteUserAsHalJson() throws Exception { AdminDeleteEntityRequest deleteUserRequest = new AdminDeleteEntityRequest(); deleteUserRequest.setReason("At user request"); String actualResponse = configureAsClient("/admin/user/1") .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(deleteUserRequest, MediaType.APPLICATION_JSON_TYPE) .delete(String.class); FixtureAsserts.assertStringMatchesJsonFixture("DeleteUser by admin response render to HAL+JSON", actualResponse, "/fixtures/hal/user/expected-admin-delete-user.json"); } }