package org.jboss.tools.maven.ui.bot.test.conversion;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerReqType;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement.JBossServer;
import org.jboss.reddeer.common.exception.WaitTimeoutExpiredException;
import org.jboss.reddeer.common.logging.Logger;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.core.condition.JobIsRunning;
import org.jboss.reddeer.core.condition.ShellWithTextIsActive;
import org.jboss.reddeer.eclipse.condition.ProblemExists;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.ui.perspectives.JavaEEPerspective;
import org.jboss.reddeer.eclipse.ui.problems.ProblemsView;
import org.jboss.reddeer.eclipse.ui.problems.ProblemsView.ProblemType;
import org.jboss.reddeer.junit.requirement.inject.InjectRequirement;
import org.jboss.reddeer.requirements.openperspective.OpenPerspectiveRequirement.OpenPerspective;
import org.jboss.reddeer.requirements.server.ServerReqState;
import org.jboss.reddeer.swt.api.TreeItem;
import org.jboss.reddeer.swt.condition.WidgetIsEnabled;
import org.jboss.reddeer.swt.exception.SWTLayerException;
import org.jboss.reddeer.swt.impl.button.CheckBox;
import org.jboss.reddeer.swt.impl.button.PushButton;
import org.jboss.reddeer.swt.impl.combo.LabeledCombo;
import org.jboss.reddeer.swt.impl.ctab.DefaultCTabItem;
import org.jboss.reddeer.swt.impl.link.AnchorLink;
import org.jboss.reddeer.swt.impl.link.DefaultLink;
import org.jboss.reddeer.swt.impl.menu.ContextMenu;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.reddeer.swt.impl.tab.DefaultTabItem;
import org.jboss.reddeer.swt.impl.table.DefaultTable;
import org.jboss.reddeer.swt.impl.text.LabeledText;
import org.jboss.reddeer.swt.impl.tree.DefaultTree;
import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem;
import org.jboss.reddeer.workbench.impl.editor.DefaultEditor;
import org.jboss.tools.maven.reddeer.requirement.NewRepositoryRequirement.DefineMavenRepository;
import org.jboss.tools.maven.reddeer.requirement.NewRepositoryRequirement.MavenRepository;
import org.jboss.tools.maven.reddeer.requirement.NewRepositoryRequirement.PredefinedMavenRepository;
import org.jboss.tools.maven.ui.bot.test.AbstractMavenSWTBotTest;
import org.junit.After;
import org.junit.Test;
@OpenPerspective(JavaEEPerspective.class)
@JBossServer(state=ServerReqState.PRESENT, type=ServerReqType.WILDFLY8x)
@DefineMavenRepository(
predefinedRepositories = {
@PredefinedMavenRepository(ID="jboss-public-repository",snapshots=true) },
newRepositories = {
@MavenRepository(url="https://repository.jboss.org/maven2/", ID="jboss-maven-repository", snapshots=true)}
)
public class MavenConversionTest extends AbstractMavenSWTBotTest{
private static final Logger log = Logger.getLogger(MavenConversionTest.class);
public static final String WEB_PROJECT_NAME = "WebProject";
private List<String> expectedLibsKeep= new ArrayList<String>(
Arrays.asList("JRE","Maven Dependencies","Runtime"));
@InjectRequirement
private ServerRequirement sr;
@After
public void clean(){
deleteProjects(true);
}
@Test
public void deleteDependenciesAfterConversion(){
createWithRuntime();
new CheckBox("Delete original references from project").toggle(true);
finishConversionDialog();
checkProblemsAndResolve();
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.getProject(WEB_PROJECT_NAME).select();
new ContextMenu("Properties").select();
new DefaultShell("Properties for "+WEB_PROJECT_NAME);
new DefaultTreeItem("Java Build Path").select();
new DefaultTabItem("Libraries").activate();
List<TreeItem> it = new DefaultTree(1).getItems();
log.debug("Libraries found after conversion:");
for(TreeItem i: it){
log.debug(" "+i.getText());
}
assertTrue("project contains more libraries than expected",it.size()==2);
for(TreeItem i: it){
if(!(i.getText().contains("JRE") || i.getText().contains("Maven Dependencies"))){
fail("Some dependencies are missing after conversion");
}
}
new PushButton("OK").click();
new WaitWhile(new ShellWithTextIsActive("Properties for "+WEB_PROJECT_NAME),TimePeriod.NORMAL);
}
@Test
public void keepDependenciesAfterConversion(){
createWithRuntime();
new CheckBox("Delete original references from project").toggle(false);
finishConversionDialog();
checkProblemsAndResolve();
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.getProject(WEB_PROJECT_NAME).select();
new ContextMenu("Properties").select();
new DefaultShell("Properties for "+WEB_PROJECT_NAME);
new DefaultTreeItem("Java Build Path").select();
new DefaultTabItem("Libraries").activate();
List<TreeItem> it = new DefaultTree(1).getItems();
List<String> libs = new ArrayList<String>();
log.debug("Libraries found after conversion:");
for(TreeItem i: it){
String lib = i.getText();
log.debug(" "+lib);
libs.add(lib);
}
assertTrue("project contains more libraries than expected",libs.size()==3);
Collections.sort(libs);
Collections.sort(expectedLibsKeep);
for(int i=0;i<3;i++){
assertTrue("Missing library "+expectedLibsKeep.get(i)+" but was"+libs.get(i),
libs.get(i).contains(expectedLibsKeep.get(i)));
if(libs.get(i).contains("Runtime")){
assertTrue("Wrong runtime added after conversion",
libs.get(i).contains(sr.getRuntimeNameLabelText(sr.getConfig())));
}
}
new PushButton("OK").click();
new WaitWhile(new ShellWithTextIsActive("Properties for "+WEB_PROJECT_NAME),TimePeriod.NORMAL);
}
@Test
public void changeIdentifiedDependency(){
createWithRuntime();
new DefaultTable().getItem(1).doubleClick(2);
new DefaultShell("Edit dependency");
new LabeledText("Group Id:").setText("maven.conversion.test.groupID");
new LabeledText("Artifact Id").setText("maven.conversion.test.artifactID");
new LabeledText("Version:").setText("1.0.0");
new LabeledText("Classifier:").setText("b3");
new LabeledCombo("Type:").setSelection("rar");
new LabeledCombo("Scope:").setSelection("provided");
new CheckBox("Optional").toggle(true);
new PushButton("OK").click();
new DefaultShell("Convert to Maven Dependencies");
finishConversionDialog();
List<String> toCheck = new ArrayList<String>();
toCheck.add("<groupId>maven.conversion.test.groupID</groupId>");
toCheck.add("<artifactId>maven.conversion.test.artifactID</artifactId>");
toCheck.add("<version>1.0.0</version>");
toCheck.add("<classifier>b3</classifier>");
toCheck.add("<type>rar</type>");
toCheck.add("<scope>provided</scope>");
toCheck.add("<optional>true</optional>");
checkDependency(WEB_PROJECT_NAME, toCheck);
}
@Test
public void testAddRepositoryLinkInConversionWizard(){
createWithRuntime();
new DefaultTable().getItem(1).doubleClick(2);
new DefaultShell("Edit dependency");
new LabeledText("Group Id:").setText("antlr");
new LabeledText("Artifact Id").setText("antlr");
new LabeledText("Version:").setText("non-existing-version");
new LabeledCombo("Type:").setText("jar");
new PushButton("OK").click();
new DefaultShell("Convert to Maven Dependencies");
new AnchorLink("here").click();
boolean shellIsOpened = true;
try{
new DefaultShell("Maven Repositories");
} catch (SWTLayerException ex){
shellIsOpened = false;
}
if(shellIsOpened){
new PushButton("Cancel").click();
}
new PushButton("Skip Dependency Conversion").click();
new WaitWhile(new JobIsRunning(), TimePeriod.LONG);
if(!shellIsOpened){
fail("Shell Maven Repositories was not opened after clicking on 'here' link");
}
}
@Test
public void testRemoteRepositoriesLinkInConversionWizard(){
createWithRuntime();
new DefaultLink("Manage remote repositories used to identify dependencies.").click();
boolean shellIsOpened = true;
try{
new DefaultShell("Preferences (Filtered)");
} catch (SWTLayerException ex){
shellIsOpened = false;
}
if(shellIsOpened){
new PushButton("Cancel").click();
}
new PushButton("Skip Dependency Conversion").click();
new WaitWhile(new JobIsRunning(), TimePeriod.LONG);
if(!shellIsOpened){
fail("Shell Preferences was not opened after clicking on 'remote repositories' link");
}
}
private void createWithRuntime(){
ProjectExplorer pe = new ProjectExplorer();
pe.open();
createWebProject(WEB_PROJECT_NAME, sr.getRuntimeNameLabelText(sr.getConfig()), false);
pe.open();
pe.getProject(WEB_PROJECT_NAME).select();
new ContextMenu("Configure","Convert to Maven Project").select();
new DefaultShell("Create new POM");
new PushButton("Finish").click();
new DefaultShell("Convert to Maven Dependencies");
new WaitUntil(new WidgetIsEnabled(new PushButton("Finish")), TimePeriod.LONG);
}
private void checkDependency(String projectName, List<String> valuesToCheck){
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.getProject(projectName).getProjectItem("pom.xml").open();
new DefaultEditor("pom.xml");
new DefaultCTabItem("pom.xml").activate();
String text = new DefaultStyledText().getText();
for(String value: valuesToCheck){
assertTrue(text.contains(value));
}
}
private void checkProblemsAndResolve(){
new WaitUntil(new ProblemExists(ProblemType.ERROR),TimePeriod.NORMAL,false);
ProblemsView pw = new ProblemsView();
pw.open();
if(pw.getProblems(ProblemType.ERROR).size() > 0){
updateConf(WEB_PROJECT_NAME,true);
try{
new WaitWhile(new ProblemExists(ProblemType.ERROR));
} catch (WaitTimeoutExpiredException ex){
ex.addMessageDetail("Some problems still exist. Dependecies probably were not downloaded successfully");
throw ex;
}
}
}
private void finishConversionDialog(){
new WaitUntil(new WidgetIsEnabled(new PushButton("Finish")));
new PushButton("Finish").click();
int i =1;
while(i>0){
try{
new WaitUntil(new JobIsRunning());
} catch (WaitTimeoutExpiredException ex){
break;
}
new WaitWhile(new JobIsRunning(),TimePeriod.VERY_LONG);
}
}
}