/* ================================================================== * NodeOwnershipSecurityAspectTests.java - Apr 22, 2015 7:29:24 AM * * Copyright 2007-2015 SolarNetwork.net Dev Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * ================================================================== */ package net.solarnetwork.central.user.aop.test; import net.solarnetwork.central.domain.SolarNode; import net.solarnetwork.central.security.AuthenticatedUser; import net.solarnetwork.central.security.AuthorizationException; import net.solarnetwork.central.test.AbstractCentralTransactionalTest; import net.solarnetwork.central.user.aop.NodeOwnershipSecurityAspect; import net.solarnetwork.central.user.dao.UserDao; import net.solarnetwork.central.user.dao.UserNodeDao; import net.solarnetwork.central.user.domain.UserNode; import net.solarnetwork.central.user.domain.UserNodePK; import net.solarnetwork.central.user.domain.UserNodeTransfer; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; /** * Test cases for the {@link NodeOwnershipSecurityAspect} class. * * @author matt * @version 1.0 */ public class NodeOwnershipSecurityAspectTests extends AbstractCentralTransactionalTest { private static final Long TEST_USER_ID = -1L; private static final String TEST_EMAIL = "test@localhost"; private UserNodeDao userNodeDao; private UserDao userDao; private NodeOwnershipSecurityAspect getTestInstance() { NodeOwnershipSecurityAspect aspect = new NodeOwnershipSecurityAspect(userNodeDao, userDao); return aspect; } private void replayAll() { EasyMock.replay(userNodeDao, userDao); } private void verifyAll() { EasyMock.verify(userNodeDao, userDao); } private void becomeUser(Long userId, String... roles) { User userDetails = new User(TEST_EMAIL, "foobar", AuthorityUtils.NO_AUTHORITIES); AuthenticatedUser user = new AuthenticatedUser(userDetails, userId, "Test User", false); TestingAuthenticationToken auth = new TestingAuthenticationToken(user, "foobar", roles); SecurityContextHolder.getContext().setAuthentication(auth); } @Before public void setup() { userNodeDao = EasyMock.createMock(UserNodeDao.class); userDao = EasyMock.createMock(UserDao.class); SecurityContextHolder.clearContext(); } @Test(expected = AuthorizationException.class) public void pendingTransfersNoAuth() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); replayAll(); aspect.checkPendingRequestsForEmail(TEST_EMAIL); verifyAll(); } @Test(expected = AuthorizationException.class) public void pendingTransfersNotOwner() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); becomeUser(-2L, "ROLE_USER"); replayAll(); aspect.checkPendingRequestsForEmail(TEST_EMAIL); verifyAll(); } @Test public void pendingTransfersSuccess() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); becomeUser(TEST_USER_ID, "ROLE_USER"); replayAll(); aspect.checkPendingRequestsForEmail(TEST_EMAIL); verifyAll(); } @Test(expected = AuthorizationException.class) public void requestOrCancelTransferNoAuth() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final SolarNode node = new SolarNode(TEST_NODE_ID, TEST_LOC_ID); final UserNode userNode = new UserNode(user, node); // get UserNode for given node ID EasyMock.expect(userNodeDao.get(TEST_NODE_ID)).andReturn(userNode); replayAll(); aspect.checkUserNodeRequestOrCancelTransferRequest(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } @Test(expected = AuthorizationException.class) public void requestOrCancelTransferNotOwner() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final SolarNode node = new SolarNode(TEST_NODE_ID, TEST_LOC_ID); final UserNode userNode = new UserNode(user, node); // get UserNode for given node ID EasyMock.expect(userNodeDao.get(TEST_NODE_ID)).andReturn(userNode); becomeUser(-2L, "ROLE_USER"); replayAll(); aspect.checkUserNodeRequestOrCancelTransferRequest(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } @Test public void requestOrCancelTransferSuccess() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final SolarNode node = new SolarNode(TEST_NODE_ID, TEST_LOC_ID); final UserNode userNode = new UserNode(user, node); // get UserNode for given node ID EasyMock.expect(userNodeDao.get(TEST_NODE_ID)).andReturn(userNode); becomeUser(TEST_USER_ID, "ROLE_USER"); replayAll(); aspect.checkUserNodeRequestOrCancelTransferRequest(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } @Test(expected = AuthorizationException.class) public void confirmTransferNoAuth() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final UserNodePK pk = new UserNodePK(TEST_USER_ID, TEST_NODE_ID); final UserNodeTransfer xfer = new UserNodeTransfer(TEST_USER_ID, TEST_NODE_ID, TEST_EMAIL); EasyMock.expect(userNodeDao.getUserNodeTransfer(pk)).andReturn(xfer); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); replayAll(); aspect.checkUserNodeConfirmTransferAccess(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } @Test(expected = AuthorizationException.class) public void confirmTransferNotOwner() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final UserNodePK pk = new UserNodePK(TEST_USER_ID, TEST_NODE_ID); final UserNodeTransfer xfer = new UserNodeTransfer(TEST_USER_ID, TEST_NODE_ID, TEST_EMAIL); EasyMock.expect(userNodeDao.getUserNodeTransfer(pk)).andReturn(xfer); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); becomeUser(-2L, "ROLE_USER"); replayAll(); aspect.checkUserNodeConfirmTransferAccess(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } @Test public void confirmTransferSuccess() { final NodeOwnershipSecurityAspect aspect = getTestInstance(); final net.solarnetwork.central.user.domain.User user = new net.solarnetwork.central.user.domain.User( TEST_USER_ID, TEST_EMAIL); final UserNodePK pk = new UserNodePK(TEST_USER_ID, TEST_NODE_ID); final UserNodeTransfer xfer = new UserNodeTransfer(TEST_USER_ID, TEST_NODE_ID, TEST_EMAIL); EasyMock.expect(userNodeDao.getUserNodeTransfer(pk)).andReturn(xfer); EasyMock.expect(userDao.getUserByEmail(TEST_EMAIL)).andReturn(user); becomeUser(TEST_USER_ID, "ROLE_USER"); replayAll(); aspect.checkUserNodeConfirmTransferAccess(TEST_USER_ID, TEST_NODE_ID); verifyAll(); } }