package org.picketlink.authentication.levels.core;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.picketlink.authentication.levels.Level;
import org.picketlink.authentication.levels.SecurityLevelResolver;
import org.picketlink.authentication.levels.internal.DefaultLevel;
import org.picketlink.authentication.levels.internal.DefaultLevelFactory;
import org.picketlink.authentication.levels.internal.DefaultSecurityLevelManager;
import org.picketlink.producer.LevelFactoryResolver;
import javax.enterprise.inject.Instance;
import java.util.Iterator;
import java.util.concurrent.ExecutionException;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class DefaultSecurityLevelManagerTestCase {
@Mock
private Instance<Level> levelInstance;
@Mock
private LevelFactoryResolver lfr;
@Mock
private Instance<SecurityLevelResolver> resolverInstances;
@InjectMocks
private DefaultSecurityLevelManager levelManager;
@Mock
Iterator<SecurityLevelResolver> iterator;
@Before
public void startUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void synchronousLevelResolveTest() throws InterruptedException, ExecutionException{
when(lfr.resolve()).thenReturn(new DefaultLevelFactory());
when(levelInstance.isUnsatisfied()).thenReturn(true);
SecurityLevelResolver one = mock(SecurityLevelResolver.class);
when(one.resolve()).thenReturn(new DefaultLevel(2));
SecurityLevelResolver two = mock(SecurityLevelResolver.class);
when(two.resolve()).thenReturn(new DefaultLevel(3));
SecurityLevelResolver three = mock(SecurityLevelResolver.class);
when(three.resolve()).thenReturn(new DefaultLevel(1));
when(iterator.hasNext()).thenReturn(true,true,true,false,true,true,true,false);
when(iterator.next()).thenReturn(one,two,three,one,two,three);
when(resolverInstances.iterator()).thenReturn(iterator);
levelManager.init();
assertTrue(levelManager.resolveSecurityLevel().compareTo(new DefaultLevel(3))==0);
}
}