/*
* 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.projecteditor.client.editor;
import java.util.Collection;
import java.util.Collections;
import com.google.gwtmockito.GwtMock;
import org.guvnor.common.services.project.client.preferences.ProjectScopedResolutionStrategySupplier;
import org.guvnor.common.services.project.client.repositories.ConflictingRepositoriesPopup;
import org.guvnor.common.services.project.context.ProjectContext;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.preferences.GAVPreferences;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.guvnor.structure.repositories.Repository;
import org.gwtbootstrap3.client.ui.AnchorListItem;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.ButtonGroup;
import org.gwtbootstrap3.client.ui.DropDownMenu;
import org.jboss.errai.security.shared.api.identity.User;
import org.kie.workbench.common.screens.projecteditor.client.build.BuildExecutor;
import org.kie.workbench.common.screens.projecteditor.client.editor.extension.BuildOptionExtension;
import org.kie.workbench.common.screens.projecteditor.client.validation.ProjectNameValidator;
import org.kie.workbench.common.screens.projecteditor.model.ProjectScreenModel;
import org.kie.workbench.common.screens.projecteditor.service.ProjectScreenService;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.kie.workbench.common.services.shared.validation.ValidationService;
import org.mockito.Mock;
import org.mockito.Spy;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.backend.vfs.Path;
import org.uberfire.backend.vfs.impl.ObservablePathImpl;
import org.uberfire.client.mvp.LockManager;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.commons.data.Pair;
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.file.popups.SavePopUpPresenter;
import org.uberfire.ext.widgets.common.client.common.BusyIndicatorView;
import org.uberfire.mocks.CallerMock;
import org.uberfire.mocks.EventSourceMock;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.preferences.shared.impl.PreferenceScopeResolutionStrategyInfo;
import org.uberfire.workbench.events.NotificationEvent;
import org.uberfire.workbench.type.ResourceTypeDefinition;
import static org.mockito.Mockito.*;
public abstract class ProjectScreenPresenterTestBase {
protected ProjectScreenPresenter presenter;
@Mock
protected ProjectScreenView view;
@Mock
protected User user;
@Mock
protected CopyPopUpPresenter copyPopUpPresenter;
@Mock
protected RenamePopUpPresenter renamePopUpPresenter;
@Mock
protected DeletePopUpPresenter deletePopUpPresenter;
@Mock
protected SavePopUpPresenter savePopUpPresenter;
@Mock
protected ProjectScreenService projectScreenService;
@Mock
protected EventSourceMock<NotificationEvent> notificationEvent;
@Mock
protected ConflictingRepositoriesPopup conflictingRepositoriesPopup;
@Spy
protected ProjectContext context = new ProjectContext();
@Spy
protected MockInstance<LockManager> lockManagerInstanceProvider = new MockInstance();
@Spy
protected MockInstance<ResourceTypeDefinition> resourceTypeDefinitions = new MockInstance();
@GwtMock
@SuppressWarnings("unused")
private ButtonGroup buildOptions;
@GwtMock
@SuppressWarnings("unused")
private Button buildOptionsButton1;
@GwtMock
@SuppressWarnings("unused")
private DropDownMenu buildOptionsMenu;
@GwtMock
@SuppressWarnings("unused")
private AnchorListItem buildOptionsMenuButton1;
@Mock
protected KieProject project;
@Mock
protected Repository repository;
@Mock
protected Path pomPath;
@Mock
protected GAVPreferences gavPreferences;
@Mock
protected ProjectScopedResolutionStrategySupplier projectScopedResolutionStrategySupplier;
@Mock
protected BuildExecutor buildExecutor;
protected ObservablePath observablePathToPomXML;
protected void mockBuildOptions() {
when(view.getBuildButtons()).thenReturn(buildOptions);
when(buildOptions.getWidget(eq(0))).thenReturn(buildOptionsButton1);
when(buildOptions.getWidget(eq(1))).thenReturn(buildOptionsMenu);
when(buildOptionsMenu.getWidget(eq(0))).thenReturn(buildOptionsMenuButton1);
when(buildOptionsMenu.getWidget(eq(1))).thenReturn(buildOptionsMenuButton1);
}
protected POM mockProjectScreenService(final ProjectScreenModel model) {
final POM pom = new POM(new GAV("groupId",
"artifactId",
"version"));
model.setPOM(pom);
when(projectScreenService.load(any(Path.class))).thenReturn(model);
return pom;
}
protected void mockLockManager(final ProjectScreenModel model) {
final Path path = mock(Path.class);
final Metadata pomMetadata = mock(Metadata.class);
model.setPOMMetaData(pomMetadata);
when(pomMetadata.getPath()).thenReturn(path);
final Metadata kmoduleMetadata = mock(Metadata.class);
model.setKModuleMetaData(kmoduleMetadata);
when(kmoduleMetadata.getPath()).thenReturn(path);
final Metadata importsMetadata = mock(Metadata.class);
model.setProjectImportsMetaData(importsMetadata);
when(importsMetadata.getPath()).thenReturn(path);
}
protected void mockProjectContext(final POM pom,
final Repository repository,
final KieProject project,
final Path pomPath) {
when(context.getActiveRepository()).thenReturn(repository);
when(context.getActiveBranch()).thenReturn("master");
when(repository.getAlias()).thenReturn("repository");
when(project.getProjectName()).thenReturn("project");
when(project.getPomXMLPath()).thenReturn(pomPath);
when(project.getPom()).thenReturn(pom);
when(project.getRootPath()).thenReturn(mock(Path.class));
when(pomPath.getFileName()).thenReturn("pom.xml");
when(context.getActiveProject()).thenReturn(project);
}
protected void constructProjectScreenPresenter(final KieProject project) {
doAnswer(invocationOnMock -> {
((ParameterizedCommand<GAVPreferences>) invocationOnMock.getArguments()[1]).execute(gavPreferences);
return null;
}).when(gavPreferences).load(any(PreferenceScopeResolutionStrategyInfo.class),
any(ParameterizedCommand.class),
any(ParameterizedCommand.class));
presenter = new ProjectScreenPresenter(view,
context,
new CallerMock<>(projectScreenService),
user,
notificationEvent,
mock(EventSourceMock.class),
mock(ProjectNameValidator.class),
mock(PlaceManager.class),
mock(BusyIndicatorView.class),
new CallerMock<>(mock(ValidationService.class)),
lockManagerInstanceProvider,
mock(EventSourceMock.class),
conflictingRepositoriesPopup,
copyPopUpPresenter,
renamePopUpPresenter,
deletePopUpPresenter,
savePopUpPresenter,
gavPreferences,
projectScopedResolutionStrategySupplier,
resourceTypeDefinitions,
buildExecutor) {
@Override
protected Pair<Collection<BuildOptionExtension>, Collection<BuildOptionExtension>> getBuildExtensions() {
//Do nothing. This method makes direct use of IOC and fails to be mocked
return new Pair<Collection<BuildOptionExtension>, Collection<BuildOptionExtension>>(Collections.EMPTY_LIST,
Collections.EMPTY_LIST);
}
@Override
protected void destroyExtensions(final Collection<BuildOptionExtension> extensions) {
//Do nothing. This method makes direct use of IOC and fails to be mocked
}
@Override
protected void setupPathToPomXML() {
//Stub the real implementation that makes direct use of IOC and fails to be mocked
observablePathToPomXML = new ObservablePathImpl().wrap(project.getPomXMLPath());
pathToPomXML = observablePathToPomXML;
}
};
}
}