AuthorizationAdviceTest.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.openmrs.aop;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.junit.Assert;
import org.junit.Test;
import org.openmrs.Concept;
import org.openmrs.PrivilegeListener;
import org.openmrs.User;
import org.openmrs.api.context.Context;
import org.openmrs.test.BaseContextSensitiveTest;
import org.openmrs.test.Verifies;
import org.springframework.stereotype.Component;

/**
 * Tests {@link AuthorizationAdvice}.
 */
public class AuthorizationAdviceTest extends BaseContextSensitiveTest {
	
	@Resource(name = "listener1")
	Listener1 listener1;
	
	@Resource(name = "listener2")
	Listener2 listener2;
	
	@Test
	@Verifies(value = "notify listeners about checked privileges", method = "before(Method, Object[], Object)")
	public void before_shouldNotifyListenersAboutCheckedPrivileges() {
		listener1.hasPrivileges.clear();
		listener1.lacksPrivileges.clear();
		
		listener2.hasPrivileges.clear();
		listener2.lacksPrivileges.clear();
		
		Concept concept = Context.getConceptService().getConcept(3);
		
		Assert.assertArrayEquals("listener 1 get concept", new String[] { "Get Concepts" }, listener1.hasPrivileges
		        .toArray());
		Assert.assertArrayEquals("listener 2 get concept", new String[] { "Get Concepts" }, listener2.hasPrivileges
		        .toArray());
		Assert.assertEquals(0, listener1.lacksPrivileges.size());
		Assert.assertEquals(0, listener2.lacksPrivileges.size());
		
		listener1.hasPrivileges.clear();
		listener2.hasPrivileges.clear();
		
		Context.getConceptService().saveConcept(concept);
		
		Assert.assertArrayEquals("listener 1 save concept: " + listener1.hasPrivileges.toString(), new String[] {
		        "Manage Concepts", "Get Concepts", "Get Observations", "Get Concepts" }, listener1.hasPrivileges.toArray());
		Assert.assertArrayEquals("listener 2 save concept: " + listener2.hasPrivileges.toString(), new String[] {
		        "Manage Concepts", "Get Concepts", "Get Observations", "Get Concepts" }, listener2.hasPrivileges.toArray());
		Assert.assertEquals(0, listener1.lacksPrivileges.size());
		Assert.assertEquals(0, listener2.lacksPrivileges.size());
	}
	
	@Component("listener1")
	public static class Listener1 implements PrivilegeListener {
		
		public List<String> hasPrivileges = new ArrayList<String>();
		
		public List<String> lacksPrivileges = new ArrayList<String>();
		
		@Override
		public void privilegeChecked(User user, String privilege, boolean hasPrivilege) {
			if (hasPrivilege) {
				hasPrivileges.add(privilege);
			} else {
				lacksPrivileges.add(privilege);
			}
		}
	}
	
	@Component("listener2")
	public static class Listener2 extends Listener1 {}
}