/*
* 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.server.management.client.wizard;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import javax.enterprise.event.Event;
import org.jboss.errai.common.client.api.Caller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.server.controller.api.model.spec.ServerTemplate;
import org.kie.workbench.common.screens.server.management.client.events.ServerTemplateListRefresh;
import org.kie.workbench.common.screens.server.management.client.util.ContentChangeHandler;
import org.kie.workbench.common.screens.server.management.client.wizard.config.process.ProcessConfigPagePresenter;
import org.kie.workbench.common.screens.server.management.client.wizard.container.NewContainerFormPresenter;
import org.kie.workbench.common.screens.server.management.client.wizard.template.NewTemplatePresenter;
import org.kie.workbench.common.screens.server.management.service.SpecManagementService;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.uberfire.ext.widgets.core.client.wizards.AbstractWizard;
import org.uberfire.ext.widgets.core.client.wizards.WizardView;
import org.uberfire.mocks.CallerMock;
import org.uberfire.workbench.events.NotificationEvent;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class NewServerTemplateWizardTest {
@Mock
NewTemplatePresenter newTemplatePresenter;
@Mock
NewTemplatePresenter.View newTemplatePresenterView;
@Mock
NewContainerFormPresenter newContainerFormPresenter;
@Mock
ProcessConfigPagePresenter processConfigPagePresenter;
@Mock
Event<NotificationEvent> notification;
@Mock
Event<ServerTemplateListRefresh> serverTemplateListRefreshEvent;
@Mock
SpecManagementService specManagementService;
Caller<SpecManagementService> specManagementServiceCaller;
@Mock
WizardView view;
NewServerTemplateWizard newServerTemplateWizard;
private final Collection<ContentChangeHandler> contentChangeHandlers = new ArrayList<ContentChangeHandler>();
private final Answer contentHandlerAnswer = new Answer() {
@Override
public Object answer( final InvocationOnMock invocationOnMock ) throws Throwable {
fireContentHandlers();
return null;
}
};
private void fireContentHandlers() {
for ( final ContentChangeHandler handler : contentChangeHandlers ) {
handler.onContentChange();
}
}
@Before
public void setup() throws IllegalAccessException, NoSuchFieldException {
specManagementServiceCaller = new CallerMock<SpecManagementService>( specManagementService );
when( newTemplatePresenter.getView() ).thenReturn( newTemplatePresenterView );
final Answer addContentChangeHandler = new Answer() {
@Override
public Object answer( InvocationOnMock invocation ) throws Throwable {
final ContentChangeHandler handler = (ContentChangeHandler) invocation.getArguments()[ 0 ];
contentChangeHandlers.add( handler );
return null;
}
};
doAnswer( addContentChangeHandler ).when( newTemplatePresenter ).addContentChangeHandler( any( ContentChangeHandler.class ) );
doAnswer( addContentChangeHandler ).when( newContainerFormPresenter ).addContentChangeHandler( any( ContentChangeHandler.class ) );
newServerTemplateWizard = new NewServerTemplateWizard(
newTemplatePresenter,
newContainerFormPresenter,
processConfigPagePresenter,
specManagementServiceCaller,
notification,
serverTemplateListRefreshEvent
);
final Field field = AbstractWizard.class.getDeclaredField( "view" );
field.setAccessible( true );
field.set( newServerTemplateWizard, view );
newServerTemplateWizard = spy( newServerTemplateWizard );
}
@Test
public void testTitle() {
final String title = "title";
when( newTemplatePresenterView.getNewServerTemplateWizardTitle() ).thenReturn( title );
assertEquals( title, newServerTemplateWizard.getTitle() );
verify( newTemplatePresenterView ).getNewServerTemplateWizardTitle();
}
@Test
public void testPages() {
when( newTemplatePresenter.hasProcessCapability() ).thenReturn( true );
when( newContainerFormPresenter.isEmpty() ).thenReturn( false );
when( newContainerFormPresenter.isValid() ).thenReturn( true );
fireContentHandlers();
assertEquals( 3, newServerTemplateWizard.getPages().size() );
verify( view ).selectPage( 0 );
fireContentHandlers();
assertEquals( 3, newServerTemplateWizard.getPages().size() );
verify( view ).selectPage( 0 );
when( newTemplatePresenter.hasProcessCapability() ).thenReturn( true );
when( newContainerFormPresenter.isEmpty() ).thenReturn( true );
when( newContainerFormPresenter.isValid() ).thenReturn( false );
fireContentHandlers();
assertEquals( 2, newServerTemplateWizard.getPages().size() );
}
@Test
public void testComplete() {
when( newTemplatePresenter.isProcessCapabilityChecked() ).thenReturn( true );
when( newContainerFormPresenter.isEmpty() ).thenReturn( true );
when( newContainerFormPresenter.isEmpty() ).thenReturn( true );
when( newTemplatePresenter.getTemplateName() ).thenReturn( "template-name" );
final String successMessage = "SUCCESS";
when( newTemplatePresenterView.getNewServerTemplateWizardSaveSuccess() ).thenReturn( successMessage );
newServerTemplateWizard.complete();
verify( notification ).fire( new NotificationEvent( successMessage, NotificationEvent.NotificationType.SUCCESS ) );
verifyClear();
verify( serverTemplateListRefreshEvent ).fire( new ServerTemplateListRefresh( "template-name" ) );
doThrow( new RuntimeException() ).when( specManagementService ).saveServerTemplate( any( ServerTemplate.class ) );
final String errorMessage = "ERROR";
when( newTemplatePresenterView.getNewServerTemplateWizardSaveError() ).thenReturn( errorMessage );
newServerTemplateWizard.complete();
verify( notification ).fire( new NotificationEvent( errorMessage, NotificationEvent.NotificationType.ERROR ) );
verify( newServerTemplateWizard ).pageSelected( 0 );
verify( newServerTemplateWizard ).start();
verify( newContainerFormPresenter ).initialise();
}
@Test
public void testClear() {
newServerTemplateWizard.clear();
verifyClear();
}
@Test
public void testClose() {
newServerTemplateWizard.close();
verifyClear();
}
private void verifyClear() {
verify( newTemplatePresenter ).clear();
verify( newContainerFormPresenter ).clear();
verify( processConfigPagePresenter ).clear();
assertEquals( 2, newServerTemplateWizard.getPages().size() );
assertTrue( newServerTemplateWizard.getPages().contains( newTemplatePresenter ) );
assertTrue( newServerTemplateWizard.getPages().contains( newContainerFormPresenter ) );
}
}