/* * 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.client.forms; import java.util.Collections; import java.util.Set; import javax.enterprise.event.Event; import com.google.gwtmockito.GwtMockitoTestRunner; import org.guvnor.common.services.project.client.repositories.ConflictingRepositoriesPopup; import org.guvnor.common.services.project.model.GAV; import org.guvnor.common.services.project.model.MavenRepositoryMetadata; import org.guvnor.common.services.project.service.DeploymentMode; import org.guvnor.common.services.project.service.GAVAlreadyExistsException; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.defaulteditor.client.editor.KieTextEditorView; import org.kie.workbench.common.screens.projecteditor.service.PomEditorService; import org.kie.workbench.common.widgets.client.resources.i18n.CommonConstants; import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.uberfire.backend.vfs.ObservablePath; import org.uberfire.backend.vfs.Path; import org.uberfire.ext.editor.commons.client.history.VersionRecordManager; import org.uberfire.ext.widgets.common.client.common.BusyIndicatorView; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import org.uberfire.mvp.Command; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.events.NotificationEvent; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class PomEditorScreenPresenterTest { @Mock private KieTextEditorView view; @Mock private PomEditorService service; @Mock private ConflictingRepositoriesPopup conflictingRepositoriesPopup; @Mock private Path pomPath; @Mock private PlaceRequest placeRequest; @Mock private BusyIndicatorView mockBusyIndicatorView; @Mock private VersionRecordManager mockVersionRecordManager; @Mock private OverviewWidgetPresenter overviewWidgetPresenter; private Event<NotificationEvent> mockNotificationEvent = new EventSourceMock<NotificationEvent>() { @Override public void fire( final NotificationEvent event ) { //Do nothing. Default implementation throws an Exception. } }; private PomEditorScreenPresenter presenter; 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"; private GAV gav = new GAV( "groupId", "artifactId", "0.0.1" ); @Before public void setup() { presenter = new PomEditorScreenPresenter( view, new CallerMock<PomEditorService>( service ), conflictingRepositoriesPopup ) { { //Yuck, yuck, yuck... the class hierarchy is really a mess busyIndicatorView = mockBusyIndicatorView; versionRecordManager = mockVersionRecordManager; overviewWidget = overviewWidgetPresenter; notification = mockNotificationEvent; } }; when( view.getContent() ).thenReturn( pomXml ); } @Test public void testSaveNonClashingGAV() throws Exception { presenter.save( comment ); verify( service, times( 1 ) ).save( any( ObservablePath.class ), eq( pomXml ), any( Metadata.class ), eq( comment ), eq( DeploymentMode.VALIDATED ) ); verify( view, times( 1 ) ).showBusyIndicator( eq( CommonConstants.INSTANCE.Saving() ) ); verify( view, times( 1 ) ).hideBusyIndicator(); } @Test @SuppressWarnings("unchecked") public void testSaveClashingGAV() throws Exception { final GAVAlreadyExistsException gae = new GAVAlreadyExistsException( gav, Collections.<MavenRepositoryMetadata>emptySet() ); doThrow( gae ).when( service ).save( any( ObservablePath.class ), eq( pomXml ), any( Metadata.class ), eq( comment ), eq( DeploymentMode.VALIDATED ) ); presenter.save( comment ); verify( service, times( 1 ) ).save( any( ObservablePath.class ), eq( pomXml ), any( Metadata.class ), eq( comment ), eq( DeploymentMode.VALIDATED ) ); verify( view, times( 1 ) ).showBusyIndicator( eq( CommonConstants.INSTANCE.Saving() ) ); verify( view, times( 1 ) ).hideBusyIndicator(); final ArgumentCaptor<Command> commandArgumentCaptor = ArgumentCaptor.forClass( Command.class ); verify( conflictingRepositoriesPopup, times( 1 ) ).setContent( eq( gav ), any( Set.class ), commandArgumentCaptor.capture() ); verify( conflictingRepositoriesPopup, times( 1 ) ).show(); assertNotNull( commandArgumentCaptor.getValue() ); //Emulate User electing to force save commandArgumentCaptor.getValue().execute(); verify( service, times( 1 ) ).save( any( ObservablePath.class ), eq( pomXml ), any( Metadata.class ), eq( comment ), eq( DeploymentMode.FORCED ) ); //We attempted to save the POM twice verify( view, times( 2 ) ).showBusyIndicator( eq( CommonConstants.INSTANCE.Saving() ) ); //We hid the BusyPopup 1 x per save attempt verify( view, times( 2 ) ).hideBusyIndicator(); } }