/*
* Copyright 2017 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.tableeditor;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.resources.IFile;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.mockito.ArgumentMatchers;
import org.rf.ide.core.project.RobotProjectConfig;
import org.rf.ide.core.project.RobotProjectConfig.LibraryType;
import org.rf.ide.core.project.RobotProjectConfig.ReferencedLibrary;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModel;
import org.robotframework.ide.eclipse.main.plugin.model.RobotProject;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.project.LibrariesAutoDiscoverer;
import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.OnSaveLibrariesAutodiscoveryTrigger.DiscovererFactory;
import org.robotframework.red.junit.ProjectProvider;
import com.google.common.collect.Lists;
public class OnSaveLibrariesAutodiscoveryTriggerTest {
@ClassRule
public static ProjectProvider projectProvider = new ProjectProvider(OnSaveLibrariesAutodiscoveryTriggerTest.class);
private static RobotModel model = new RobotModel();
@BeforeClass
public static void beforeSuite() throws Exception {
projectProvider.createFile("suite_with_known_libraries.robot",
"*** Settings ***",
"Library known1",
"Library known2");
projectProvider.createFile("suite_with_unknown_library_1.robot",
"*** Settings ***",
"Library known1",
"Library unknown",
"Library known2");
projectProvider.createFile("suite_with_unknown_library_2.robot",
"*** Settings ***",
"Library unknown_2");
final ReferencedLibrary knownLib1 = ReferencedLibrary.create(LibraryType.PYTHON, "known1", "");
final LibrarySpecification knownLib1spec = new LibrarySpecification();
knownLib1spec.setName("known1");
final ReferencedLibrary knownLib2 = ReferencedLibrary.create(LibraryType.PYTHON, "known2", "");
final LibrarySpecification knownLib2spec = new LibrarySpecification();
knownLib2spec.setName("known2");
final Map<ReferencedLibrary, LibrarySpecification> libs = new HashMap<>();
libs.put(knownLib1, knownLib1spec);
libs.put(knownLib2, knownLib2spec);
final RobotProjectConfig config = new RobotProjectConfig();
config.addReferencedLibrary(knownLib1);
config.addReferencedLibrary(knownLib2);
projectProvider.configure(config);
final RobotProject robotProject = model.createRobotProject(projectProvider.getProject());
robotProject.setReferencedLibraries(libs);
robotProject.setStandardLibraries(new HashMap<String, LibrarySpecification>());
}
@AfterClass
public static void afterSuite() {
model = null;
}
@Test
public void autodiscovererIsNotStarted_whenSuiteDoesNotContainUnknownLibrary() {
turnOnAutoDiscoveringInProjectConfig();
final RobotSuiteFile suite = model.createSuiteFile(projectProvider.getFile("suite_with_known_libraries.robot"));
final LibrariesAutoDiscoverer discoverer = mock(LibrariesAutoDiscoverer.class);
final DiscovererFactory factory = mock(DiscovererFactory.class);
when(factory.create(any(RobotProject.class), ArgumentMatchers.<IFile> anyList())).thenReturn(discoverer);
final OnSaveLibrariesAutodiscoveryTrigger trigger = new OnSaveLibrariesAutodiscoveryTrigger(factory);
trigger.startLibrariesAutoDiscoveryIfRequired(suite);
verifyZeroInteractions(discoverer);
turnOffAutoDiscoveringInProjectConfig();
}
@Test
public void autodiscovererIsNotStarted_whenItIsDisabled() {
turnOffAutoDiscoveringInProjectConfig();
final RobotSuiteFile suite = model
.createSuiteFile(projectProvider.getFile("suite_with_unknown_library_1.robot"));
final LibrariesAutoDiscoverer discoverer = mock(LibrariesAutoDiscoverer.class);
final DiscovererFactory factory = mock(DiscovererFactory.class);
when(factory.create(any(RobotProject.class), ArgumentMatchers.<IFile> anyList())).thenReturn(discoverer);
final OnSaveLibrariesAutodiscoveryTrigger trigger = new OnSaveLibrariesAutodiscoveryTrigger(factory);
trigger.startLibrariesAutoDiscoveryIfRequired(suite);
verifyZeroInteractions(discoverer);
turnOnAutoDiscoveringInProjectConfig();
}
@Test
public void autodiscovererStarts_whenUnknownLibraryIsDetected() {
turnOnAutoDiscoveringInProjectConfig();
final RobotSuiteFile suite = model
.createSuiteFile(projectProvider.getFile("suite_with_unknown_library_1.robot"));
final LibrariesAutoDiscoverer discoverer = mock(LibrariesAutoDiscoverer.class);
final DiscovererFactory factory = mock(DiscovererFactory.class);
when(factory.create(any(RobotProject.class), ArgumentMatchers.<IFile> anyList())).thenReturn(discoverer);
final OnSaveLibrariesAutodiscoveryTrigger trigger = new OnSaveLibrariesAutodiscoveryTrigger(factory);
trigger.startLibrariesAutoDiscoveryIfRequired(suite);
final List<IFile> suites = Lists
.<IFile> newArrayList(projectProvider.getFile("suite_with_unknown_library_1.robot"));
verify(factory).create(any(RobotProject.class), eq(suites));
verify(discoverer).start();
verifyNoMoreInteractions(discoverer);
turnOffAutoDiscoveringInProjectConfig();
}
@Test
public void autodiscovererStartsOnlyOnce_whenMultipleTriggersExistButSaveAllIsDetected() {
turnOnAutoDiscoveringInProjectConfig();
final RobotSuiteFile suite1 = model
.createSuiteFile(projectProvider.getFile("suite_with_unknown_library_1.robot"));
final RobotSuiteFile suite2 = model
.createSuiteFile(projectProvider.getFile("suite_with_unknown_library_2.robot"));
final LibrariesAutoDiscoverer discoverer = mock(LibrariesAutoDiscoverer.class);
final DiscovererFactory factory = mock(DiscovererFactory.class);
when(factory.create(any(RobotProject.class), ArgumentMatchers.<IFile> anyList())).thenReturn(discoverer);
final OnSaveLibrariesAutodiscoveryTrigger trigger1 = new OnSaveLibrariesAutodiscoveryTrigger(factory);
final OnSaveLibrariesAutodiscoveryTrigger trigger2 = new OnSaveLibrariesAutodiscoveryTrigger(factory);
trigger1.preExecute(OnSaveLibrariesAutodiscoveryTrigger.SAVE_ALL_COMMAND_ID, new ExecutionEvent());
trigger2.preExecute(OnSaveLibrariesAutodiscoveryTrigger.SAVE_ALL_COMMAND_ID, new ExecutionEvent());
trigger1.startLibrariesAutoDiscoveryIfRequired(suite1);
trigger2.startLibrariesAutoDiscoveryIfRequired(suite2);
trigger1.postExecuteSuccess(OnSaveLibrariesAutodiscoveryTrigger.SAVE_ALL_COMMAND_ID, new Object());
trigger2.postExecuteSuccess(OnSaveLibrariesAutodiscoveryTrigger.SAVE_ALL_COMMAND_ID, new Object());
final List<IFile> suites = Lists.<IFile> newArrayList(
projectProvider.getFile("suite_with_unknown_library_1.robot"),
projectProvider.getFile("suite_with_unknown_library_2.robot"));
verify(factory).create(any(RobotProject.class), eq(suites));
verify(discoverer).start();
verifyNoMoreInteractions(discoverer);
turnOffAutoDiscoveringInProjectConfig();
}
private void turnOnAutoDiscoveringInProjectConfig() {
final RobotProjectConfig config = model.createRobotProject(projectProvider.getProject())
.getRobotProjectConfig();
config.setReferencedLibrariesAutoDiscoveringEnabled(true);
}
private void turnOffAutoDiscoveringInProjectConfig() {
final RobotProjectConfig config = model.createRobotProject(projectProvider.getProject())
.getRobotProjectConfig();
config.setReferencedLibrariesAutoDiscoveringEnabled(false);
}
}