/*
* 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.widgets.metadata.client.popups;
import java.util.ArrayList;
import java.util.List;
import org.jboss.errai.ioc.client.api.ManagedInstance;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.widgets.metadata.client.KieMultipleDocumentEditorPresenter;
import org.kie.workbench.common.widgets.metadata.client.popups.SelectDocumentPopupView.SelectableDocumentView;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.vfs.Path;
import org.uberfire.mvp.ParameterizedCommand;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SelectDocumentPopupTest {
@Mock
private SelectDocumentPopupView view;
@Mock
private ManagedInstance<SelectableDocumentView> selectableDocumentViewProvider;
@Mock
private KieMultipleDocumentEditorPresenter editor;
@Captor
private ArgumentCaptor<ParameterizedCommand> commandArgumentCaptor;
@Captor
private ArgumentCaptor<List<Path>> pathsArgumentCaptor;
private SelectDocumentPopupPresenter presenter;
@Before
public void setup() {
final SelectDocumentPopupPresenter wrapped = new SelectDocumentPopup( view,
selectableDocumentViewProvider );
wrapped.setEditorPresenter( editor );
presenter = spy( wrapped );
}
@Test
public void testSetDocuments() {
final SelectableDocumentView selectableDocumentBean = makeSelectableDocument( "default://p0/src/main/resources/dtable1.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( selectableDocumentBean.getPath() );
}};
presenter.setDocuments( documents );
final ArgumentCaptor<SelectableDocumentView> selectableDocumentArgumentCaptor = ArgumentCaptor.forClass( SelectableDocumentView.class );
verify( presenter,
times( 1 ) ).dispose();
verify( view,
times( 1 ) ).addDocument( selectableDocumentArgumentCaptor.capture() );
final SelectableDocumentView selectableDocument = selectableDocumentArgumentCaptor.getValue();
assertNotNull( selectableDocument );
assertEquals( documents.get( 0 ).toURI(),
selectableDocument.getPath().toURI() );
verify( view,
times( 1 ) ).enableOKButton( eq( false ) );
}
@Test
public void testShow() {
presenter.show();
verify( view,
times( 1 ) ).show();
}
@Test
@SuppressWarnings("unchecked")
public void testOnSelectSelected() {
final SelectableDocumentView selectableDocumentBean1 = mock( SelectableDocumentView.class );
final SelectableDocumentView selectableDocumentBean2 = mock( SelectableDocumentView.class );
final Path documentPath1 = mock( Path.class );
final Path documentPath2 = mock( Path.class );
when( selectableDocumentViewProvider.get() ).thenReturn( selectableDocumentBean1 ).thenReturn( selectableDocumentBean2 );
when( selectableDocumentBean1.getPath() ).thenReturn( documentPath1 );
when( selectableDocumentBean2.getPath() ).thenReturn( documentPath2 );
when( documentPath1.toURI() ).thenReturn( "default://p0/src/main/resources/dtable1.gdst" );
when( documentPath2.toURI() ).thenReturn( "default://p0/src/main/resources/dtable2.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( documentPath1 );
add( documentPath2 );
}};
presenter.setDocuments( documents );
verify( selectableDocumentBean1,
times( 1 ) ).setDocumentSelectedCommand( commandArgumentCaptor.capture() );
final ParameterizedCommand command = commandArgumentCaptor.getValue();
assertNotNull( command );
command.execute( true );
verify( selectableDocumentBean1,
times( 1 ) ).setSelected( eq( true ) );
verify( selectableDocumentBean2,
times( 1 ) ).setSelected( eq( false ) );
verify( view,
times( 1 ) ).enableOKButton( eq( true ) );
}
@Test
@SuppressWarnings("unchecked")
public void testOnSelectDeselected() {
final SelectableDocumentView selectableDocumentBean1 = mock( SelectableDocumentView.class );
final SelectableDocumentView selectableDocumentBean2 = mock( SelectableDocumentView.class );
final Path documentPath1 = mock( Path.class );
final Path documentPath2 = mock( Path.class );
when( selectableDocumentViewProvider.get() ).thenReturn( selectableDocumentBean1 ).thenReturn( selectableDocumentBean2 );
when( selectableDocumentBean1.getPath() ).thenReturn( documentPath1 );
when( selectableDocumentBean2.getPath() ).thenReturn( documentPath2 );
when( documentPath1.toURI() ).thenReturn( "default://p0/src/main/resources/dtable1.gdst" );
when( documentPath2.toURI() ).thenReturn( "default://p0/src/main/resources/dtable2.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( documentPath1 );
add( documentPath2 );
}};
presenter.setDocuments( documents );
verify( view,
times( 1 ) ).enableOKButton( eq( false ) );
verify( selectableDocumentBean1,
times( 1 ) ).setDocumentSelectedCommand( commandArgumentCaptor.capture() );
final ParameterizedCommand command = commandArgumentCaptor.getValue();
assertNotNull( command );
//Select document first
command.execute( true );
verify( selectableDocumentBean1,
times( 1 ) ).setSelected( eq( true ) );
verify( selectableDocumentBean2,
times( 1 ) ).setSelected( eq( false ) );
verify( view,
times( 1 ) ).enableOKButton( eq( true ) );
//Deselect document
command.execute( false );
verify( selectableDocumentBean1,
times( 1 ) ).setSelected( eq( false ) );
verify( selectableDocumentBean2,
times( 2 ) ).setSelected( eq( false ) );
verify( view,
times( 2 ) ).enableOKButton( eq( false ) );
}
@Test
@SuppressWarnings("unchecked")
public void testOnOK_WithSelection() {
final SelectableDocumentView selectableDocumentBean = makeSelectableDocument( "default://p0/src/main/resources/dtable1.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( selectableDocumentBean.getPath() );
}};
presenter.setDocuments( documents );
verify( presenter,
times( 1 ) ).dispose();
verify( selectableDocumentBean,
times( 1 ) ).setDocumentSelectedCommand( commandArgumentCaptor.capture() );
final ParameterizedCommand command = commandArgumentCaptor.getValue();
command.execute( true );
presenter.onOK();
verify( editor,
times( 1 ) ).onOpenDocumentsInEditor( pathsArgumentCaptor.capture() );
verify( view,
times( 1 ) ).hide();
verify( presenter,
times( 2 ) ).dispose();
final List<Path> selectedDocumentPaths = pathsArgumentCaptor.getValue();
assertNotNull( selectedDocumentPaths );
assertEquals( 1,
selectedDocumentPaths.size() );
assertEquals( selectableDocumentBean.getPath(),
selectedDocumentPaths.get( 0 ) );
}
@Test
@SuppressWarnings("unchecked")
public void testOnOK_WithoutSelection() {
final SelectableDocumentView selectableDocumentBean = makeSelectableDocument( "default://p0/src/main/resources/dtable1.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( selectableDocumentBean.getPath() );
}};
presenter.setDocuments( documents );
verify( presenter,
times( 1 ) ).dispose();
presenter.onOK();
verify( editor,
never() ).onOpenDocumentsInEditor( any( List.class ) );
verify( view,
times( 1 ) ).hide();
verify( presenter,
times( 2 ) ).dispose();
}
@Test
public void testOnCancel() {
presenter.onCancel();
verify( view,
times( 1 ) ).hide();
verify( presenter,
times( 1 ) ).dispose();
}
@Test
public void testDispose() {
final SelectableDocumentView selectableDocumentBean = makeSelectableDocument( "default://p0/src/main/resources/dtable1.gdst" );
final List<Path> documents = new ArrayList<Path>() {{
add( selectableDocumentBean.getPath() );
}};
presenter.setDocuments( documents );
verify( view,
times( 1 ) ).clear();
presenter.dispose();
verify( view,
times( 2 ) ).clear();
}
private SelectableDocumentView makeSelectableDocument( final String uri ) {
final SelectableDocumentView selectableDocumentBean = mock( SelectableDocumentView.class );
final Path documentPath = mock( Path.class );
when( selectableDocumentViewProvider.get() ).thenReturn( selectableDocumentBean );
when( selectableDocumentBean.getPath() ).thenReturn( documentPath );
when( documentPath.toURI() ).thenReturn( uri );
return selectableDocumentBean;
}
}