/*
* Copyright 2016 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.asset.management.backend.service;
import java.util.ArrayList;
import java.util.HashMap;
import javax.inject.Inject;
import org.guvnor.asset.management.model.RepositoryStructureModel;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.project.service.POMService;
import org.guvnor.common.services.project.service.ProjectService;
import org.guvnor.common.services.shared.metadata.MetadataService;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.guvnor.structure.repositories.EnvironmentParameters;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.test.TestTempFileSystem;
import org.guvnor.test.WeldJUnitRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.uberfire.backend.vfs.Path;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(WeldJUnitRunner.class)
public class RepositoryStructureModelLoaderTest {
@InjectMocks
RepositoryStructureModelLoader loader;
@Mock
private POMService pomService;
@Mock
private ProjectService<? extends Project> projectService;
@Mock
private ManagedStatusUpdater managedStatusUpdater;
@Mock
private MetadataService metadataService;
@Inject
private TestTempFileSystem testFileSystem;
private Path myProjectMasterBranchRoot;
private Path myProjectPom;
private Repository repository;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks( this );
repository = mock( Repository.class );
when( repository.getEnvironment() ).thenReturn( null );
myProjectMasterBranchRoot = testFileSystem.createTempDirectory( "/myproject" );
myProjectPom = testFileSystem.createTempFile( "myproject/pom.xml" );
when( repository.getBranchRoot( "master" ) ).thenReturn( myProjectMasterBranchRoot );
}
@After
public void tearDown() throws Exception {
testFileSystem.tearDown();
}
@Test
public void testNullRepo() throws Exception {
final RepositoryStructureModel structureModel = loader.load( null,
"master",
true );
assertNull( structureModel );
}
@Test
public void testLoadProjectInRoot() throws Exception {
final POM pom = new POM();
final Metadata metadata = new Metadata();
addMyProjectToRepositoryRoot( pom,
metadata );
makeManaged( repository );
final RepositoryStructureModel model = loader.load( repository,
"master",
false );
assertTrue( model.isManaged() );
assertEquals( pom, model.getPOM() );
assertEquals( metadata, model.getPOMMetaData() );
assertEquals( myProjectPom, model.getPathToPOM() );
assertTrue( model.getModulesProject().isEmpty() );
}
@Test
public void testNoModules() throws Exception {
addMyProjectToRepositoryRoot( new POM(),
new Metadata() );
final RepositoryStructureModel model = loader.load( repository,
"master",
true );
assertTrue( model.getModulesProject().isEmpty() );
}
@Test
public void testModulesExist() throws Exception {
addMyProjectToRepositoryRoot( new POM(),
new Metadata(),
"module1",
"module2" );
final RepositoryStructureModel model = loader.load( repository,
"master",
true );
assertEquals( 2, model.getModulesProject().size() );
}
@Test
public void testLoadManaged() throws Exception {
makeManaged( repository );
addMyProjectToRepositoryRoot( new POM(),
new Metadata() );
loader.load( repository,
"master",
false );
verify( managedStatusUpdater, never() ).updateManagedStatus( repository,
true );
}
@Test
public void testUpdateToManaged() throws Exception {
addMyProjectToRepositoryRoot( new POM(),
new Metadata() );
loader.load( repository,
"master",
false );
verify( managedStatusUpdater ).updateManagedStatus( repository,
true );
}
@Test
public void testLoadRepositoryStructureModelWithNoEnvironmentEntries() throws Exception {
final RepositoryStructureModel model = loader.load( repository,
"master",
false );
assertNull( model );
}
@Test
public void testLoadRepositoryStructureModelWithRepositoryManagedStatusNotSet() throws Exception {
final HashMap<String, Object> map = new HashMap<>();
when( repository.getEnvironment() ).thenReturn( map );
final RepositoryStructureModel model = loader.load( repository,
"master",
false );
assertNull( model.getPOM() );
assertNull( model.getPOMMetaData() );
assertNull( model.getPathToPOM() );
assertTrue( model.getModules().isEmpty() );
assertTrue( model.getModulesProject().isEmpty() );
assertTrue( model.getOrphanProjects().isEmpty() );
assertTrue( model.getOrphanProjectsPOM().isEmpty() );
assertFalse( model.isManaged() );
}
private void addMyProjectToRepositoryRoot( final POM pom,
final Metadata metadata,
final String... moduleNames ) {
final ArrayList<String> modules = new ArrayList<>();
for ( final String moduleName : moduleNames ) {
modules.add( moduleName );
}
final Project project = new Project( myProjectMasterBranchRoot,
myProjectPom,
"myproject",
modules );
when( projectService.resolveToParentProject( myProjectMasterBranchRoot ) ).thenReturn( project );
when( pomService.load( myProjectPom ) ).thenReturn( pom );
when( metadataService.getMetadata( myProjectPom ) ).thenReturn( metadata );
}
private void makeManaged( final Repository repository ) {
final HashMap<String, Object> map = new HashMap<>();
map.put( EnvironmentParameters.MANAGED, Boolean.TRUE );
when( repository.getEnvironment() ).thenReturn( map );
}
}