/*
* Licensed to DuraSpace under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership.
*
* DuraSpace licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.fcrepo.kernel.modeshape.observer;
import static org.fcrepo.kernel.modeshape.observer.SimpleObserver.EVENT_TYPES;
import static org.fcrepo.kernel.modeshape.utils.TestHelpers.setField;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import javax.jcr.NamespaceRegistry;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NodeType;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.ObservationManager;
import org.fcrepo.kernel.api.FedoraRepository;
import org.fcrepo.kernel.api.observer.FedoraEvent;
import org.fcrepo.kernel.modeshape.FedoraRepositoryImpl;
import org.fcrepo.kernel.modeshape.observer.eventmappings.OneToOne;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.modeshape.jcr.api.Repository;
import org.modeshape.jcr.api.observation.Event;
import com.google.common.eventbus.EventBus;
/**
* <p>SimpleObserverTest class.</p>
*
* @author awoods
* @author ajs6f
*/
@RunWith(MockitoJUnitRunner.class)
public class SimpleObserverTest {
private SimpleObserver testObserver;
private FedoraRepository testRepository;
@Mock
private ObservationManager mockOM;
@Mock
private Repository mockRepository;
@Mock
private Session mockSession;
@Mock
private Workspace mockWS;
@Mock
private NamespaceRegistry mockNS;
@Mock
private EventBus mockBus;
@Mock
private Event mockEvent;
@Mock
private EventIterator mockEvents;
@Mock
private NodeType mockNodeType, fedoraContainer;
@Before
public void setUp() throws RepositoryException {
mockSession = mock(Session.class, Mockito.withSettings().extraInterfaces(org.modeshape.jcr.api.Session.class));
when(mockRepository.login()).thenReturn((org.modeshape.jcr.api.Session) mockSession);
when(mockEvents.hasNext()).thenReturn(true, false);
when(mockEvents.next()).thenReturn(mockEvent);
when(mockEvent.getType()).thenReturn(1);
when(mockEvent.getPath()).thenReturn("/foo");
when(mockEvent.getPrimaryNodeType()).thenReturn(mockNodeType);
when(mockNodeType.getName()).thenReturn("nt:folder");
when(mockEvent.getMixinNodeTypes()).thenReturn(new NodeType[] {fedoraContainer});
when(fedoraContainer.getName()).thenReturn("fedora:Container");
when(mockSession.getWorkspace()).thenReturn(mockWS);
when(mockWS.getNamespaceRegistry()).thenReturn(mockNS);
testObserver = new SimpleObserver();
setField(testObserver, "repository", new FedoraRepositoryImpl(mockRepository));
setField(testObserver, "eventMapper", new OneToOne());
setField(testObserver, "eventFilter", (EventFilter) x -> true);
setField(testObserver, "eventBus", mockBus);
setField(testObserver, "session", mockSession);
}
@Test
public void testBuildListener() throws RepositoryException {
when(mockWS.getObservationManager()).thenReturn(mockOM);
testObserver.buildListener();
verify(mockOM).addEventListener(testObserver, EVENT_TYPES, "/", true, null, null, false);
}
@Test
public void testOnEvent() throws RepositoryException {
testObserver.onEvent(mockEvents);
verify(mockBus).post(any(FedoraEvent.class));
}
@Test
public void testOnEventAllFiltered() {
setField(testObserver, "eventFilter", (EventFilter) e -> false);
testObserver.onEvent(mockEvents);
verify(mockBus, never()).post(any(FedoraEvent.class));
}
}