/* * Copyright 2017 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.widgets.metadata.client; import java.lang.reflect.Field; import org.drools.workbench.models.datamodel.imports.Imports; import org.guvnor.common.services.project.context.ProjectContext; import org.guvnor.common.services.shared.metadata.model.Overview; import org.junit.Before; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder; import org.kie.workbench.common.widgets.client.menu.FileMenuBuilderImpl; import org.kie.workbench.common.widgets.configresource.client.widget.bound.ImportsWidgetPresenter; import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuBuilder; import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter; import org.mockito.Mock; import org.mockito.Spy; import org.uberfire.backend.vfs.ObservablePath; import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent; import org.uberfire.ext.editor.commons.client.file.popups.CopyPopUpPresenter; import org.uberfire.ext.editor.commons.client.file.popups.DeletePopUpPresenter; import org.uberfire.ext.editor.commons.client.file.popups.RenamePopUpPresenter; import org.uberfire.ext.editor.commons.client.history.VersionRecordManager; import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilder; import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilderImpl; import org.uberfire.ext.editor.commons.client.menu.RestoreVersionCommandProvider; import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator; import org.uberfire.ext.editor.commons.version.VersionService; import org.uberfire.ext.editor.commons.version.events.RestoreEvent; 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 org.uberfire.workbench.model.menu.MenuItem; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; abstract class KieMultipleDocumentEditorTestBase { protected TestMultipleDocumentEditor editor; @Mock protected KieEditorView editorView; @Mock protected KieMultipleDocumentEditorWrapperView kieEditorWrapperView; @Mock protected OverviewWidgetPresenter overviewWidget; @Mock protected ImportsWidgetPresenter importsWidget; @Mock protected EventSourceMock<ChangeTitleWidgetEvent> changeTitleEvent; @Mock protected ProjectContext workbenchContext; @Mock protected EventSourceMock<RestoreEvent> restoreEvent; @Mock protected DefaultFileNameValidator fileNameValidator; @Mock protected MenuItem saveMenuItem; @Mock protected MenuItem versionManagerMenuItem; @Mock private BusyIndicatorView busyIndicatorView; @Mock private EventSourceMock<NotificationEvent> notification; @Spy protected RestoreVersionCommandProvider restoreVersionCommandProvider = getRestoreVersionCommandProvider(); @Spy protected BasicFileMenuBuilder basicFileMenuBuilder = getBasicFileMenuBuilder(); @Spy protected FileMenuBuilder fileMenuBuilder = getFileMenuBuilder(); @Mock protected RegisteredDocumentsMenuBuilder registeredDocumentsMenuBuilder; @Mock private VersionService versionService; protected CallerMock<VersionService> versionServiceCaller; @Mock protected VersionRecordManager versionRecordManager; @Mock private DeletePopUpPresenter deletePopUpPresenter; @Mock private CopyPopUpPresenter copyPopUpPresenter; @Mock private RenamePopUpPresenter renamePopUpPresenter; @Mock protected EventSourceMock<NotificationEvent> notificationEvent; protected Command concurrentRenameCommand; protected Command concurrentDeleteCommand; @Before public void setup() { concurrentRenameCommand = null; concurrentDeleteCommand = null; versionServiceCaller = new CallerMock<>( versionService ); final TestMultipleDocumentEditor wrapped = new TestMultipleDocumentEditor( editorView ) { @Override void doConcurrentRename( final TestDocument document, final ObservablePath.OnConcurrentRenameEvent info ) { if ( concurrentRenameCommand != null ) { concurrentRenameCommand.execute(); } } @Override void doConcurrentDelete( final TestDocument document, final ObservablePath.OnConcurrentDelete info ) { if ( concurrentDeleteCommand != null ) { concurrentDeleteCommand.execute(); } } @Override void doSave( final TestDocument document ) { super.getSaveCommand( document ).execute( "commit" ); } }; wrapped.setKieEditorWrapperView( kieEditorWrapperView ); wrapped.setOverviewWidget( overviewWidget ); wrapped.setImportsWidget( importsWidget ); wrapped.setNotificationEvent( notificationEvent ); wrapped.setChangeTitleEvent( changeTitleEvent ); wrapped.setWorkbenchContext( workbenchContext ); wrapped.setVersionRecordManager( versionRecordManager ); wrapped.setRegisteredDocumentsMenuBuilder( registeredDocumentsMenuBuilder ); wrapped.setFileMenuBuilder( fileMenuBuilder ); wrapped.setFileNameValidator( fileNameValidator ); this.editor = spy( wrapped ); when( versionRecordManager.newSaveMenuItem( any( Command.class ) ) ).thenReturn( saveMenuItem ); when( versionRecordManager.buildMenu() ).thenReturn( versionManagerMenuItem ); } protected TestDocument createTestDocument() { final ObservablePath path = mock( ObservablePath.class ); final PlaceRequest placeRequest = mock( PlaceRequest.class ); return spy( new TestDocument( path, placeRequest ) ); } protected void registerDocument( final TestDocument document ) { editor.registerDocument( document ); } protected void activateDocument( final TestDocument document ) { final Overview overview = mock( Overview.class ); final AsyncPackageDataModelOracle dmo = mock( AsyncPackageDataModelOracle.class ); final Imports imports = mock( Imports.class ); final boolean isReadOnly = false; editor.activateDocument( document, overview, dmo, imports, isReadOnly ); } private RestoreVersionCommandProvider getRestoreVersionCommandProvider() { final RestoreVersionCommandProvider restoreVersionCommandProvider = new RestoreVersionCommandProvider(); setField( restoreVersionCommandProvider, "versionService", versionServiceCaller ); setField( restoreVersionCommandProvider, "restoreEvent", restoreEvent ); setField( restoreVersionCommandProvider, "busyIndicatorView", editorView ); return restoreVersionCommandProvider; } private BasicFileMenuBuilder getBasicFileMenuBuilder() { final BasicFileMenuBuilder basicFileMenuBuilder = new BasicFileMenuBuilderImpl( deletePopUpPresenter, copyPopUpPresenter, renamePopUpPresenter, busyIndicatorView, notification, restoreVersionCommandProvider ); setField( basicFileMenuBuilder, "restoreVersionCommandProvider", restoreVersionCommandProvider ); setField( basicFileMenuBuilder, "notification", notificationEvent ); setField( restoreVersionCommandProvider, "busyIndicatorView", editorView ); return basicFileMenuBuilder; } private FileMenuBuilder getFileMenuBuilder() { final FileMenuBuilder fileMenuBuilder = new FileMenuBuilderImpl(); setField( fileMenuBuilder, "menuBuilder", basicFileMenuBuilder ); return fileMenuBuilder; } private void setField( final Object o, final String fieldName, final Object value ) { try { final Field field = o.getClass().getDeclaredField( fieldName ); field.setAccessible( true ); field.set( o, value ); } catch ( NoSuchFieldException | IllegalAccessException e ) { fail( e.getMessage() ); } } }