package org.multibit.mbm.resources.role; 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.role.AdminCreateRoleRequest; import org.multibit.mbm.api.request.role.AdminUpdateRoleRequest; import org.multibit.mbm.db.DatabaseLoader; import org.multibit.mbm.db.dao.RoleDao; import org.multibit.mbm.core.model.Role; import org.multibit.mbm.core.model.RoleBuilder; 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.isNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class AdminRoleResourceTest extends BaseJerseyHmacResourceTest { private final RoleDao roleDao=mock(RoleDao.class); private final AdminRoleResource testObject=new AdminRoleResource(); @Override protected void setUpResources() { // Create the User for authenticated access User adminUser = setUpTrentHmacAuthenticator(); adminUser.setId(1L); // Create the supporting Role Role adminRole = DatabaseLoader.buildAdminRole(); adminRole.setId(1L); Role customerRole = DatabaseLoader.buildCustomerRole(); customerRole.setId(2L); // Mimics the behaviour of the created Role Role newRole = RoleBuilder .newInstance() .withName("Stock Manager") .withDescription("Stock Manager roles") .build(); newRole.setId(3L); // Create pages List<Role> rolesPage1 = Lists.newArrayList(); rolesPage1.add(adminRole); List<Role> rolesPage2 = Lists.newArrayList(); rolesPage2.add(customerRole); // Configure the mock DAO // Create when(roleDao.saveOrUpdate((Role) isNotNull())).thenReturn(newRole); when(roleDao.getByName("Stock Manager")).thenReturn(Optional.<Role>absent()); // Retrieve when(roleDao.getAllByPage(1, 1)).thenReturn(rolesPage1); when(roleDao.getAllByPage(1, 2)).thenReturn(rolesPage2); // Update when(roleDao.getById(1L)).thenReturn(Optional.of(adminRole)); testObject.setRoleDao(roleDao); // Configure resources addSingleton(testObject); } @Test public void adminCreateRoleAsHalJson() throws Exception { AdminCreateRoleRequest createRoleRequest = new AdminCreateRoleRequest(); createRoleRequest.setName("Stock Manager"); createRoleRequest.setDescription("Stock Manager roles"); String actualResponse = configureAsClient(AdminRoleResource.class) .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(createRoleRequest, MediaType.APPLICATION_JSON_TYPE) .post(String.class); FixtureAsserts.assertStringMatchesJsonFixture("CreateRole by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/role/expected-admin-create-role.json"); } @Test public void adminRetrieveRoleAsHalJson() throws Exception { String actualResponse = configureAsClient(AdminRoleResource.class) .queryParam("ps","1") .queryParam("pn", "1") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("Role list 1 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/role/expected-admin-retrieve-roles-page-1.json"); actualResponse = configureAsClient(AdminRoleResource.class) .queryParam("ps","1") .queryParam("pn", "2") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("Role list 2 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/role/expected-admin-retrieve-roles-page-2.json"); } @Test public void adminUpdateRoleAsHalJson() throws Exception { AdminUpdateRoleRequest updateRoleRequest = new AdminUpdateRoleRequest(); updateRoleRequest.setName("charlie"); updateRoleRequest.setDescription("charlie1"); // TODO Re-instate this // updateRoleRequest.getAuthorities().add(Authority.ROLE_STORES_MANAGER.name()); String actualResponse = configureAsClient("/admin/role/1") .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(updateRoleRequest, MediaType.APPLICATION_JSON_TYPE) .put(String.class); FixtureAsserts.assertStringMatchesJsonFixture("UpdateRole by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/role/expected-admin-update-role.json"); } @Test public void adminDeleteRoleAsHalJson() throws Exception { AdminDeleteEntityRequest deleteRoleRequest = new AdminDeleteEntityRequest(); deleteRoleRequest.setReason("At role request"); String actualResponse = configureAsClient("/admin/role/1") .accept(HalMediaType.APPLICATION_HAL_JSON) .entity(deleteRoleRequest, MediaType.APPLICATION_JSON_TYPE) .delete(String.class); FixtureAsserts.assertStringMatchesJsonFixture("DeleteRole by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/role/expected-admin-delete-role.json"); } }