/* * Copyright 2014 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.client.wizard; import javax.enterprise.event.Event; import org.guvnor.common.services.project.client.ArtifactIdChangeHandler; import org.guvnor.common.services.project.client.GAVEditor; import org.guvnor.common.services.project.client.GAVEditorView; import org.guvnor.common.services.project.client.GroupIdChangeHandler; import org.guvnor.common.services.project.client.NameChangeHandler; import org.guvnor.common.services.project.client.POMEditorPanel; import org.guvnor.common.services.project.client.POMEditorPanelView; import org.guvnor.common.services.project.client.VersionChangeHandler; import org.guvnor.common.services.project.client.preferences.ProjectScopedResolutionStrategySupplier; import org.guvnor.common.services.project.model.GAV; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.preferences.GAVPreferences; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.projecteditor.service.ProjectScreenService; import org.kie.workbench.common.services.shared.validation.ValidationService; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.uberfire.client.callbacks.Callback; import org.uberfire.preferences.shared.impl.PreferenceScopeResolutionStrategyInfo; import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent; import org.uberfire.mocks.CallerMock; import org.uberfire.mvp.ParameterizedCommand; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class POMWizardPageTest { @Mock private POMEditorPanelView pomEditorView; private GAVEditor gavEditor; @Mock private GAVEditorView gavEditorView; @Mock private SyncBeanManager syncBeanManager; @Mock private POMWizardPageView view; @Mock private ProjectScreenService projectScreenService; @Mock private ValidationService validationService; @Mock private GAVPreferences gavPreferences; @Mock protected ProjectScopedResolutionStrategySupplier projectScopedResolutionStrategySupplier; @Mock Event event; @Captor ArgumentCaptor<NameChangeHandler> nameChangeCaptor; @Captor ArgumentCaptor<VersionChangeHandler> versionChangeCaptor; @Captor ArgumentCaptor<GroupIdChangeHandler> groupChangeCaptor; @Captor ArgumentCaptor<ArtifactIdChangeHandler> artifactChangeCaptor; private POMWizardPage page; private POMEditorPanel pomEditor; @Before @SuppressWarnings("unchecked") public void setUp() throws Exception { gavEditor = new GAVEditor( gavEditorView ); pomEditor = spy( new POMEditorPanel( pomEditorView, syncBeanManager, gavPreferences, projectScopedResolutionStrategySupplier ) ); //POMEditorView implementation updates a nested GAVEditor presenter. Mock the implementation to avoid use of real widgets doAnswer( new Answer<Void>() { @Override public Void answer( final InvocationOnMock invocation ) throws Throwable { final String artifactId = (String) invocation.getArguments()[ 0 ]; gavEditor.setArtifactID( artifactId ); return null; } } ).when( pomEditorView ).setArtifactID( any( String.class ) ); //POMEditorView implementation updates a nested GAVEditor presenter. Mock the implementation to avoid use of real widgets doAnswer( new Answer<Void>() { @Override public Void answer( final InvocationOnMock invocation ) throws Throwable { final GAV gav = (GAV) invocation.getArguments()[ 0 ]; gavEditor.setGAV( gav ); return null; } } ).when( pomEditorView ).setGAV( any( GAV.class ) ); //POMEditorView implementation updates a nested GAVEditor presenter. Mock the implementation to avoid use of real widgets doAnswer( new Answer<Void>() { @Override public Void answer( final InvocationOnMock invocation ) throws Throwable { final ArtifactIdChangeHandler handler = (ArtifactIdChangeHandler) invocation.getArguments()[ 0 ]; gavEditor.addArtifactIdChangeHandler( handler ); return null; } } ).when( pomEditorView ).addArtifactIdChangeHandler( any( ArtifactIdChangeHandler.class ) ); page = spy( new POMWizardPage( pomEditor, view, event, new CallerMock<ProjectScreenService>( projectScreenService ), new CallerMock<ValidationService>( validationService ) ) ); page.initialise(); doAnswer( invocationOnMock -> { ( (ParameterizedCommand<GAVPreferences>) invocationOnMock.getArguments()[1] ).execute( gavPreferences ); return null; } ).when( gavPreferences ).load( any( PreferenceScopeResolutionStrategyInfo.class ), any( ParameterizedCommand.class ), any( ParameterizedCommand.class ) ); } @Test public void testNameChangeHandlersRegistered() { when( pomEditor.getPom() ).thenReturn( new POM( "name", "description", new GAV( "g", "a", "v" ) ) ); doNothing().when( pomEditor ).setArtifactID( anyString() ); verify( pomEditor, times( 1 ) ).addNameChangeHandler( nameChangeCaptor.capture() ); nameChangeCaptor.getValue().onChange( "any new value" ); verify( event ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testVersionChangeHandlersRegistered() { when( pomEditor.getPom() ).thenReturn( new POM( "name", "description", new GAV( "g", "a", "v" ) ) ); verify( pomEditor, times( 1 ) ).addVersionChangeHandler( versionChangeCaptor.capture() ); versionChangeCaptor.getValue().onChange( "any new value" ); verify( event ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testGroupChangeHandlersRegistered() { when( pomEditor.getPom() ).thenReturn( new POM( "name", "description", new GAV( "g", "a", "v" ) ) ); verify( pomEditor, times( 1 ) ).addGroupIdChangeHandler( groupChangeCaptor.capture() ); groupChangeCaptor.getValue().onChange( "any new value" ); verify( event ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testArtifactChangeHandlersRegistered() { when( pomEditor.getPom() ).thenReturn( new POM( "name", "description", new GAV( "g", "a", "v" ) ) ); verify( pomEditor, times( 1 ) ).addArtifactIdChangeHandler( artifactChangeCaptor.capture() ); artifactChangeCaptor.getValue().onChange( "any new value" ); verify( event ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testInvalidPOMWithParent() throws Exception { mockValidationOfPom( false ); POM pom = new POM(); pom.setParent( new GAV() ); page.setPom( pom ); verify( page, times( 1 ) ).validateName( any( String.class ) ); verify( page, times( 1 ) ).validateGroupId( any( String.class ) ); verify( page, times( 1 ) ).validateArtifactId( any( String.class ) ); verify( page, times( 1 ) ).validateVersion( any( String.class ) ); verify( pomEditor, times( 1 ) ).setValidName( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidGroupID( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidArtifactID( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidVersion( eq( false ) ); } @Test public void testPomsWithParentDataDisableFieldsParentNotSet() throws Exception { page.setPom( new POM() ); verify( pomEditor, never() ).disableGroupID( anyString() ); verify( pomEditor, never() ).disableVersion( anyString() ); } @Test public void testInvalidPOMWithoutParent() throws Exception { mockValidationOfPom( false ); page.setPom( new POM() ); verify( page, times( 1 ) ).validateName( any( String.class ) ); verify( page, times( 1 ) ).validateGroupId( any( String.class ) ); verify( page, times( 1 ) ).validateArtifactId( any( String.class ) ); verify( page, times( 1 ) ).validateVersion( any( String.class ) ); verify( pomEditor, times( 1 ) ).setValidName( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidGroupID( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidArtifactID( eq( false ) ); verify( pomEditor, times( 1 ) ).setValidVersion( eq( false ) ); } @Test public void testValidPOMWithParent() throws Exception { mockValidationOfPom( true ); POM pom = new POM(); pom.setParent( new GAV() ); page.setPom( pom ); verify( page, times( 1 ) ).validateName( any( String.class ) ); verify( page, times( 1 ) ).validateGroupId( any( String.class ) ); verify( page, times( 1 ) ).validateArtifactId( any( String.class ) ); verify( page, times( 1 ) ).validateVersion( any( String.class ) ); verify( pomEditor, times( 1 ) ).setValidName( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidGroupID( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidArtifactID( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidVersion( eq( true ) ); } @Test public void testValidPOMWithoutParent() throws Exception { mockValidationOfPom( true ); page.setPom( new POM() ); verify( page, times( 1 ) ).validateName( any( String.class ) ); verify( page, times( 1 ) ).validateGroupId( any( String.class ) ); verify( page, times( 1 ) ).validateArtifactId( any( String.class ) ); verify( page, times( 1 ) ).validateVersion( any( String.class ) ); verify( pomEditor, times( 1 ) ).setValidName( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidGroupID( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidArtifactID( eq( true ) ); verify( pomEditor, times( 1 ) ).setValidVersion( eq( true ) ); } @Test public void testSetNameValidArtifactID() { mockValidationOfPom( true ); //POMEditorView implementation updates a nested GAVEditor presenter. Mock the implementation to avoid use of real widgets doAnswer( new Answer<Void>() { @Override public Void answer( final InvocationOnMock invocation ) throws Throwable { final String artifactId = (String) invocation.getArguments()[ 0 ]; gavEditor.setArtifactID( artifactId ); return null; } } ).when( pomEditorView ).setArtifactID( any( String.class ) ); //POMEditorView implementation updates a nested GAVEditor presenter. Mock the implementation to avoid use of real widgets doAnswer( new Answer<Void>() { @Override public Void answer( final InvocationOnMock invocation ) throws Throwable { final GAV gav = (GAV) invocation.getArguments()[ 0 ]; gavEditor.setGAV( gav ); return null; } } ).when( pomEditorView ).setGAV( any( GAV.class ) ); final POM pom = new POM(); page.setPom( pom ); verify( validationService, times( 1 ) ).isProjectNameValid( null ); verify( validationService, times( 1 ) ).validateArtifactId( null ); pomEditor.onNameChange( "project-name" ); verify( pomEditorView, times( 1 ) ).setArtifactID( eq( "project-name" ) ); verify( validationService, times( 1 ) ).isProjectNameValid( eq( "project-name" ) ); verify( validationService, times( 1 ) ).validateArtifactId( eq( "project-name" ) ); assertEquals( "project-name", pom.getName() ); assertEquals( "project-name", pom.getGav().getArtifactId() ); } @Test public void testSetNameInvalidArtifactID() { mockValidationOfPom( true ); final POM pom = new POM(); page.setPom( pom ); verify( validationService, times( 1 ) ).isProjectNameValid( null ); verify( validationService, times( 1 ) ).validateArtifactId( null ); pomEditor.onNameChange( "project-name!" ); verify( pomEditorView, times( 1 ) ).setArtifactID( eq( "project-name" ) ); verify( validationService, times( 1 ) ).isProjectNameValid( eq( "project-name!" ) ); verify( validationService, times( 1 ) ).validateArtifactId( eq( "project-name" ) ); assertEquals( "project-name!", pom.getName() ); assertEquals( "project-name", pom.getGav().getArtifactId() ); } @Test public void testSetNameValidArtifactIDUserChanged() { mockValidationOfPom( true ); final POM pom = new POM(); page.setPom( pom ); verify( validationService, times( 1 ) ).isProjectNameValid( null ); verify( validationService, times( 1 ) ).validateArtifactId( null ); gavEditor.onArtifactIdChange( "artifactId" ); pomEditor.onNameChange( "project-name" ); verify( pomEditorView, never() ).setArtifactID( eq( "project-name" ) ); verify( validationService, times( 1 ) ).isProjectNameValid( eq( "project-name" ) ); verify( validationService, times( 1 ) ).validateArtifactId( eq( "artifactId" ) ); assertEquals( "project-name", pom.getName() ); assertEquals( "artifactId", pom.getGav().getArtifactId() ); } @Test public void testSetNameValidArtifactIDUserChangedThenRevert() { mockValidationOfPom( true ); final POM pom = new POM(); page.setPom( pom ); verify( validationService, times( 1 ) ).isProjectNameValid( null ); verify( validationService, times( 1 ) ).validateArtifactId( null ); //Simulate the User change the Artifact ID manually gavEditor.onArtifactIdChange( "artifactId" ); pomEditor.onNameChange( "project-name" ); verify( pomEditorView, never() ).setArtifactID( eq( "project-name" ) ); verify( validationService, times( 1 ) ).isProjectNameValid( eq( "project-name" ) ); verify( validationService, times( 1 ) ).validateArtifactId( eq( "artifactId" ) ); assertEquals( "project-name", pom.getName() ); assertEquals( "artifactId", pom.getGav().getArtifactId() ); //Revert change to Artifact ID gavEditor.onArtifactIdChange( "" ); pomEditor.onNameChange( "project-name" ); verify( pomEditorView, times( 1 ) ).setArtifactID( eq( "project-name" ) ); verify( validationService, times( 2 ) ).isProjectNameValid( eq( "project-name" ) ); verify( validationService, times( 1 ) ).validateArtifactId( eq( "artifactId" ) ); assertEquals( "project-name", pom.getName() ); assertEquals( "project-name", pom.getGav().getArtifactId() ); } @Test public void testIsComplete() { when( validationService.validate( any( POM.class ) ) ).thenReturn( true ); Callback<Boolean> callback = mock( Callback.class ); page.isComplete( callback ); verify( callback, times( 1 ) ).callback( true ); } @Test public void testIsNotComplete() { when( validationService.validate( any( POM.class ) ) ).thenReturn( false ); Callback<Boolean> callback = mock( Callback.class ); page.isComplete( callback ); verify( callback, times( 1 ) ).callback( false ); } private void mockValidationOfPom( boolean isValid ) { when( validationService.validateGroupId( any( String.class ) ) ).thenReturn( isValid ); when( validationService.validateArtifactId( any( String.class ) ) ).thenReturn( isValid ); when( validationService.validateGAVVersion( any( String.class ) ) ).thenReturn( isValid ); when( validationService.isProjectNameValid( any( String.class ) ) ).thenReturn( isValid ); } }