/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.guvnor.common.services.project.context;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryRemovedEvent;
import org.guvnor.structure.repositories.impl.git.GitRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.uberfire.backend.vfs.Path;
import org.uberfire.mocks.EventSourceMock;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith( MockitoJUnitRunner.class )
public class ProjectContextTest {
@Spy
private EventSourceMock<ProjectContextChangeEvent> changeEvent = new EventSourceMock<ProjectContextChangeEvent>();
private ProjectContext context;
@Before
public void setUp() throws Exception {
context = new ProjectContext( changeEvent );
doAnswer( new Answer() {
@Override
public Object answer( InvocationOnMock invocationOnMock ) throws Throwable {
context.onProjectContextChanged( ( ProjectContextChangeEvent ) invocationOnMock.getArguments()[0] );
return null;
}
} ).when( changeEvent ).fire( any( ProjectContextChangeEvent.class ) );
}
@Test
public void testGetActiveRepositoryRoot() throws Exception {
final Repository repository = mock( Repository.class );
context.setActiveRepository( repository );
context.setActiveBranch( "dev" );
final Path devRoot = mock( Path.class );
when( repository.getBranchRoot( "dev" ) ).thenReturn( devRoot );
assertEquals( devRoot, context.getActiveRepositoryRoot() );
}
@Test
public void testRepositoryDeleted() throws Exception {
OrganizationalUnit organizationalUnit = mock( OrganizationalUnit.class );
GitRepository repository = new GitRepository();
context.setActiveOrganizationalUnit( organizationalUnit );
context.setActiveRepository( repository );
RepositoryRemovedEvent repositoryRemovedEvent = new RepositoryRemovedEvent( repository );
context.onRepositoryRemoved( repositoryRemovedEvent );
assertEquals( organizationalUnit, context.getActiveOrganizationalUnit() );
assertNull( context.getActiveRepository() );
}
@Test
public void testIgnoreRepositoryDeletedEventIfTheActiveRepositoryWasNotDeleted() throws Exception {
GitRepository activeRepository = new GitRepository( "active repo" );
GitRepository deletedRepository = new GitRepository( "deleted repo" );
context.setActiveRepository( activeRepository );
RepositoryRemovedEvent repositoryRemovedEvent = new RepositoryRemovedEvent(deletedRepository);
context.onRepositoryRemoved(repositoryRemovedEvent);
assertEquals(activeRepository, context.getActiveRepository());
}
@Test
public void testContextChanged() throws Exception {
OrganizationalUnit oldOrganizationalUnit = mock(OrganizationalUnit.class);
Repository oldRepository = mock(Repository.class);
Package oldPackage = new Package();
Project oldProject = new Project();
context.setActiveOrganizationalUnit(oldOrganizationalUnit);
context.setActiveRepository(oldRepository);
context.setActivePackage(oldPackage);
context.setActiveProject(oldProject);
OrganizationalUnit newOrganizationalUnit = mock(OrganizationalUnit.class);
Repository newRepository = mock(Repository.class);
String newBranch = "master";
Package newPackage = new Package();
Project newProject = new Project();
ProjectContextChangeHandler changeHandler = mock(ProjectContextChangeHandler.class);
context.addChangeHandler(changeHandler);
context.onProjectContextChanged(new ProjectContextChangeEvent(newOrganizationalUnit,
newRepository,
newBranch,
newProject,
newPackage));
assertEquals(newOrganizationalUnit, context.getActiveOrganizationalUnit());
assertEquals(newRepository, context.getActiveRepository());
assertEquals(newProject, context.getActiveProject());
assertEquals(newPackage, context.getActivePackage());
verify(changeHandler).onChange();
}
@Test
public void testContextChangeHandlerGetsRemoved() throws Exception {
ProjectContextChangeHandler changeHandler = mock(ProjectContextChangeHandler.class);
ProjectContextChangeHandle handle = context.addChangeHandler(changeHandler);
context.onProjectContextChanged(new ProjectContextChangeEvent());
verify(changeHandler).onChange();
context.removeChangeHandler(handle);
reset(changeHandler);
context.onProjectContextChanged(new ProjectContextChangeEvent());
verify(changeHandler, never()).onChange();
}
}