/* * 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.kie.workbench.common.screens.projecteditor.backend.server; import java.util.HashSet; import java.util.List; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.project.model.GAV; import org.guvnor.common.services.project.model.MavenRepositoryMetadata; import org.guvnor.common.services.project.model.MavenRepositorySource; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.model.ProjectImports; import org.guvnor.common.services.project.model.ProjectRepositories; import org.guvnor.common.services.project.service.DeploymentMode; import org.guvnor.common.services.project.service.GAVAlreadyExistsException; import org.guvnor.common.services.project.service.POMService; import org.guvnor.common.services.project.service.ProjectRepositoriesService; import org.guvnor.common.services.project.service.ProjectRepositoryResolver; import org.guvnor.common.services.shared.metadata.MetadataService; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.projecteditor.model.ProjectScreenModel; import org.kie.workbench.common.screens.projecteditor.service.ProjectScreenService; import org.kie.workbench.common.services.shared.kmodule.KModuleModel; import org.kie.workbench.common.services.shared.kmodule.KModuleService; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.kie.workbench.common.services.shared.project.ProjectImportsService; import org.kie.workbench.common.services.shared.validation.ValidationService; import org.kie.workbench.common.services.shared.whitelist.PackageNameWhiteListService; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; import org.uberfire.java.nio.base.options.CommentedOption; import org.uberfire.java.nio.file.FileSystem; import org.uberfire.rpc.SessionInfo; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class ProjectScreenServiceImplTest { @Mock private POMService pomService; @Mock private KModuleService kModuleService; @Mock private KieProjectService projectService; @Mock private MetadataService metadataService; @Mock private ValidationService validationService; @Mock private ProjectImportsService importsService; @Mock private ProjectRepositoriesService repositoriesService; @Mock private PackageNameWhiteListService whiteListService; @Mock private ProjectRepositoryResolver repositoryResolver; @Mock private User identity; @Mock private SessionInfo sessionInfo; @Mock private IOService ioService; @Mock private Path pathToPom; @Mock private Path pathToKieModule; @Mock private Path pathToProjectImports; @Mock private Path pathToProjectRepositories; @Mock private KieProject project; @Mock private KModuleModel kmodule; @Mock private Metadata pomMetaData; @Mock private Metadata kmoduleMetaData; @Mock private Metadata projectImportsMetaData; @Mock private CommentedOptionFactory commentedOptionFactory; private ProjectScreenService service; private ProjectScreenModelLoader loader; private ProjectScreenModelSaver saver; private ProjectImports projectImports; private ProjectRepositories projectRepositories; private GAV gav = new GAV( "org.test", "project-screen-test", "1.0.0" ); private POM pom = new POM( "test", "test", gav ); @BeforeClass public static void setupSystemProperties() { //These are not needed for the tests System.setProperty( "org.uberfire.nio.git.daemon.enabled", "false" ); System.setProperty( "org.uberfire.nio.git.ssh.enabled", "false" ); System.setProperty( "org.uberfire.sys.repo.monitor.disabled", "true" ); } @Before public void setup() { projectImports = new ProjectImports(); projectRepositories = new ProjectRepositories(); loader = new ProjectScreenModelLoader( projectService, pomService, metadataService, kModuleService, importsService, repositoriesService, whiteListService ) { @Override protected boolean fileExists( final Path path ) { return true; } }; saver = new ProjectScreenModelSaver( pomService, kModuleService, importsService, repositoriesService, whiteListService, ioService, projectService, repositoryResolver, commentedOptionFactory ); service = new ProjectScreenServiceImpl( projectService, loader, saver ); when( project.getKModuleXMLPath() ).thenReturn( pathToKieModule ); when( project.getImportsPath() ).thenReturn( pathToProjectImports ); when( project.getRepositoriesPath() ).thenReturn( pathToProjectRepositories ); when( project.getPom() ).thenReturn( pom ); when( pathToPom.toURI() ).thenReturn( "default://project/pom.xml" ); when( pomService.load( eq( pathToPom ) ) ).thenReturn( pom ); when( kModuleService.load( eq( pathToKieModule ) ) ).thenReturn( kmodule ); when( importsService.load( eq( pathToProjectImports ) ) ).thenReturn( projectImports ); when( repositoriesService.load( eq( pathToProjectRepositories ) ) ).thenReturn( projectRepositories ); when( projectService.resolveProject( eq( pathToPom ) ) ).thenReturn( project ); when( metadataService.getMetadata( eq( pathToPom ) ) ).thenReturn( pomMetaData ); when( metadataService.getMetadata( eq( pathToKieModule ) ) ).thenReturn( kmoduleMetaData ); when( metadataService.getMetadata( eq( pathToProjectImports ) ) ).thenReturn( projectImportsMetaData ); } @Test public void testLoad() throws Exception { final ProjectScreenModel model = service.load( pathToPom ); assertEquals( pom, model.getPOM() ); assertEquals( pomMetaData, model.getPOMMetaData() ); assertEquals( pathToPom, model.getPathToPOM() ); assertEquals( kmodule, model.getKModule() ); assertEquals( kmoduleMetaData, model.getKModuleMetaData() ); assertEquals( pathToKieModule, model.getPathToKModule() ); assertEquals( projectImports, model.getProjectImports() ); assertEquals( projectImportsMetaData, model.getProjectImportsMetaData() ); assertEquals( pathToProjectImports, model.getPathToImports() ); assertEquals( projectRepositories, model.getRepositories() ); assertEquals( pathToProjectRepositories, model.getPathToRepositories() ); verify( pomService, times( 1 ) ).load( eq( pathToPom ) ); verify( metadataService, times( 1 ) ).getMetadata( eq( pathToPom ) ); verify( projectService, times( 1 ) ).resolveProject( eq( pathToPom ) ); verify( kModuleService, times( 1 ) ).load( eq( pathToKieModule ) ); verify( metadataService, times( 1 ) ).getMetadata( eq( pathToKieModule ) ); verify( importsService, times( 1 ) ).load( eq( pathToProjectImports ) ); verify( metadataService, times( 1 ) ).getMetadata( eq( pathToProjectImports ) ); verify( repositoriesService, times( 1 ) ).load( eq( pathToProjectRepositories ) ); } @Test public void testSaveNonClashingGAVChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( new POM( new GAV( "groupId", "artifactId", "2.0.0" ) ) ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final String comment = "comment"; service.save( pathToPom, model, comment ); verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ), any( CommentedOption.class ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveNonClashingGAVNoChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( pom ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final String comment = "comment"; service.save( pathToPom, model, comment ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ), any( CommentedOption.class ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test() public void testSaveClashingGAVChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( new POM( new GAV( "groupId", "artifactId", "2.0.0" ) ) ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final MavenRepositoryMetadata repositoryMetadata = new MavenRepositoryMetadata( "id", "url", MavenRepositorySource.LOCAL ); projectRepositories.getRepositories().add( new ProjectRepositories.ProjectRepository( true, repositoryMetadata ) ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( gav ), eq( project ), eq( repositoryMetadata ) ) ).thenReturn( new HashSet<MavenRepositoryMetadata>() {{ add( repositoryMetadata ); }} ); final String comment = "comment"; try { service.save( pathToPom, model, comment ); } catch ( GAVAlreadyExistsException e ) { // This is expected! We catch here rather than let JUnit handle it with // @Test(expected = GAVAlreadyExistsException.class) so we can verify // that only the expected methods have been invoked. } catch ( Exception e ) { fail( e.getMessage() ); } verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ), any( MavenRepositoryMetadata.class ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); } @Test() public void testSaveClashingGAVNoChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( pom ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final MavenRepositoryMetadata repositoryMetadata = new MavenRepositoryMetadata( "id", "url", MavenRepositorySource.LOCAL ); projectRepositories.getRepositories().add( new ProjectRepositories.ProjectRepository( true, repositoryMetadata ) ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( gav ), eq( project ), eq( repositoryMetadata ) ) ).thenReturn( new HashSet<MavenRepositoryMetadata>() {{ add( repositoryMetadata ); }} ); final String comment = "comment"; try { service.save( pathToPom, model, comment ); } catch ( GAVAlreadyExistsException e ) { fail( e.getMessage() ); } verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); } @Test() public void testSaveClashingGAVFilteredRepositoryChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( new POM( new GAV( "groupId", "artifactId", "2.0.0" ) ) ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final MavenRepositoryMetadata repositoryMetadata = new MavenRepositoryMetadata( "id", "url", MavenRepositorySource.LOCAL ); projectRepositories.getRepositories().add( new ProjectRepositories.ProjectRepository( false, repositoryMetadata ) ); final ArgumentCaptor<MavenRepositoryMetadata> filterCaptor = ArgumentCaptor.forClass( MavenRepositoryMetadata.class ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( gav ), eq( project ), filterCaptor.capture() ) ).thenReturn( new HashSet<MavenRepositoryMetadata>() ); final String comment = "comment"; try { service.save( pathToPom, model, comment ); } catch ( GAVAlreadyExistsException e ) { //This should not be thrown if we're filtering out the Repository from the check fail( e.getMessage() ); } final List<MavenRepositoryMetadata> filter = filterCaptor.getAllValues(); assertEquals( 0, filter.size() ); verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ), any( CommentedOption.class ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test() public void testSaveClashingGAVFilteredRepositoryNoChangeToGAV() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( pom ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final MavenRepositoryMetadata repositoryMetadata = new MavenRepositoryMetadata( "id", "url", MavenRepositorySource.LOCAL ); projectRepositories.getRepositories().add( new ProjectRepositories.ProjectRepository( false, repositoryMetadata ) ); final ArgumentCaptor<MavenRepositoryMetadata> filterCaptor = ArgumentCaptor.forClass( MavenRepositoryMetadata.class ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( gav ), eq( project ), filterCaptor.capture() ) ).thenReturn( new HashSet<MavenRepositoryMetadata>() ); final String comment = "comment"; try { service.save( pathToPom, model, comment ); } catch ( GAVAlreadyExistsException e ) { //This should not be thrown if we're filtering out the Repository from the check fail( e.getMessage() ); } final List<MavenRepositoryMetadata> filter = filterCaptor.getAllValues(); assertEquals( 0, filter.size() ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( model.getPOM().getGav() ), eq( project ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ), any( CommentedOption.class ) ); verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test() public void testSaveClashingGAVForced() { when( pathToPom.toURI() ).thenReturn( "default://p0/pom.xml" ); final ProjectScreenModel model = new ProjectScreenModel(); model.setPOM( pom ); model.setPOMMetaData( pomMetaData ); model.setPathToPOM( pathToPom ); model.setKModule( kmodule ); model.setKModuleMetaData( kmoduleMetaData ); model.setPathToKModule( pathToKieModule ); model.setProjectImports( projectImports ); model.setProjectImportsMetaData( projectImportsMetaData ); model.setPathToImports( pathToProjectImports ); model.setRepositories( projectRepositories ); model.setPathToRepositories( pathToProjectRepositories ); final MavenRepositoryMetadata repositoryMetadata = new MavenRepositoryMetadata( "id", "url", MavenRepositorySource.LOCAL ); projectRepositories.getRepositories().add( new ProjectRepositories.ProjectRepository( true, repositoryMetadata ) ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( gav ), eq( project ), eq( repositoryMetadata ) ) ).thenReturn( new HashSet<MavenRepositoryMetadata>() {{ add( repositoryMetadata ); }} ); final String comment = "comment"; try { service.save( pathToPom, model, comment, DeploymentMode.FORCED ); } catch ( GAVAlreadyExistsException e ) { fail( "Unexpected exception thrown: " + e.getMessage() ); } verify( pomService, times( 1 ) ).save( eq( pathToPom ), eq( model.getPOM() ), eq( pomMetaData ), eq( comment ) ); verify( kModuleService, times( 1 ) ).save( eq( pathToKieModule ), eq( kmodule ), eq( kmoduleMetaData ), eq( comment ) ); verify( importsService, times( 1 ) ).save( eq( pathToProjectImports ), eq( projectImports ), eq( projectImportsMetaData ), eq( comment ) ); verify( repositoriesService, times( 1 ) ).save( eq( pathToProjectRepositories ), eq( projectRepositories ), eq( comment ) ); } @Test public void testReImport() throws Exception { service.reImport( pathToPom ); verify( projectService ).reImport( pathToPom ); } }