/* * 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.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.guvnor.common.services.backend.metadata.MetadataServerSideService; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.project.backend.server.utils.POMContentHandler; 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.ProjectRepositories; import org.guvnor.common.services.project.service.DeploymentMode; import org.guvnor.common.services.project.service.GAVAlreadyExistsException; import org.guvnor.common.services.project.service.ProjectRepositoriesService; import org.guvnor.common.services.project.service.ProjectRepositoryResolver; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.defaulteditor.service.DefaultEditorContent; import org.kie.workbench.common.screens.defaulteditor.service.DefaultEditorService; import org.kie.workbench.common.screens.projecteditor.service.PomEditorService; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; 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 static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class PomEditorServiceImplTest { @Mock private IOService ioService; @Mock private DefaultEditorService defaultEditorService; @Mock private MetadataServerSideService metadataService; @Mock private CommentedOptionFactory commentedOptionFactory; @Mock private KieProjectService projectService; @Mock private ProjectRepositoryResolver repositoryResolver; @Mock private ProjectRepositoriesService projectRepositoriesService; @Mock private Path pomPath; @Mock private Metadata metaData; @Mock private KieProject project; @Mock private POM pom; @Mock private Path projectRepositoriesPath; private PomEditorService service; private String pomPathUri = "default://p0/pom.xml"; private Map<String, Object> attributes = new HashMap<String, Object>(); private DefaultEditorContent content = new DefaultEditorContent(); private POMContentHandler pomContentHandler = new POMContentHandler(); private String pomXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + "<modelVersion>4.0.0</modelVersion>\n" + "<groupId>groupId</groupId>\n" + "<artifactId>artifactId</artifactId>\n" + "<version>0.0.1</version>\n" + "<name>name</name>\n" + "<description>description</description>\n" + "</project>"; private String comment = "comment"; @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() { service = new PomEditorServiceImpl( ioService, defaultEditorService, metadataService, commentedOptionFactory, projectService, pomContentHandler, repositoryResolver, projectRepositoriesService ); when( pomPath.toURI() ).thenReturn( pomPathUri ); when( defaultEditorService.loadContent( pomPath ) ).thenReturn( content ); when( metadataService.setUpAttributes( eq( pomPath ), any( Metadata.class ) ) ).thenReturn( attributes ); when( projectService.resolveProject( pomPath ) ).thenReturn( project ); when( project.getRepositoriesPath() ).thenReturn( projectRepositoriesPath ); when( project.getPom() ).thenReturn( pom ); } @Test public void testLoad() { final DefaultEditorContent content = service.loadContent( pomPath ); assertNotNull( content ); assertEquals( this.content, content ); } @Test public void testSaveNonClashingGAVChangeToGAV() { final Set<ProjectRepositories.ProjectRepository> projectRepositoriesMetadata = new HashSet<ProjectRepositories.ProjectRepository>(); final ProjectRepositories projectRepositories = new ProjectRepositories( projectRepositoriesMetadata ); when( projectRepositoriesService.load( projectRepositoriesPath ) ).thenReturn( projectRepositories ); final ArgumentCaptor<MavenRepositoryMetadata> resolvedRepositoriesCaptor = ArgumentCaptor.forClass( MavenRepositoryMetadata.class ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( pomXml ), resolvedRepositoriesCaptor.capture() ) ).thenReturn( Collections.EMPTY_SET ); when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.2" ) ); service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); verify( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, times( 1 ) ).load( projectRepositoriesPath ); verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( pomXml ) ); final List<MavenRepositoryMetadata> resolvedRepositories = resolvedRepositoriesCaptor.getAllValues(); assertNotNull( resolvedRepositories ); assertEquals( 0, resolvedRepositories.size() ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveNonClashingGAVNoChangeToGAV() { when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.1" ) ); service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); verify( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, never() ).load( projectRepositoriesPath ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( pomXml ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveNonClashingGAVFilteredChangeToGAV() { final Set<ProjectRepositories.ProjectRepository> projectRepositoriesMetadata = new HashSet<ProjectRepositories.ProjectRepository>() {{ add( new ProjectRepositories.ProjectRepository( true, new MavenRepositoryMetadata( "local-id", "local-url", MavenRepositorySource.LOCAL ) ) ); }}; final ProjectRepositories projectRepositories = new ProjectRepositories( projectRepositoriesMetadata ); when( projectRepositoriesService.load( projectRepositoriesPath ) ).thenReturn( projectRepositories ); final ArgumentCaptor<MavenRepositoryMetadata> resolvedRepositoriesCaptor = ArgumentCaptor.forClass( MavenRepositoryMetadata.class ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( pomXml ), resolvedRepositoriesCaptor.capture() ) ).thenReturn( Collections.EMPTY_SET ); when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.2" ) ); service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); verify( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, times( 1 ) ).load( projectRepositoriesPath ); verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ); final List<MavenRepositoryMetadata> resolvedRepositories = resolvedRepositoriesCaptor.getAllValues(); assertNotNull( resolvedRepositories ); assertEquals( 1, resolvedRepositories.size() ); final MavenRepositoryMetadata repositoryMetadata = resolvedRepositories.get( 0 ); assertEquals( "local-id", repositoryMetadata.getId() ); assertEquals( "local-url", repositoryMetadata.getUrl() ); assertEquals( MavenRepositorySource.LOCAL, repositoryMetadata.getSource() ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveNonClashingGAVFilteredNoChangeToGAV() { when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.1" ) ); service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); verify( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, never() ).load( projectRepositoriesPath ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveClashingGAVChangeToGAV() { final Set<ProjectRepositories.ProjectRepository> projectRepositoriesMetadata = new HashSet<ProjectRepositories.ProjectRepository>() {{ add( new ProjectRepositories.ProjectRepository( true, new MavenRepositoryMetadata( "local-id", "local-url", MavenRepositorySource.LOCAL ) ) ); }}; final ProjectRepositories projectRepositories = new ProjectRepositories( projectRepositoriesMetadata ); when( projectRepositoriesService.load( projectRepositoriesPath ) ).thenReturn( projectRepositories ); final Set<MavenRepositoryMetadata> clashingRepositories = new HashSet<MavenRepositoryMetadata>() {{ add( new MavenRepositoryMetadata( "local-id", "local-url", MavenRepositorySource.LOCAL ) ); }}; final ArgumentCaptor<MavenRepositoryMetadata> resolvedRepositoriesCaptor = ArgumentCaptor.forClass( MavenRepositoryMetadata.class ); when( repositoryResolver.getRepositoriesResolvingArtifact( eq( pomXml ), resolvedRepositoriesCaptor.capture() ) ).thenReturn( clashingRepositories ); when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.2" ) ); try { service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); } 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( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, times( 1 ) ).load( projectRepositoriesPath ); verify( repositoryResolver, times( 1 ) ).getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ); final List<MavenRepositoryMetadata> resolvedRepositories = resolvedRepositoriesCaptor.getAllValues(); assertNotNull( resolvedRepositories ); assertEquals( 1, resolvedRepositories.size() ); final MavenRepositoryMetadata repositoryMetadata = resolvedRepositories.get( 0 ); assertEquals( "local-id", repositoryMetadata.getId() ); assertEquals( "local-url", repositoryMetadata.getUrl() ); assertEquals( MavenRepositorySource.LOCAL, repositoryMetadata.getSource() ); verify( ioService, never() ).startBatch( any( FileSystem.class ) ); verify( ioService, never() ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, never() ).endBatch(); } @Test public void testSaveClashingGAVNoChangeToGAV() { when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.1" ) ); try { service.save( pomPath, pomXml, metaData, comment, DeploymentMode.VALIDATED ); } catch ( GAVAlreadyExistsException e ) { // This is should not be thrown if the GAV has not changed. fail( e.getMessage() ); } verify( projectService, times( 1 ) ).resolveProject( pomPath ); verify( projectRepositoriesService, never() ).load( projectRepositoriesPath ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } @Test public void testSaveClashingGAVForced() { final Set<ProjectRepositories.ProjectRepository> projectRepositoriesMetadata = new HashSet<ProjectRepositories.ProjectRepository>() {{ add( new ProjectRepositories.ProjectRepository( true, new MavenRepositoryMetadata( "local-id", "local-url", MavenRepositorySource.LOCAL ) ) ); }}; final ProjectRepositories projectRepositories = new ProjectRepositories( projectRepositoriesMetadata ); when( projectRepositoriesService.load( projectRepositoriesPath ) ).thenReturn( projectRepositories ); final Set<MavenRepositoryMetadata> clashingRepositories = new HashSet<MavenRepositoryMetadata>() {{ add( new MavenRepositoryMetadata( "local-id", "local-url", MavenRepositorySource.LOCAL ) ); }}; when( repositoryResolver.getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ) ).thenReturn( clashingRepositories ); when( pom.getGav() ).thenReturn( new GAV( "groupId", "artifactId", "0.0.1" ) ); try { service.save( pomPath, pomXml, metaData, comment, DeploymentMode.FORCED ); } catch ( GAVAlreadyExistsException e ) { fail( e.getMessage() ); } verify( projectService, never() ).resolveProject( pomPath ); verify( projectRepositoriesService, never() ).load( pomPath ); verify( repositoryResolver, never() ).getRepositoriesResolvingArtifact( eq( pomXml ), any( MavenRepositoryMetadata.class ) ); verify( ioService, times( 1 ) ).startBatch( any( FileSystem.class ) ); verify( ioService, times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ), eq( pomXml ), eq( attributes ), any( CommentedOption.class ) ); verify( ioService, times( 1 ) ).endBatch(); } }