tests for requirements.txt generation (PY-18847)

GitOrigin-RevId: c810bc697aed8d73a62eb6759d870831b840e90e
This commit is contained in:
Aleksei Kniazev
2020-02-24 22:36:13 +00:00
committed by intellij-monorepo-bot
parent 08a97b7b59
commit 432e9ff2b2
57 changed files with 284 additions and 0 deletions
@@ -0,0 +1,3 @@
import django as dj
import requests
import numpy
@@ -0,0 +1,3 @@
requests==2.22.0
Django==3.0.0
numpy==1.18.1
@@ -0,0 +1 @@
requests==2.21.0
@@ -0,0 +1,5 @@
import django
import requests
import Jinja2
import pandas
import cookiecutter
@@ -0,0 +1,5 @@
Django==3.0.0
requests==2.22.0
Jinja2==2.11.1
pandas==1.0.1
cookiecutter==1.7.0
@@ -0,0 +1,5 @@
Django
requests
Jinja2
pandas
cookiecutter
@@ -0,0 +1,5 @@
import django
import requests
import Jinja2
import pandas
import numpy
@@ -0,0 +1,5 @@
Django~=3.0.0
requests~=2.22.0
Jinja2~=2.11.1
pandas~=1.0.1
numpy~=1.18.1
@@ -0,0 +1,5 @@
Django
requests
Jinja2
pandas
numpy
@@ -0,0 +1,3 @@
# all the packages here match by version
requests==2.22.0
Django>=3.0.0
@@ -0,0 +1,3 @@
import django as dj
import requests
import numpy
@@ -0,0 +1,2 @@
-r base_requirements.txt
numpy==1.18.1
@@ -0,0 +1 @@
-r base_requirements.txt
@@ -0,0 +1,7 @@
# this does match the project imports
requests==2.22.0
Django>=3.0.0
# but this doesn't
pyplot
toml==0.10.0
pandas==1.0.1
@@ -0,0 +1,3 @@
import django as dj
import requests
import numpy
@@ -0,0 +1,3 @@
requests==2.22.0
Django>=3.0.0
numpy==1.18.1
@@ -0,0 +1 @@
-r base_requirements.txt
@@ -0,0 +1,2 @@
import django
import numpy
@@ -0,0 +1,5 @@
# This is a comment in requirements file
# One more
Django==3.0.0
# And another
numpy==1.18.1
@@ -0,0 +1,5 @@
# This is a comment in requirements file
requests==2.22.0
# One more
Django==3.0.0
# And another
@@ -0,0 +1,2 @@
import django
import numpy
@@ -0,0 +1,3 @@
-e .
Django==3.0.0
numpy==1.18.1
@@ -0,0 +1,2 @@
-e .
Django
@@ -0,0 +1,3 @@
import django
import numpy
import tox
@@ -0,0 +1,3 @@
Django==3.0.0
-e git+https://github.com/tox-dev/tox.git@fcba59158f853c4da38f164dbf8523b1aeb0fedf#egg=tox
numpy==1.18.1
@@ -0,0 +1,2 @@
Django
-e git+https://github.com/tox-dev/tox.git@fcba59158f853c4da38f164dbf8523b1aeb0fedf#egg=tox
@@ -0,0 +1,2 @@
import requests
import cookiecutter
@@ -0,0 +1,5 @@
--no-index
--find-links http://some.archives.com/archives
requests==2.22.0
--no-binary
cookiecutter==1.7.0
@@ -0,0 +1,4 @@
--no-index
--find-links http://some.archives.com/archives
requests
--no-binary
@@ -0,0 +1,3 @@
import django
import numpy
import requests
@@ -0,0 +1,3 @@
requests>=2.1.0
Django==3.0.0
numpy==1.18.1
@@ -0,0 +1 @@
requests>=2.1.0
@@ -0,0 +1,2 @@
import requests
import cookiecutter
@@ -0,0 +1,4 @@
requests==2.22.0 --global-option="--no-user-cfg" \
--install-option="--prefix='/usr/local'" \
--install-option="--no-compile"
cookiecutter==1.7.0
@@ -0,0 +1,3 @@
requests==2.22.0 --global-option="--no-user-cfg" \
--install-option="--prefix='/usr/local'" \
--install-option="--no-compile"
@@ -0,0 +1,2 @@
from django import apps
import requests
@@ -0,0 +1,2 @@
requests==2.22.0
Django==3.0.0
@@ -0,0 +1,5 @@
import django
import requests
import Jinja2
import pandas
import cookiecutter
@@ -0,0 +1,5 @@
Django
requests
Jinja2
pandas
cookiecutter
@@ -0,0 +1,4 @@
# these packages are not used in the project
requests==2.22.0
Django>=3.0.0
numpy
@@ -0,0 +1 @@
import cookiecutter
@@ -0,0 +1 @@
cookiecutter==1.7.0
@@ -0,0 +1 @@
-r base_requirements.txt
@@ -0,0 +1 @@
import requests
@@ -0,0 +1 @@
requests==2.22.0
@@ -0,0 +1,4 @@
python-dateutil==2.8.1
requests==2.22.0
six==1.14.0
toml==0.10.0
@@ -0,0 +1,5 @@
import django
import requests
import Jinja2
import pandas
import cookiecutter
@@ -0,0 +1,5 @@
Django
requests
Jinja2
pandas
cookiecutter
@@ -0,0 +1,5 @@
Django==3.0.0
requests==2.22.0
Jinja2==2.11.1
pandas==1.0.1
cookiecutter==1.7.0
@@ -0,0 +1,2 @@
import django
import requests
@@ -0,0 +1,2 @@
Django
-e /some/locations/we/dont/know
@@ -0,0 +1,2 @@
import django
import requests
@@ -0,0 +1,4 @@
Django==3.0.0
requests==2.22.0 --global-option="--no-user-cfg"\
--install-option="--prefix='/usr/local'"\
--install-option="--no-compile"
@@ -0,0 +1,4 @@
Django==2.0.0
requests==1.11.0 --global-option="--no-user-cfg" \
--install-option="--prefix='/usr/local'" \
--install-option="--no-compile"
@@ -0,0 +1,114 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.packaging
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.testFramework.registerServiceInstance
import com.jetbrains.python.fixtures.PyTestCase
import org.easymock.EasyMock
class PyRequirementsGenerationTest : PyTestCase() {
var oldPackageManagers: PyPackageManagers? = null
fun testNewFileGeneration() = doTest()
fun testNewFileWithoutVersion() = doTest(PyRequirementsVersionSpecifierType.NO_VERSION)
fun testAddMissingPackages() = doTest()
fun testAddMissingVersion() = doTest()
fun testStripVersion() = doTest(PyRequirementsVersionSpecifierType.NO_VERSION)
fun testAddVersionWithSpecifier() = doTest(PyRequirementsVersionSpecifierType.COMPATIBLE)
fun testKeepComments() = doTest()
fun testKeepMatchingVersion() = doTest()
fun testKeepFileInstallOptions() = doTest()
fun testKeepPackageInstallOptions() = doTest()
fun testKeepEditableFromVCS() = doTest()
fun testKeepEditableForSelf() = doTest()
fun testRemoveUnused() = doTest()
fun testUpdateVersionKeepInstallOptions() = doTest()
fun testCompatibleFileReference() = doTest()
fun testRedundantFileReference() = doTest()
fun testIncompatibleFileReference() = doTest()
fun testUnhandledLine() = doTest { (lines, unhandled, _) ->
assertSize(2, lines)
assertContainsElements(lines, "Django==3.0.0", "requests==2.22.0")
assertSize(1, unhandled)
assertContainsElements(unhandled, "-e /some/locations/we/dont/know")
}
private fun doTest(versionSpecifier: PyRequirementsVersionSpecifierType = PyRequirementsVersionSpecifierType.STRONG_EQ,
block: ((PyRequirementsAnalysisResult) -> Unit)? = null) {
val settings = PyPackageRequirementsSettings.getInstance(myFixture.module)
val oldRequirementsPath = settings.requirementsPath
val oldVersionSpecifier = settings.versionSpecifier
try {
overrideInstalledPackages(
"Django" to "3.0.0",
"requests" to "2.22.0",
"Jinja2" to "2.11.1",
"pandas" to "1.0.1" ,
"cookiecutter" to "1.7.0",
"numpy" to "1.18.1",
"tox" to "3.14.4"
)
settings.requirementsPath = "requirements.txt"
settings.versionSpecifier = versionSpecifier
val testName = getTestName(true)
myFixture.copyDirectoryToProject(testName, "")
myFixture.configureFromTempProjectFile(settings.requirementsPath)
if (block != null) {
block(prepareRequirementsText(myFixture.module, settings)!!)
}
else {
syncWithImports(myFixture.module)
myFixture.checkResultByFile("$testName/new_${settings.requirementsPath}")
}
}
finally {
settings.requirementsPath = oldRequirementsPath
settings.versionSpecifier = oldVersionSpecifier
}
}
override fun setUp() {
super.setUp()
oldPackageManagers = PyPackageManagers.getInstance()
}
override fun tearDown() {
try {
ApplicationManager.getApplication().registerServiceInstance(PyPackageManagers::class.java, oldPackageManagers!!)
}
catch (e: Throwable) {
addSuppressedException(e)
}
finally {
super.tearDown()
}
}
override fun getTestDataPath(): String = super.getTestDataPath() + "/requirement/generation"
private fun overrideInstalledPackages(vararg packages: Pair<String, String>) {
ApplicationManager.getApplication().registerServiceInstance(PyPackageManagers::class.java, MockPyPackageManagers(packages.toMap()))
}
private class MockPyPackageManagers(val packages: Map<String, String>) : PyPackageManagers() {
override fun forSdk(sdk: Sdk): PyPackageManager {
val packageManager = EasyMock.createMock<PyPackageManager>(PyPackageManager::class.java)
EasyMock
.expect(packageManager.packages)
.andReturn(packages.map { PyPackage(it.key, it.value, null, emptyList()) })
EasyMock.replay(packageManager)
return packageManager
}
override fun getManagementService(project: Project?, sdk: Sdk?) = throw UnsupportedOperationException()
override fun clearCache(sdk: Sdk): Unit = throw UnsupportedOperationException()
}
}