/* * 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.datamodeller.client; import java.util.ArrayList; import java.util.List; import com.google.gwtmockito.GwtMock; import com.google.gwtmockito.GwtMockitoTestRunner; import org.guvnor.common.services.shared.metadata.model.Overview; import org.guvnor.common.services.shared.validation.model.ValidationMessage; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.datamodeller.client.pdescriptor.ClassRow; import org.kie.workbench.common.screens.datamodeller.client.pdescriptor.ClassRowImpl; import org.kie.workbench.common.screens.datamodeller.client.pdescriptor.PersistenceUnitPropertyGrid; import org.kie.workbench.common.screens.datamodeller.client.pdescriptor.ProjectClassList; import org.kie.workbench.common.screens.datamodeller.client.type.PersistenceDescriptorType; import org.kie.workbench.common.screens.datamodeller.client.widgets.datasourceselector.DataSourceSelector; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceDescriptorEditorContent; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceDescriptorModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceUnitModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.TransactionType; import org.kie.workbench.common.screens.datamodeller.service.DataModelerService; import org.kie.workbench.common.screens.datamodeller.service.PersistenceDescriptorEditorService; import org.kie.workbench.common.screens.datamodeller.service.PersistenceDescriptorService; import org.kie.workbench.common.widgets.client.popups.validation.ValidationPopup; import org.kie.workbench.common.widgets.client.resources.i18n.CommonConstants; import org.kie.workbench.common.widgets.metadata.client.KieEditorWrapperView; import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter; 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.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; 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.anyBoolean; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @RunWith( GwtMockitoTestRunner.class) public class PersistenceDescriptorEditorPresenterTest { @GwtMock private PersistenceDescriptorType persistenceDescriptorType; @GwtMock private PersistenceDescriptorEditorView view; @GwtMock private PersistenceUnitPropertyGrid propertyGrid; @GwtMock private DataSourceSelector dataSourceSelector; @GwtMock private ProjectClassList projectClassList; @GwtMock private ObservablePath path; @GwtMock private VersionRecordManager _versionRecordManager; private PersistenceDescriptorEditorPresenter presenter; @Mock private ValidationPopup validationPopup; @Mock private PersistenceDescriptorEditorService editorService; @Mock private PersistenceDescriptorService descriptorService; @Mock private DataModelerService dataModelerService; @Mock private EventSourceMock<NotificationEvent> notificationEvent; @Before public void setup() { presenter = new PersistenceDescriptorEditorPresenter( view, persistenceDescriptorType, dataSourceSelector, new CallerMock<>( editorService ), new CallerMock<>( descriptorService ), new CallerMock<>( dataModelerService ), validationPopup ) { { kieView = mock( KieEditorWrapperView.class ); this.versionRecordManager = _versionRecordManager; overviewWidget = mock( OverviewWidgetPresenter.class ); this.notification = notificationEvent; } protected void makeMenuBar() { } protected void addSourcePage() { } }; verify( view, times( 1 ) ).setPresenter( presenter ); when( editorService.loadContent( any( Path.class ), anyBoolean() ) ).thenReturn( createEditorContent() ); when( dataModelerService.findPersistableClasses( any( Path.class ) ) ).thenReturn( createPersistableClasses() ); } private void loadContent() { when( _versionRecordManager.getCurrentPath() ).thenReturn( path ); when ( view.getPersistenceUnitProperties() ).thenReturn( propertyGrid ); when ( view.getPersistenceUnitClasses() ).thenReturn( projectClassList ); presenter.onStartup( path, mock( PlaceRequest.class ) ); } @Test public void testOnLoad() { loadContent(); verify( view, times( 1 ) ).setReadOnly( false ); verify( view, times( 1 ) ).hideBusyIndicator(); List<ClassRow> classRows = new ArrayList<ClassRow>(); classRows.add( new ClassRowImpl( "Class1" ) ); classRows.add( new ClassRowImpl( "Class2" ) ); when( projectClassList.getClasses() ).thenReturn( classRows ); assertEquals( "2.0", presenter.getContent().getDescriptorModel().getVersion() ); assertEquals( "UnitName", presenter.getContent().getDescriptorModel().getPersistenceUnit().getName() ); assertEquals( TransactionType.JTA, presenter.getContent().getDescriptorModel().getPersistenceUnit().getTransactionType() ); assertEquals( "ProviderClass", presenter.getContent().getDescriptorModel().getPersistenceUnit().getProvider() ); assertEquals( "JTADataSource", presenter.getContent().getDescriptorModel().getPersistenceUnit().getJtaDataSource() ); assertEquals( 2, presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().size() ); assertEquals( "Class1", presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 0 ) ); assertEquals( "Class2", presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 1 ) ); } @Test public void onJTADataSourceChange( ) { loadContent(); when( view.getJTADataSource() ).thenReturn( "NewJTADataSource" ); presenter.onJTADataSourceChange(); verify( view, times( 1 ) ).getJTADataSource(); assertEquals( "NewJTADataSource", presenter.getContent().getDescriptorModel().getPersistenceUnit().getJtaDataSource() ); } @Test public void testOnJTATransactionsChange() { loadContent(); when( view.getJTATransactions() ).thenReturn( true ); presenter.onJTATransactionsChange(); verify( view, times( 1 ) ).getJTATransactions(); assertEquals( TransactionType.JTA, presenter.getContent().getDescriptorModel().getPersistenceUnit().getTransactionType() ); } @Test public void testOnResourceLocalTransactionsChange() { loadContent(); when( view.getResourceLocalTransactions() ).thenReturn( true ); presenter.onResourceLocalTransactionsChange(); verify( view, times( 2 ) ).getResourceLocalTransactions(); assertEquals( TransactionType.RESOURCE_LOCAL, presenter.getContent().getDescriptorModel().getPersistenceUnit().getTransactionType() ); } @Test public void testOnPersistenceUnitNameChange() { loadContent(); when( view.getPersistenceUnitName() ).thenReturn( "NewUnitName" ); presenter.onPersistenceUnitNameChange(); verify( view, times( 1 ) ).getPersistenceUnitName(); assertEquals( "NewUnitName", presenter.getContent().getDescriptorModel().getPersistenceUnit().getName() ); } @Test public void testOnPersistenceProviderChange() { loadContent(); when( view.getPersistenceProvider() ).thenReturn( "NewPersistenceProvider" ); presenter.onPersistenceProviderChange(); verify( view, times( 1 ) ).getPersistenceProvider(); assertEquals( "NewPersistenceProvider", presenter.getContent().getDescriptorModel().getPersistenceUnit().getProvider() ); } @Test public void testOnLoadClasses() { loadContent(); when( view.getPersistenceUnitClasses() ).thenReturn( projectClassList ); List<ClassRow> classRows = new ArrayList<ClassRow>(); classRows.add( new ClassRowImpl( "Class3" ) ); classRows.add( new ClassRowImpl( "Class4") ); when( projectClassList.getClasses() ).thenReturn( classRows ); presenter.onLoadClasses(); verify( view, times( 1 ) ).showBusyIndicator( anyString() ); verify( view, times( 2 ) ).hideBusyIndicator(); verify( view, times( 5 ) ).getPersistenceUnitClasses(); assertEquals( 2, presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().size() ); assertEquals( classRows.get( 0 ).getClassName(), presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 0 ) ); assertEquals( classRows.get( 1 ).getClassName(), presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 1 ) ); } @Test public void testOnLoadClass() { loadContent(); when( view.getPersistenceUnitClasses() ).thenReturn( projectClassList ); List<ClassRow> classRows = new ArrayList<ClassRow>(); classRows.add( new ClassRowImpl( "Class3" ) ); classRows.add( new ClassRowImpl( "Class4" ) ); projectClassList.setClasses( classRows ); when( projectClassList.getClasses() ).thenReturn( classRows ); when( dataModelerService.isPersistableClass( eq( "NewClass" ), any( Path.class ) ) ).thenReturn( true ); presenter.onLoadClass( "NewClass" ); classRows.add( new ClassRowImpl( "NewClass" ) ); verify( view, times( 1 ) ).showBusyIndicator( anyString() ); verify( view, times( 2 ) ).hideBusyIndicator(); verify( view, times( 5 ) ).getPersistenceUnitClasses(); verify( projectClassList, times( 1 ) ).setNewClassName( null ); verify( projectClassList, times( 1 ) ).setNewClassHelpMessage( null ); assertEquals( 3, presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().size() ); assertEquals( classRows.get( 0 ).getClassName(), presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 0 ) ); assertEquals( classRows.get( 1 ).getClassName(), presenter.getContent().getDescriptorModel().getPersistenceUnit().getClasses().get( 1 ) ); assertEquals( classRows.get( 2 ).getClassName(), "NewClass" ); } @Test public void testOnValidateWithNoMessages() { loadContent(); List<ValidationMessage> messages = new ArrayList<>( ); when( descriptorService.validate( path, presenter.getContent().getDescriptorModel() ) ).thenReturn( messages ); presenter.onValidate().execute(); verify( validationPopup, never() ).showTranslatedMessages( anyList() ); verify( notificationEvent, times( 1 ) ).fire( new NotificationEvent( CommonConstants.INSTANCE.ItemValidatedSuccessfully( ), NotificationEvent.NotificationType.SUCCESS ) ); } @Test public void testOnValidateWithMessages() { loadContent(); List<ValidationMessage> messages = new ArrayList<>( ); messages.add( mock( ValidationMessage.class ) ); messages.add( mock( ValidationMessage.class ) ); when( descriptorService.validate( path, presenter.getContent().getDescriptorModel() ) ).thenReturn( messages ); presenter.onValidate().execute(); verify( validationPopup, times( 1 ) ).showTranslatedMessages( messages ); } private PersistenceDescriptorEditorContent createEditorContent() { PersistenceDescriptorEditorContent content = new PersistenceDescriptorEditorContent(); PersistenceDescriptorModel model = new PersistenceDescriptorModel(); model.setVersion( "2.0" ); PersistenceUnitModel unitModel = new PersistenceUnitModel(); model.setPersistenceUnit( unitModel ); unitModel.setName( "UnitName" ); unitModel.setTransactionType( TransactionType.JTA ); unitModel.setProvider( "ProviderClass" ); unitModel.setJtaDataSource( "JTADataSource" ); List<String> classes = new ArrayList<String>( ); classes.add( "Class1" ); classes.add( "Class2" ); unitModel.setClasses( classes ); content.setDescriptorModel( model ); content.setOverview( new Overview() ); return content; } private List<String> createPersistableClasses() { List<String> classes = new ArrayList<String>(); classes.add( "Class3" ); classes.add( "Class4" ); return classes; } }