/*
* 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.drools.workbench.screens.enums.client.editor;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.event.Event;
import com.google.gwt.core.client.GWT;
import com.google.gwtmockito.GwtMock;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.drools.workbench.screens.enums.client.type.EnumResourceType;
import org.drools.workbench.screens.enums.model.EnumModel;
import org.drools.workbench.screens.enums.model.EnumModelContent;
import org.drools.workbench.screens.enums.service.EnumService;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.guvnor.common.services.shared.metadata.model.Overview;
import org.jboss.errai.common.client.api.Caller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder;
import org.kie.workbench.common.widgets.client.popups.validation.ValidationPopup;
import org.kie.workbench.common.widgets.client.source.ViewDRLSourceWidget;
import org.kie.workbench.common.widgets.metadata.client.KieEditorWrapperView;
import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.ext.editor.commons.client.history.VersionRecordManager;
import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator;
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.*;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class EnumEditorPresenterTests {
@Mock
private EnumEditorView view;
@Mock
private KieEditorWrapperView mockKieView;
@Mock
private OverviewWidgetPresenter mockOverviewWidget;
@Mock
private VersionRecordManager mockVersionRecordManager;
@Mock
private FileMenuBuilder mockFileMenuBuilder;
@Mock
private DefaultFileNameValidator mockFileNameValidator;
@Mock
private EnumService enumService;
private Caller<EnumService> enumServiceCaller;
@Mock
private ObservablePath path;
@Mock
private PlaceRequest place;
@Mock
private Overview overview;
@Mock
private ValidationPopup validationPopup;
@GwtMock
private ViewDRLSourceWidget sourceWidget;
@Captor
private ArgumentCaptor<List<EnumRow>> enumsArgumentCaptor;
@Captor
private ArgumentCaptor<String> enumStringArgumentCaptor;
private Event<NotificationEvent> mockNotification = new EventSourceMock<NotificationEvent>() {
@Override
public void fire( final NotificationEvent event ) {
//Do nothing. Default implementation throws a RuntimeException
}
};
private EnumResourceType type;
private EnumEditorPresenter presenter;
private EnumModelContent content;
private EnumModel model;
@Before
public void setup() {
//Mock EnumResourceType
this.type = GWT.create( EnumResourceType.class );
//Mock FileMenuBuilder usage since we cannot use FileMenuBuilderImpl either
when( mockFileMenuBuilder.addSave( any( MenuItem.class ) ) ).thenReturn( mockFileMenuBuilder );
when( mockFileMenuBuilder.addCopy( any( ObservablePath.class ),
eq( mockFileNameValidator ) ) ).thenReturn( mockFileMenuBuilder );
when( mockFileMenuBuilder.addRename( any( ObservablePath.class ),
eq( mockFileNameValidator ) ) ).thenReturn( mockFileMenuBuilder );
when( mockFileMenuBuilder.addDelete( any( ObservablePath.class ) ) ).thenReturn( mockFileMenuBuilder );
when( mockFileMenuBuilder.addValidate( any( Command.class ) ) ).thenReturn( mockFileMenuBuilder );
when( mockFileMenuBuilder.addNewTopLevelMenu( any( MenuItem.class ) ) ).thenReturn( mockFileMenuBuilder );
when( mockVersionRecordManager.getCurrentPath() ).thenReturn( path );
when( mockVersionRecordManager.getPathToLatest() ).thenReturn( path );
this.model = new EnumModel( "'Fact.field' : ['a', 'b']" );
this.content = new EnumModelContent( model,
overview );
when( enumService.loadContent( path ) ).thenReturn( content );
when( view.getContent() ).thenReturn( new ArrayList<EnumRow>() {{
add( new EnumRow( "Fact",
"field",
"['a', 'b']" ) );
}} );
this.enumServiceCaller = new CallerMock<EnumService>( enumService );
this.presenter = new EnumEditorPresenter( view,
enumServiceCaller,
type,
validationPopup ) {
{
//Yuck, yuck, yuck... the class hierarchy is really a mess
this.kieView = mockKieView;
this.overviewWidget = mockOverviewWidget;
this.menuBuilder = mockFileMenuBuilder;
this.fileNameValidator = mockFileNameValidator;
this.versionRecordManager = mockVersionRecordManager;
this.notification = mockNotification;
}
};
}
@Test
public void testOnStartup() {
presenter.onStartup( path,
place );
verify( enumService,
times( 1 ) ).loadContent( path );
verify( view,
times( 1 ) ).setContent( enumsArgumentCaptor.capture() );
verify( view,
times( 1 ) ).hideBusyIndicator();
final List<EnumRow> enums = enumsArgumentCaptor.getValue();
assertNotNull( enums );
assertEquals( 1,
enums.size() );
final EnumRow enumRow = enums.get( 0 );
assertNotNull( enumRow );
assertEquals( "Fact",
enumRow.getFactName() );
assertEquals( "field",
enumRow.getFieldName() );
assertEquals( "['a', 'b']",
enumRow.getContext() );
}
@Test
public void testOnSave() {
presenter.onStartup( path,
place );
presenter.save( "message" );
verify( view,
times( 1 ) ).getContent();
verify( enumService,
times( 1 ) ).save( eq( path ),
enumStringArgumentCaptor.capture(),
any( Metadata.class ),
eq( "message" ) );
final String enumString = enumStringArgumentCaptor.getValue();
assertNotNull( enumString );
assertEquals( enumString,
"'Fact.field' : ['a', 'b']\n" );
}
@Test
public void testOnSourceTabSelected() {
presenter.onStartup( path,
place );
presenter.onSourceTabSelected();
verify( view,
times( 1 ) ).getContent();
}
}