blob: 8dcc2ec69f6feeb407a69d98b353806efd581e99 [file] [log] [blame]
package com.jetbrains.env.python;
import com.google.common.collect.Sets;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.testFramework.UsefulTestCase;
import com.jetbrains.env.PyEnvTestCase;
import com.jetbrains.env.PyExecutionFixtureTestTask;
import com.jetbrains.env.PyTestTask;
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor;
import com.jetbrains.python.sdkTools.SdkCreationType;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* @author vlan
*/
public class PyPackagingTest extends PyEnvTestCase {
@Override
public void runPythonTest(PyTestTask testTask) {
if (UsefulTestCase.IS_UNDER_TEAMCITY && SystemInfo.isWindows) {
return; //Don't run under Windows as after deleting from created virtualenvs original interpreter got spoiled
}
super.runPythonTest(testTask);
}
public void testGetPackages() {
runPythonTest(new PyPackagingTestTask() {
@Override
public void runTestOn(String sdkHome) throws Exception {
final Sdk sdk = createTempSdk(sdkHome, SdkCreationType.EMPTY_SDK);
List<PyPackage> packages = null;
try {
packages = PyPackageManager.getInstance(sdk).getPackages(false);
}
catch (PyExternalProcessException e) {
final int retcode = e.getRetcode();
if (retcode != PyPackageManagerImpl.ERROR_NO_PIP && retcode != PyPackageManagerImpl.ERROR_NO_SETUPTOOLS) {
fail(String.format("Error for interpreter '%s': %s", sdk.getHomePath(), e.getMessage()));
}
}
if (packages != null) {
assertTrue(packages.size() > 0);
for (PyPackage pkg : packages) {
assertTrue(pkg.getName().length() > 0);
}
}
}
});
}
public void testCreateVirtualEnv() {
runPythonTest(new PyPackagingTestTask() {
@Override
public void runTestOn(String sdkHome) throws Exception {
final Sdk sdk = createTempSdk(sdkHome, SdkCreationType.EMPTY_SDK);
try {
final LanguageLevel languageLevel = PythonSdkType.getLanguageLevelForSdk(sdk);
// virtualenv >= 0.10 supports Python >= 2.6
if (languageLevel.isOlderThan(LanguageLevel.PYTHON26)) {
return;
}
final File tempDir = FileUtil.createTempDirectory(getTestName(false), null);
final File venvDir = new File(tempDir, "venv");
final String venvSdkHome = PyPackageManager.getInstance(sdk).createVirtualEnv(venvDir.toString(),
false);
final Sdk venvSdk = createTempSdk(venvSdkHome, SdkCreationType.EMPTY_SDK);
assertNotNull(venvSdk);
assertTrue(PythonSdkType.isVirtualEnv(venvSdk));
assertInstanceOf(PythonSdkFlavor.getPlatformIndependentFlavor(venvSdk.getHomePath()), VirtualEnvSdkFlavor.class);
final List<PyPackage> packages = PyPackageManager.getInstance(venvSdk).getPackages(false);
final PyPackage setuptools = findPackage("setuptools", packages);
assertNotNull(setuptools);
assertEquals("setuptools", setuptools.getName());
assertEquals(PyPackageManagerImpl.SETUPTOOLS_VERSION, setuptools.getVersion());
final PyPackage pip = findPackage("pip", packages);
assertNotNull(pip);
assertEquals("pip", pip.getName());
assertEquals(PyPackageManagerImpl.PIP_VERSION, pip.getVersion());
}
catch (IOException e) {
throw new RuntimeException(e);
}
catch (PyExternalProcessException e) {
throw new RuntimeException(String.format("Error for interpreter '%s': %s", sdk.getHomePath(), e.getMessage()), e);
}
}
});
}
public void testInstallPackage() {
runPythonTest(new PyPackagingTestTask() {
@Override
public void runTestOn(String sdkHome) throws Exception {
final Sdk sdk = createTempSdk(sdkHome, SdkCreationType.EMPTY_SDK);
try {
final File tempDir = FileUtil.createTempDirectory(getTestName(false), null);
final File venvDir = new File(tempDir, "venv");
final String venvSdkHome = PyPackageManager.getInstance(sdk).createVirtualEnv(venvDir.getPath(), false);
final Sdk venvSdk = createTempSdk(venvSdkHome, SdkCreationType.EMPTY_SDK);
assertNotNull(venvSdk);
final PyPackageManager manager = PyPackageManager.getInstance(venvSdk);
final List<PyPackage> packages1 = manager.getPackages(false);
// TODO: Install Markdown from a local file
manager.install(list(PyRequirement.fromString("Markdown<2.2"),
new PyRequirement("httplib2")), Collections.<String>emptyList());
final List<PyPackage> packages2 = manager.getPackages(false);
final PyPackage markdown2 = findPackage("Markdown", packages2);
assertNotNull(markdown2);
assertTrue(markdown2.isInstalled());
final PyPackage pip1 = findPackage("pip", packages1);
assertNotNull(pip1);
assertEquals("pip", pip1.getName());
assertEquals(PyPackageManagerImpl.PIP_VERSION, pip1.getVersion());
manager.uninstall(list(pip1));
final List<PyPackage> packages3 = manager.getPackages(false);
final PyPackage pip2 = findPackage("pip", packages3);
assertNull(pip2);
}
catch (PyExternalProcessException e) {
new RuntimeException(String.format("Error for interpreter '%s': %s", sdk.getHomePath(), e.getMessage()), e);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
@Nullable
private static PyPackage findPackage(String name, List<PyPackage> packages) {
for (PyPackage pkg : packages) {
if (name.equals(pkg.getName())) {
return pkg;
}
}
return null;
}
private static <T> List<T> list(T... xs) {
return Arrays.asList(xs);
}
private abstract static class PyPackagingTestTask extends PyExecutionFixtureTestTask {
@Override
public Set<String> getTags() {
return Sets.newHashSet("packaging");
}
}
}