Skip to content

Commit 1c410d5

Browse files
author
David Hasani
committed
feat(amazonq): allow users to skip tests
1 parent 0462723 commit 1c410d5

File tree

15 files changed

+129
-16
lines changed

15 files changed

+129
-16
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q Code Transformation: allow users to skip tests"
4+
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
667667
customerSelection.configurationFile,
668668
customerSelection.sourceJavaVersion,
669669
customerSelection.targetJavaVersion,
670+
customerSelection.skipTestsFlag
670671
),
671672
)
672673

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.Incoming
2626
import software.aws.toolkits.jetbrains.services.codemodernizer.session.ChatSessionStorage
2727
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getQTokenProvider
2828
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTransformAvailable
29+
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
2930
import java.util.concurrent.atomic.AtomicBoolean
3031

3132
private enum class CodeTransformMessageTypes(val type: String) {
@@ -35,6 +36,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
3536
CodeTransformStart("codetransform-start"),
3637
CodeTransformStop("codetransform-stop"),
3738
CodeTransformCancel("codetransform-cancel"),
39+
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
3840
CodeTransformNew("codetransform-new"),
3941
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
4042
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
@@ -64,6 +66,7 @@ class CodeTransformChatApp : AmazonQApp {
6466
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
6567
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
6668
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
69+
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
6770
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
6871
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
6972
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
@@ -153,6 +156,7 @@ class CodeTransformChatApp : AmazonQApp {
153156
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
154157
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
155158
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
159+
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
156160
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
157161
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
158162
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/InboundAppMessagesHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ interface InboundAppMessagesHandler {
1515

1616
suspend fun processCodeTransformStopAction(tabId: String)
1717

18+
suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests)
19+
1820
suspend fun processCodeTransformOpenTransformHub(message: IncomingCodeTransformMessage.CodeTransformOpenTransformHub)
1921

2022
suspend fun processCodeTransformOpenMvnBuild(message: IncomingCodeTransformMessage.CodeTransformOpenMvnBuild)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.constants
55

66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.vfs.VirtualFile
8+
import kotlinx.coroutines.selects.select
89
import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
910
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_PREREQUISITES
1011
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_ALLOW_S3_ACCESS
@@ -48,6 +49,13 @@ private val confirmUserSelectionButton = Button(
4849
id = CodeTransformButtonId.StartTransformation.id,
4950
)
5051

52+
private val confirmSkipTestsSelectionButton = Button(
53+
keepCardAfterClick = false,
54+
waitMandatoryFormItems = true,
55+
text = message("codemodernizer.chat.message.button.confirm"),
56+
id = CodeTransformButtonId.ConfirmSkipTests.id,
57+
)
58+
5159
private val openMvnBuildButton = Button(
5260
id = CodeTransformButtonId.OpenMvnBuild.id,
5361
text = message("codemodernizer.chat.message.button.view_build"),
@@ -134,6 +142,26 @@ private val selectTargetVersionFormItem = FormItem(
134142
)
135143
)
136144

145+
private val selectSkipTestsFlagFormItem = FormItem(
146+
id = CodeTransformFormItemId.SelectSkipTestsFlag.id,
147+
title = message("codemodernizer.chat.form.user_selection.item.choose_skip_tests_flag"),
148+
mandatory = true,
149+
options = listOf(
150+
FormItemOption(
151+
label = "Do not skip tests",
152+
value = "Do not skip tests",
153+
),
154+
FormItemOption(
155+
label = "Skip integration tests",
156+
value = "Skip integration tests",
157+
),
158+
FormItemOption(
159+
label = "Skip all tests",
160+
value = "Skip all tests",
161+
)
162+
)
163+
)
164+
137165
private fun getUserSelectionFormattedMarkdown(moduleName: String): String = """
138166
### ${message("codemodernizer.chat.prompt.title.details")}
139167
-------------
@@ -144,6 +172,13 @@ private fun getUserSelectionFormattedMarkdown(moduleName: String): String = """
144172
| **${message("codemodernizer.chat.prompt.label.target_version")}** | JDK17 |
145173
""".trimIndent()
146174

175+
private fun getUserSkipTestsFlagSelectionFormattedMarkdown(skipTestsSelection: String): String {
176+
// just for correct grammar
177+
var skipTestsText = skipTestsSelection
178+
if (skipTestsText == "Do not skip tests") skipTestsText = "not skip tests"
179+
return "Got it! Amazon Q will ${skipTestsText.lowercase()} when building your project."
180+
}
181+
147182
private fun getUserHilSelectionMarkdown(dependencyName: String, currentVersion: String, selectedVersion: String): String = """
148183
### ${message("codemodernizer.chat.prompt.title.dependency_details")}
149184
-------------
@@ -184,11 +219,28 @@ fun buildStartNewTransformFollowup(): CodeTransformChatMessageContent = CodeTran
184219
)
185220
)
186221

187-
fun buildAuthRestoredFollowup(): CodeTransformChatMessageContent = CodeTransformChatMessageContent(
188-
type = CodeTransformChatMessageType.FinalizedAnswer,
189-
followUps = listOf(
190-
startNewTransformFollowUp
222+
fun buildUserInputSkipTestsFlagChatIntroContent(): CodeTransformChatMessageContent {
223+
return CodeTransformChatMessageContent(
224+
message = message("codemodernizer.chat.message.skip_tests"),
225+
type = CodeTransformChatMessageType.FinalizedAnswer,
191226
)
227+
}
228+
229+
fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent {
230+
return CodeTransformChatMessageContent(
231+
message = message("codemodernizer.chat.form.user_selection.title"),
232+
buttons = listOf(
233+
confirmSkipTestsSelectionButton,
234+
cancelUserSelectionButton,
235+
),
236+
formItems = listOf(selectSkipTestsFlagFormItem),
237+
type = CodeTransformChatMessageType.FinalizedAnswer,
238+
)
239+
}
240+
241+
fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
242+
type = CodeTransformChatMessageType.Prompt,
243+
message = getUserSkipTestsFlagSelectionFormattedMarkdown(skipTestsSelection)
192244
)
193245

194246
fun buildUserInputChatContent(project: Project, validationResult: ValidationResult): CodeTransformChatMessageContent {

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTr
5454
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserCancelledChatContent
5555
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserHilSelection
5656
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputChatContent
57+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatContent
58+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatIntroContent
5759
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSelectionSummaryChatContent
60+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSkipTestsFlagSelectionChatContent
5861
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserStopTransformChatContent
5962
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.AuthenticationNeededExceptionMessage
6063
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessage
@@ -77,6 +80,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTrans
7780
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.toVirtualFile
7881
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.tryGetJdk
7982
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
83+
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
8084
import software.aws.toolkits.resources.message
8185
import software.aws.toolkits.telemetry.CodeTransformVCSViewerSrcComponents
8286

@@ -87,6 +91,7 @@ class CodeTransformChatController(
8791
private val authController = AuthController()
8892
private val messagePublisher = context.messagesFromAppToUi
8993
private val codeModernizerManager = CodeModernizerManager.getInstance(context.project)
94+
private var configurationFile: VirtualFile? = null
9095
private val codeTransformChatHelper = CodeTransformChatHelper(context.messagesFromAppToUi, chatSessionStorage)
9196
private val artifactHandler = ArtifactHandler(context.project, GumbyClient.getInstance(context.project))
9297
private val telemetry = CodeTransformTelemetryManager.getInstance(context.project)
@@ -207,28 +212,48 @@ class CodeTransformChatController(
207212
val moduleVirtualFile: VirtualFile = modulePath.toVirtualFile() as VirtualFile
208213
val moduleName = context.project.getModuleOrProjectNameForFile(moduleVirtualFile)
209214

215+
configurationFile = modulePath.toVirtualFile() as VirtualFile
216+
210217
codeTransformChatHelper.run {
211218
addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
212-
addNewMessage(buildCompileLocalInProgressChatContent())
219+
addNewMessage(buildUserInputSkipTestsFlagChatIntroContent())
220+
addNewMessage(buildUserInputSkipTestsFlagChatContent())
213221
}
222+
}
214223

215-
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
216-
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleVirtualFile, context.project)?.tryGetJdk(context.project)
217-
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
218-
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")
219-
224+
override suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests) {
225+
// should never happen since at this point user has already selected a module with a build file
226+
if (configurationFile == null) throw RuntimeException("No build file selected")
227+
val sourceJdk = getSourceJdk(configurationFile!!)
228+
val skipTestsFlag = when (message.skipTestsSelection) {
229+
"Do not skip tests" -> ""
230+
"Skip integration tests" -> "-DskipITs"
231+
"Skip all tests" -> "-DskipTests"
232+
else -> ""
233+
}
234+
codeTransformChatHelper.addNewMessage(buildUserSkipTestsFlagSelectionChatContent(message.skipTestsSelection))
220235
val selection = CustomerSelection(
221-
moduleVirtualFile,
236+
configurationFile!!,
222237
sourceJdk,
223-
JavaSdkVersion.JDK_17
238+
JavaSdkVersion.JDK_17,
239+
skipTestsFlag
224240
)
225241

226242
// Publish metric to capture user selection before local build starts
227243
telemetry.submitSelection("Confirm", selection)
228244

245+
codeTransformChatHelper.addNewMessage(buildCompileLocalInProgressChatContent())
229246
codeModernizerManager.runLocalMavenBuild(context.project, selection)
230247
}
231248

249+
private fun getSourceJdk(moduleConfigurationFile: VirtualFile): JavaSdkVersion {
250+
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
251+
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleConfigurationFile, context.project)?.tryGetJdk(context.project)
252+
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
253+
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")
254+
return sourceJdk
255+
}
256+
232257
private suspend fun handleMavenBuildResult(mavenBuildResult: MavenCopyCommandsResult) {
233258
if (mavenBuildResult == MavenCopyCommandsResult.Cancelled) {
234259
codeTransformChatHelper.updateLastPendingMessage(buildUserCancelledChatContent())

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/messages/CodeTransformMessage.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ sealed interface CodeTransformBaseMessage : AmazonQMessage
1818
enum class CodeTransformButtonId(val id: String) {
1919
StartTransformation("codetransform-input-confirm"),
2020
CancelTransformation("codetransform-input-cancel"),
21+
ConfirmSkipTests("codetransform-input-confirm-skip-tests"),
2122
StopTransformation("stop_transform"),
2223
OpenTransformationHub("open_transformation_hub"),
2324
OpenMvnBuild("open_mvn_build"),
@@ -32,6 +33,7 @@ enum class CodeTransformButtonId(val id: String) {
3233
enum class CodeTransformFormItemId(val id: String) {
3334
SelectModule("module"),
3435
SelectTargetVersion("targetVersion"),
36+
SelectSkipTestsFlag("skipTestsSelection"),
3537
DependencyVersion("dependencyVersion"),
3638
}
3739

@@ -81,6 +83,11 @@ sealed interface IncomingCodeTransformMessage : CodeTransformBaseMessage {
8183
@JsonProperty("tabID") val tabId: String,
8284
) : IncomingCodeTransformMessage
8385

86+
data class CodeTransformConfirmSkipTests(
87+
@JsonProperty("tabID") val tabId: String,
88+
val skipTestsSelection: String,
89+
) : IncomingCodeTransformMessage
90+
8491
data class CodeTransformOpenMvnBuild(
8592
@JsonProperty("tabID") val tabId: String,
8693
) : IncomingCodeTransformMessage

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ data class CodeModernizerSessionContext(
5353
val configurationFile: VirtualFile,
5454
val sourceJavaVersion: JavaSdkVersion,
5555
val targetJavaVersion: JavaSdkVersion,
56+
val skipTestsFlag: String,
5657
) {
5758
private val mapper = jacksonObjectMapper()
5859
private val ignoredDependencyFileExtensions = setOf(INVALID_SUFFIX_SHA, INVALID_SUFFIX_REPOSITORIES)
@@ -200,7 +201,7 @@ data class CodeModernizerSessionContext(
200201
val outputFile = createTemporaryZipFile { zip ->
201202
// 1) Manifest file
202203
val dependenciesRoot = if (depDirectory != null) "$ZIP_DEPENDENCIES_PATH/${depDirectory.name}" else null
203-
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot))
204+
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot, skipTestsFlag = skipTestsFlag))
204205
.byteInputStream()
205206
.use {
206207
zip.putNextEntry(Path(MANIFEST_PATH).toString(), it)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CustomerSelection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ import com.intellij.openapi.vfs.VirtualFile
99
data class CustomerSelection(
1010
val configurationFile: VirtualFile,
1111
val sourceJavaVersion: JavaSdkVersion,
12-
val targetJavaVersion: JavaSdkVersion
12+
val targetJavaVersion: JavaSdkVersion,
13+
val skipTestsFlag: String,
1314
)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ data class ZipManifest(
1515
val buildLogs: String = BUILD_LOG_PATH,
1616
val version: String = UPLOAD_ZIP_MANIFEST_VERSION.toString(),
1717
val hilCapabilities: List<String> = listOf(HIL_1P_UPGRADE_CAPABILITY),
18-
val transformCapabilities: List<String> = listOf(EXPLAINABILITY_V1)
18+
val transformCapabilities: List<String> = listOf(EXPLAINABILITY_V1),
19+
val skipTestsFlag: String = "",
1920
)

0 commit comments

Comments
 (0)