Skip to content

Commit 94907d3

Browse files
Required libraries can be installed silently #492
1 parent 91b98d6 commit 94907d3

File tree

3 files changed

+103
-45
lines changed

3 files changed

+103
-45
lines changed

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -178,15 +178,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
178178

179179
// Configure notification urls callbacks
180180
TestsReportNotifier.urlOpeningListener.callbacks[TestReportUrlOpeningListener.mockitoSuffix]?.plusAssign {
181-
if (createMockFrameworkNotificationDialog() == Messages.YES) {
182-
configureMockFramework()
183-
}
181+
configureMockFramework()
184182
}
185183

186184
TestsReportNotifier.urlOpeningListener.callbacks[TestReportUrlOpeningListener.mockitoInlineSuffix]?.plusAssign {
187-
if (createStaticsMockingNotificationDialog() == Messages.YES) {
188-
configureStaticMocking()
189-
}
185+
configureStaticMocking()
190186
}
191187

192188
init()
@@ -610,29 +606,21 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
610606
//region configure frameworks
611607

612608
private fun configureTestFrameworkIfRequired() {
613-
val frameworkNotInstalled = !testFrameworks.item.isInstalled
614-
615-
if (frameworkNotInstalled && createTestFrameworkNotificationDialog() == Messages.YES) {
609+
if (!testFrameworks.item.isInstalled) {
616610
configureTestFramework()
617611
}
618612

619-
model.hasTestFrameworkConflict = TestFramework.allItems.count { it.isInstalled } > 1
613+
model.hasTestFrameworkConflict = TestFramework.allItems.count { it.isInstalled } > 1
620614
}
621615

622616
private fun configureMockFrameworkIfRequired() {
623-
val frameworkNotInstalled =
624-
mockStrategies.item != MockStrategyApi.NO_MOCKS && !MOCKITO.isInstalled
625-
626-
if (frameworkNotInstalled && createMockFrameworkNotificationDialog() == Messages.YES) {
617+
if (mockStrategies.item != MockStrategyApi.NO_MOCKS && !MOCKITO.isInstalled) {
627618
configureMockFramework()
628619
}
629620
}
630621

631622
private fun configureStaticMockingIfRequired() {
632-
val frameworkNotConfigured =
633-
staticsMocking.item != NoStaticMocking && !staticsMocking.item.isConfigured
634-
635-
if (frameworkNotConfigured && createStaticsMockingNotificationDialog() == Messages.YES) {
623+
if (staticsMocking.item != NoStaticMocking && !staticsMocking.item.isConfigured) {
636624
configureStaticMocking()
637625
}
638626
}
@@ -655,15 +643,6 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
655643
.onError { selectedTestFramework.isInstalled = false }
656644
}
657645

658-
private fun createTestFrameworkNotificationDialog() = Messages.showYesNoDialog(
659-
"""Selected test framework ${testFrameworks.item.displayName} is not installed into current module.
660-
|Would you like to install it now?""".trimMargin(),
661-
title,
662-
"Yes",
663-
"No",
664-
Messages.getQuestionIcon(),
665-
)
666-
667646
private fun configureMockFramework() {
668647
val selectedMockFramework = MOCKITO
669648

@@ -740,24 +719,6 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
740719
}
741720
}
742721

743-
private fun createMockFrameworkNotificationDialog() = Messages.showYesNoDialog(
744-
"""Mock framework ${MOCKITO.displayName} is not installed into current module.
745-
|Would you like to install it now?""".trimMargin(),
746-
title,
747-
"Yes",
748-
"No",
749-
Messages.getQuestionIcon(),
750-
)
751-
752-
private fun createStaticsMockingNotificationDialog() = Messages.showYesNoDialog(
753-
"""A framework ${MOCKITO.displayName} is not configured to mock static methods.
754-
|Would you like to configure it now?""".trimMargin(),
755-
title,
756-
"Yes",
757-
"No",
758-
Messages.getQuestionIcon(),
759-
)
760-
761722
//endregion
762723

763724
/**
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.utbot.intellij.plugin.util
2+
3+
import com.intellij.codeInsight.daemon.impl.quickfix.LocateLibraryDialog
4+
import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix
5+
import com.intellij.ide.JavaUiBundle
6+
import com.intellij.jarRepository.JarRepositoryManager
7+
import com.intellij.openapi.application.WriteAction
8+
import com.intellij.openapi.module.Module
9+
import com.intellij.openapi.project.Project
10+
import com.intellij.openapi.roots.DependencyScope
11+
import com.intellij.openapi.roots.ExternalLibraryDescriptor
12+
import com.intellij.openapi.roots.ModuleRootModificationUtil
13+
import com.intellij.openapi.roots.OrderRootType
14+
import com.intellij.openapi.roots.impl.IdeaProjectModelModifier
15+
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
16+
import com.intellij.openapi.roots.libraries.LibraryUtil
17+
import com.intellij.openapi.roots.libraries.ui.OrderRoot
18+
import com.intellij.openapi.ui.Messages
19+
import com.intellij.util.PathUtil
20+
import com.intellij.util.containers.ContainerUtil
21+
import java.util.stream.Collectors
22+
import org.jetbrains.concurrency.Promise
23+
import org.jetbrains.concurrency.rejectedPromise
24+
import org.jetbrains.concurrency.resolvedPromise
25+
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryDescription
26+
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
27+
import org.jetbrains.jps.model.library.JpsMavenRepositoryLibraryDescriptor
28+
29+
class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(project) {
30+
override fun addExternalLibraryDependency(
31+
modules: Collection<Module?>,
32+
descriptor: ExternalLibraryDescriptor,
33+
scope: DependencyScope
34+
): Promise<Void> {
35+
val defaultRoots = descriptor.libraryClassesRoots
36+
val classesRoots: List<String?>
37+
val firstModule = ContainerUtil.getFirstItem(modules)
38+
classesRoots = if (defaultRoots.isNotEmpty()) {
39+
LocateLibraryDialog(firstModule!!, defaultRoots, descriptor.presentableName).showAndGetResult()
40+
} else {
41+
val version = descriptor.preferredVersion
42+
val mavenCoordinates = descriptor.libraryGroupId + ":" +
43+
descriptor.libraryArtifactId + ":" +
44+
(version ?: RepositoryLibraryDescription.ReleaseVersionId)
45+
46+
val libraryProperties = RepositoryLibraryProperties(JpsMavenRepositoryLibraryDescriptor(mavenCoordinates))
47+
val roots = JarRepositoryManager.loadDependenciesModal(
48+
project,
49+
libraryProperties,
50+
false,
51+
false,
52+
null,
53+
null
54+
)
55+
if (roots.isEmpty()) {
56+
@Suppress("SpellCheckingInspection")
57+
Messages.showErrorDialog(
58+
project, JavaUiBundle.message("dialog.mesage.0.was.not.loaded", descriptor.presentableName),
59+
JavaUiBundle.message("dialog.title.failed.to.download.library")
60+
)
61+
return rejectedPromise()
62+
}
63+
roots.stream()
64+
.filter { root: OrderRoot -> root.type === OrderRootType.CLASSES }
65+
.map { root: OrderRoot ->
66+
PathUtil.getLocalPath(
67+
root.file
68+
)
69+
}
70+
.collect(Collectors.toList())
71+
}
72+
if (classesRoots.isNotEmpty()) {
73+
val libraryName = if (classesRoots.size > 1) descriptor.presentableName else null
74+
val urls = OrderEntryFix.refreshAndConvertToUrls(classesRoots)
75+
if (modules.size == 1) {
76+
ModuleRootModificationUtil.addModuleLibrary(firstModule!!, libraryName, urls, emptyList(), scope)
77+
} else {
78+
WriteAction.run<RuntimeException> {
79+
val library =
80+
LibraryUtil.createLibrary(
81+
LibraryTablesRegistrar.getInstance().getLibraryTable(project), descriptor.presentableName
82+
)
83+
val model = library.modifiableModel
84+
for (url in urls) {
85+
model.addRoot(url!!, OrderRootType.CLASSES)
86+
}
87+
model.commit()
88+
for (module in modules) {
89+
ModuleRootModificationUtil.addDependency(module!!, library, scope, false)
90+
}
91+
}
92+
}
93+
}
94+
return resolvedPromise()
95+
}
96+
}

utbot-intellij/src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<projectService serviceImplementation="org.utbot.intellij.plugin.settings.Settings" preload="true"/>
3434
<registryKey defaultValue="false" description="Enable editing Kotlin test files" key="kotlin.ultra.light.classes.empty.text.range"/>
3535
<postStartupActivity implementation="org.utbot.intellij.plugin.ui.GotItTooltipActivity"/>
36+
<projectModelModifier implementation="org.utbot.intellij.plugin.util.UtProjectModelModifier"/>
3637
</extensions>
3738

3839
<!-- Minimum and maximum build of IDE compatible with the plugin -->

0 commit comments

Comments
 (0)