PY-30032: Provide fixture names as arguments to tests

def test_sample(Fixture must be provided here):
    pass
This commit is contained in:
Ilya.Kazakevich
2018-05-30 01:38:45 +03:00
parent 8d58a795eb
commit 06166d1382
2 changed files with 47 additions and 0 deletions
@@ -67,6 +67,8 @@
<extendWordSelectionHandler implementation="com.jetbrains.python.editor.selectWord.PyCommaSelectionHandler"/>
<basicWordSelectionFilter implementation="com.jetbrains.python.editor.selectWord.PyBasicWordSelectionFilter"/>
<stripTrailingSpacesFilterFactory implementation="com.jetbrains.python.editor.PyStripTrailingSpacesFilterFactory"/>
<completion.contributor language="Python"
implementationClass="com.jetbrains.python.testing.pyTestFixtures.PyTestFixtureCompletionContributor"/>
<completion.contributor language="Python"
implementationClass="com.jetbrains.python.codeInsight.completion.PyKeywordCompletionContributor"/>
<completion.contributor language="Python"
@@ -0,0 +1,45 @@
package com.jetbrains.python.testing.pyTestFixtures
import com.intellij.codeInsight.completion.*
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.patterns.PlatformPatterns
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.util.ProcessingContext
import com.intellij.util.ThreeState
import com.jetbrains.python.PyNames
import com.jetbrains.python.codeInsight.completion.PythonLookupElement
import com.jetbrains.python.psi.PyParameterList
import com.jetbrains.python.psi.types.TypeEvalContext
import com.jetbrains.python.testing.PyTestFrameworkService
import com.jetbrains.python.testing.TestRunnerService
import com.jetbrains.python.testing.isTestElement
import icons.PythonIcons
private val pyTestName = PyTestFrameworkService.getSdkReadableNameByFramework(PyNames.PY_TEST)
private object PyTestFixtureCompletionProvider : CompletionProvider<CompletionParameters>() {
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext?, result: CompletionResultSet) {
val pyFunction = PsiTreeUtil.getParentOfType(parameters.position, PyParameterList::class.java)?.containingFunction ?: return
val module = ModuleUtilCore.findModuleForPsiElement(pyFunction) ?: return
val typeEvalContext = TypeEvalContext.userInitiated(pyFunction.project, pyFunction.containingFile)
if (TestRunnerService.getInstance(module).projectConfiguration != pyTestName) {
return
}
val usedParams = pyFunction.getParameters(typeEvalContext).mapNotNull { it.name }.toSet()
if (isTestElement(pyFunction, ThreeState.UNSURE, typeEvalContext)) {
getFixtures(module).map { it.name }.filter { !usedParams.contains(it) }.forEach {
result.addElement(PythonLookupElement(it, false, PythonIcons.Python.Function))
}
}
}
}
/**
* Provide pytest fixtures are possible arguments for tests
*/
class PyTestFixtureCompletionContributor : CompletionContributor() {
init {
extend(CompletionType.BASIC, PlatformPatterns.psiElement().inside(PyParameterList::class.java), PyTestFixtureCompletionProvider)
}
}