Skip to content

Commit a086199

Browse files
IlyaMuravjovVassiliy-Kudryashov
authored andcommitted
Implement search for all @configuration classes in Spring project #1921 (#1934)
1 parent e6b1a59 commit a086199

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/models/BaseTestModel.kt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
package org.utbot.intellij.plugin.models
22

33
import com.intellij.openapi.module.Module
4+
import com.intellij.openapi.module.ModuleManager
45
import com.intellij.openapi.module.ModuleUtil
56
import com.intellij.openapi.project.Project
7+
import com.intellij.openapi.roots.TestModuleProperties
68
import com.intellij.openapi.vfs.VirtualFile
79
import com.intellij.openapi.vfs.newvfs.impl.FakeVirtualFile
10+
import com.intellij.psi.JavaPsiFacade
811
import com.intellij.psi.PsiClass
12+
import com.intellij.psi.search.GlobalSearchScope
13+
import com.intellij.psi.search.ProjectScope
14+
import com.intellij.psi.search.searches.AnnotatedElementsSearch
915
import org.jetbrains.kotlin.idea.core.getPackage
16+
import org.jetbrains.kotlin.idea.search.allScope
1017
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
18+
import org.jetbrains.kotlin.idea.util.rootManager
19+
import org.jetbrains.kotlin.idea.util.sourceRoot
1120
import org.utbot.framework.plugin.api.CodegenLanguage
1221
import org.utbot.intellij.plugin.ui.utils.ITestSourceRoot
22+
import org.utbot.intellij.plugin.ui.utils.getSortedTestRoots
1323
import org.utbot.intellij.plugin.ui.utils.isBuildWithGradle
1424
import org.utbot.intellij.plugin.ui.utils.suitableTestSourceRoots
1525

@@ -56,6 +66,51 @@ open class BaseTestsModel(
5666
}
5767
}
5868

69+
fun getSortedTestRoots(): MutableList<ITestSourceRoot> = getSortedTestRoots(
70+
getAllTestSourceRoots(),
71+
sourceRootHistory,
72+
srcModule.rootManager.sourceRoots.map { file: VirtualFile -> file.toNioPath().toString() },
73+
codegenLanguage
74+
)
75+
76+
/**
77+
* Searches configuration classes in Spring application.
78+
*
79+
* Classes are selected and sorted in the following order:
80+
* - Classes marked with `@TestConfiguration` annotation
81+
* - Classes marked with `@Configuration` annotation
82+
* - firstly, from test source roots (in the order provided by [getSortedTestRoots])
83+
* - after that, from source roots
84+
*/
85+
fun getSortedSpringConfigurationClasses(): List<PsiClass> {
86+
val testRootToIndex = getSortedTestRoots().withIndex().associate { (i, root) -> root.dir to i }
87+
88+
// Not using `srcModule.testModules(project)` here because it returns
89+
// test modules for dependent modules if no test roots are found in the source module itself.
90+
// We don't want to search configurations there because they seem useless.
91+
val testModules = ModuleManager.getInstance(project)
92+
.modules
93+
.filter { module -> TestModuleProperties.getInstance(module).productionModule == srcModule }
94+
95+
val searchScope = testModules.fold(GlobalSearchScope.moduleScope(srcModule)) { accScope, module ->
96+
accScope.union(GlobalSearchScope.moduleScope(module))
97+
}
98+
99+
val annotationClasses = listOf(
100+
"org.springframework.boot.test.context.TestConfiguration",
101+
"org.springframework.context.annotation.Configuration"
102+
).mapNotNull {
103+
JavaPsiFacade.getInstance(project).findClass(it, project.allScope())
104+
}
105+
106+
return annotationClasses.flatMap { annotation ->
107+
AnnotatedElementsSearch
108+
.searchPsiClasses(annotation, searchScope)
109+
.findAll()
110+
.sortedBy { testRootToIndex[it.containingFile.sourceRoot] ?: Int.MAX_VALUE }
111+
}
112+
}
113+
59114
fun updateSourceRootHistory(path: String) {
60115
sourceRootHistory.apply {
61116
remove(path)//Remove existing entry if any

utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/ui/components/TestFolderComboWithBrowseButton.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,10 @@ import com.intellij.util.ui.UIUtil
1717
import java.io.File
1818
import javax.swing.DefaultComboBoxModel
1919
import javax.swing.JList
20-
import org.jetbrains.kotlin.idea.util.rootManager
2120
import org.utbot.common.PathUtil
2221
import org.utbot.intellij.plugin.models.BaseTestsModel
2322
import org.utbot.intellij.plugin.ui.utils.ITestSourceRoot
2423
import org.utbot.intellij.plugin.ui.utils.addDedicatedTestRoot
25-
import org.utbot.intellij.plugin.ui.utils.getSortedTestRoots
2624
import org.utbot.intellij.plugin.ui.utils.isBuildWithGradle
2725

2826
private const val SET_TEST_FOLDER = "set test folder"
@@ -58,12 +56,7 @@ class TestFolderComboWithBrowseButton(private val model: BaseTestsModel) :
5856
}
5957
}
6058

61-
val testRoots = getSortedTestRoots(
62-
model.getAllTestSourceRoots(),
63-
model.sourceRootHistory,
64-
model.srcModule.rootManager.sourceRoots.map { file: VirtualFile -> file.toNioPath().toString() },
65-
model.codegenLanguage
66-
)
59+
val testRoots = model.getSortedTestRoots()
6760

6861
// this method is blocked for Gradle, where multiple test modules can exist
6962
model.testModule.addDedicatedTestRoot(testRoots, model.codegenLanguage)

0 commit comments

Comments
 (0)