[python] fix running intellij.python.community.services.systemPython

GitOrigin-RevId: 166a0991c7b5032a63efebad1eb078cc15540b46
This commit is contained in:
Vladimir.Koshelev
2025-09-30 18:46:16 +00:00
committed by intellij-monorepo-bot
parent 68caf2edce
commit 8a9a4a5eb8
5 changed files with 41 additions and 24 deletions
@@ -31,8 +31,6 @@
<orderEntry type="module" module-name="intellij.python.community.impl.installer" />
<orderEntry type="module" module-name="intellij.python.community.impl.venv" />
<orderEntry type="module" module-name="intellij.python.community.testFramework.testEnv" scope="TEST" />
<orderEntry type="library" scope="TEST" name="io.mockk" level="project" />
<orderEntry type="library" scope="TEST" name="io.mockk.jvm" level="project" />
<orderEntry type="module" module-name="intellij.platform.testFramework" scope="TEST" />
<orderEntry type="module" module-name="intellij.python.psi.impl" />
</component>
@@ -1,5 +1,4 @@
<idea-plugin>
<id>pycharm.systemPython.tests</id>
<dependencies>
<plugin id="com.intellij.modules.python"/>
@@ -4,4 +4,11 @@
<module name="intellij.python.community.junit5Tests.framework._test"/>
<module name="intellij.python.community.services.systemPython"/>
</dependencies>
<extensions defaultExtensionNs="com.intellij">
<applicationInitializedListener implementation="com.intellij.python.junit5Tests.env.systemPython.SystemPythonRootsFixer"/>
</extensions>
<extensions defaultExtensionNs="Pythonid">
<systemPythonProvider implementation="com.intellij.python.junit5Tests.env.systemPython.impl.EnvTestPythonProvider"/>
</extensions>
</idea-plugin>
@@ -28,9 +28,6 @@ import com.jetbrains.python.errorProcessing.MessageError
import com.jetbrains.python.getOrThrow
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
import com.jetbrains.python.venvReader.VirtualEnvReader
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
import kotlinx.coroutines.async
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.hasItem
@@ -38,6 +35,10 @@ import org.hamcrest.Matchers.not
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import com.intellij.platform.eel.EelApi
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.errorProcessing.PyResult
import java.nio.file.Path
import kotlin.io.path.deleteExisting
import kotlin.io.path.pathString
@@ -56,7 +57,7 @@ class SystemPythonServiceShowCaseTest {
val output = async {
(if (systemPython.languageLevel.isPy3K) process.stdout else process.stderr).readWholeText()
}
Assertions.assertEquals(0, process.exitCode.await(), "Wrong exit code")
Assertions.assertTrue(process.exitCode.await() == 0)
val versionString = PythonSdkFlavor.getLanguageLevelFromVersionStringStaticSafe(output.await())!!
Assertions.assertEquals(systemPython.languageLevel, versionString, "Wrong version")
}
@@ -91,32 +92,40 @@ class SystemPythonServiceShowCaseTest {
@Test
fun testRefresh(@TestDisposable disposable: Disposable): Unit = timeoutRunBlocking(10.minutes) {
val mockProvider = mockk<SystemPythonProvider>()
coEvery { mockProvider.findSystemPythons(any()) } returns Result.failure(MessageError("..."))
coEvery { mockProvider.uiCustomization } returns null
val provider = CountingTestProvider(Result.failure(MessageError("...")))
val sut = SystemPythonService()
// Warm up cache before registering test provider
sut.findSystemPythons()
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, mockProvider, disposable)
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, provider, disposable)
repeat(10) {
sut.findSystemPythons()
}
coVerify(exactly = 0) { mockProvider.findSystemPythons(any()) }
Assertions.assertTrue(provider.calls == 0, "Provider should not be called while cache is valid")
sut.findSystemPythons(forceRefresh = true)
coVerify(atLeast = 1) { mockProvider.findSystemPythons(any()) }
Assertions.assertTrue(provider.calls >= 1, "Provider should be called after force refresh")
}
@RegistryKey("python.system.refresh.minutes", "0")
@Test
fun testDisableCache(@TestDisposable disposable: Disposable): Unit = timeoutRunBlocking(10.minutes) {
val timesToRepeat = 5
val mockProvider = mockk<SystemPythonProvider>()
coEvery { mockProvider.findSystemPythons(any()) } returns Result.success(emptySet())
coEvery { mockProvider.uiCustomization } returns null
val provider = CountingTestProvider(Result.success(emptySet()))
val sut = SystemPythonServiceImpl(this)
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, mockProvider, disposable)
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, provider, disposable)
repeat(timesToRepeat) {
sut.findSystemPythons()
}
coVerify(exactly = timesToRepeat) { mockProvider.findSystemPythons(any()) }
Assertions.assertTrue(provider.calls == timesToRepeat)
}
private class CountingTestProvider(
private val result: PyResult<Set<PythonBinary>>,
override val uiCustomization: UICustomization? = null,
) : SystemPythonProvider {
var calls: Int = 0
override suspend fun findSystemPythons(eelApi: EelApi): PyResult<Set<PythonBinary>> {
calls++
return result
}
}
}
@@ -15,14 +15,13 @@ import com.intellij.testFramework.registerExtension
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.Result
import com.jetbrains.python.getOrThrow
import io.mockk.coEvery
import io.mockk.mockk
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import com.intellij.platform.eel.EelApi
import java.nio.file.Path
@PyEnvTestCase
@@ -50,11 +49,16 @@ class EnvProviderTest {
): Unit = timeoutRunBlocking {
val venvPython = createVenv(python, venvDir).getOrThrow()
val ui = UICustomization("myui")
val provider = mockk<SystemPythonProvider>()
coEvery { provider.findSystemPythons(any()) } returns Result.success(setOf(venvPython))
coEvery { provider.uiCustomization } returns ui
val provider = InlineTestProvider(setOf(venvPython), ui)
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, provider, disposable)
val python = SystemPythonService().findSystemPythons(forceRefresh = true).first { it.pythonBinary == venvPython }
assertEquals(ui, python.ui, "Wrong UI")
assertTrue(ui == python.ui, "Wrong UI")
}
private class InlineTestProvider(
private val pythons: Set<PythonBinary>,
override val uiCustomization: UICustomization?
) : SystemPythonProvider {
override suspend fun findSystemPythons(eelApi: EelApi) = Result.success(pythons)
}
}