/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* - Mickael Istria (Red Hat Inc.) - initial implementation
*******************************************************************************/
package org.eclipse.thym.ui.importer.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.tools.ant.taskdefs.Expand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.thym.core.HybridProject;
import org.eclipse.thym.internal.ui.importer.CordovaProjectConfigurator;
import org.eclipse.ui.internal.wizards.datatransfer.SmartImportJob;
import org.eclipse.ui.wizards.datatransfer.ProjectConfigurator;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
public class ImportTest {
@Test
public void test() throws Exception {
ReadableByteChannel channel = null;
try {
channel = Channels.newChannel(new URL("https://github.com/apache/cordova-app-hello-world/archive/master.zip").openStream()); //$NON-NLS-1$
} catch (IOException ex) {
Assume.assumeNoException("This test require ability to connect to Internet", ex); //$NON-NLS-1$
}
File outputFile = File.createTempFile("cordova-app-hello-world", ".zip"); //$NON-NLS-1$ //$NON-NLS-2$
FileOutputStream fos = new FileOutputStream(outputFile);
fos.getChannel().transferFrom(channel, 0, Long.MAX_VALUE);
channel.close();
fos.close();
Expand expand = new Expand();
expand.setSrc(outputFile);
File outputDirectory = Files.createTempDirectory("cordova-app-hello-world").toFile(); //$NON-NLS-1$
expand.setDest(outputDirectory);
expand.execute();
outputFile.delete();
Set<IProject> newProjects = null;
SmartImportJob job = new SmartImportJob(outputDirectory, Collections.EMPTY_SET, true, true);
try {
Map<File, List<ProjectConfigurator>> proposals = job.getImportProposals(new NullProgressMonitor());
Assert.assertEquals("Expected only 1 project to import", 1, proposals.size()); //$NON-NLS-1$
boolean thymConfiguratorFound = false;
for (ProjectConfigurator configurator : proposals.values().iterator().next()) {
if (configurator instanceof CordovaProjectConfigurator) {
thymConfiguratorFound = true;
}
}
Assert.assertTrue("Cordova configurator not found while checking directory", thymConfiguratorFound); //$NON-NLS-1$
// accept proposals
job.setDirectoriesToImport(proposals.keySet());
IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
Set<IProject> beforeImport = new HashSet<>(Arrays.asList(wsRoot.getProjects()));
job.run(new NullProgressMonitor());
job.join();
newProjects = new HashSet<>(Arrays.asList(wsRoot.getProjects()));
newProjects.removeAll(beforeImport);
Assert.assertEquals("Expected only 1 new project", 1, newProjects.size()); //$NON-NLS-1$
IProject newProject = newProjects.iterator().next();
boolean startsWith = newProject.getLocation().toFile().getAbsolutePath().startsWith(outputDirectory.toPath().toRealPath().toAbsolutePath().toString());
Assert.assertTrue(startsWith);
HybridProject hybridProject = HybridProject.getHybridProject(newProject);
Assert.assertNotNull("Project not configured as hybrid", hybridProject); //$NON-NLS-1$
} finally {
if (newProjects != null) {
for (IProject project : newProjects) {
project.delete(true, true, new NullProgressMonitor());
}
}
}
}
}