Skip to content

Commit fa3dcf2

Browse files
authored
feat(amazonq): allow users to skip tests (#4887)
Prompt the user with a form asking them if they want us to skip integ tests or skip all tests when doing our server-side build. Pass the flag via the manifest.json.
1 parent e10d880 commit fa3dcf2

File tree

17 files changed

+150
-42
lines changed

17 files changed

+150
-42
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: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
112112
private val isJobSuccessfullyResumed = AtomicBoolean(false)
113113

114114
private val transformationStoppedByUsr = AtomicBoolean(false)
115-
private var codeTransformationSession: CodeModernizerSession? = null
115+
var codeTransformationSession: CodeModernizerSession? = null
116116
set(session) {
117117
if (session != null) {
118118
Disposer.register(this, session)
@@ -383,12 +383,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
383383
CodeTransformMessageListener.instance.onMavenBuildResult(mavenCopyCommandsResult)
384384
}
385385

386-
fun runLocalMavenBuild(project: Project, customerSelection: CustomerSelection) {
387-
// Create and set a session
388-
codeTransformationSession = null
389-
val session = createCodeModernizerSession(customerSelection, project)
390-
codeTransformationSession = session
391-
386+
fun runLocalMavenBuild(project: Project, session: CodeModernizerSession) {
392387
projectCoroutineScope(project).launch {
393388
isMvnRunning.set(true)
394389
val result = session.getDependenciesUsingMaven()
@@ -668,14 +663,16 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
668663
telemetry.totalRunTime(result.toString(), jobId)
669664
}
670665

671-
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) = CodeModernizerSession(
672-
CodeModernizerSessionContext(
673-
project,
674-
customerSelection.configurationFile,
675-
customerSelection.sourceJavaVersion,
676-
customerSelection.targetJavaVersion,
677-
),
678-
)
666+
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) {
667+
codeTransformationSession = CodeModernizerSession(
668+
CodeModernizerSessionContext(
669+
project,
670+
customerSelection.configurationFile,
671+
customerSelection.sourceJavaVersion,
672+
customerSelection.targetJavaVersion,
673+
),
674+
)
675+
}
679676

680677
fun showModernizationProgressUI() = codeModernizerBottomWindowPanelManager.showUnalteredJobUI()
681678

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
3535
CodeTransformStart("codetransform-start"),
3636
CodeTransformStop("codetransform-stop"),
3737
CodeTransformCancel("codetransform-cancel"),
38+
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
3839
CodeTransformNew("codetransform-new"),
3940
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
4041
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
@@ -64,6 +65,7 @@ class CodeTransformChatApp : AmazonQApp {
6465
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
6566
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
6667
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
68+
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
6769
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
6870
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
6971
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
@@ -153,6 +155,7 @@ class CodeTransformChatApp : AmazonQApp {
153155
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
154156
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
155157
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
158+
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
156159
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
157160
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
158161
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: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ private val confirmUserSelectionButton = Button(
4848
id = CodeTransformButtonId.StartTransformation.id,
4949
)
5050

51+
private val confirmSkipTestsSelectionButton = Button(
52+
keepCardAfterClick = false,
53+
waitMandatoryFormItems = true,
54+
text = message("codemodernizer.chat.message.button.confirm"),
55+
id = CodeTransformButtonId.ConfirmSkipTests.id,
56+
)
57+
5158
private val openMvnBuildButton = Button(
5259
id = CodeTransformButtonId.OpenMvnBuild.id,
5360
text = message("codemodernizer.chat.message.button.view_build"),
@@ -134,6 +141,22 @@ private val selectTargetVersionFormItem = FormItem(
134141
)
135142
)
136143

144+
private val selectSkipTestsFlagFormItem = FormItem(
145+
id = CodeTransformFormItemId.SelectSkipTestsFlag.id,
146+
title = message("codemodernizer.chat.form.user_selection.item.choose_skip_tests_option"),
147+
mandatory = true,
148+
options = listOf(
149+
FormItemOption(
150+
label = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
151+
value = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
152+
),
153+
FormItemOption(
154+
label = message("codemodernizer.chat.message.skip_tests_form.skip"),
155+
value = message("codemodernizer.chat.message.skip_tests_form.skip"),
156+
)
157+
)
158+
)
159+
137160
private fun getUserSelectionFormattedMarkdown(moduleName: String): String = """
138161
### ${message("codemodernizer.chat.prompt.title.details")}
139162
-------------
@@ -184,11 +207,26 @@ fun buildStartNewTransformFollowup(): CodeTransformChatMessageContent = CodeTran
184207
)
185208
)
186209

187-
fun buildAuthRestoredFollowup(): CodeTransformChatMessageContent = CodeTransformChatMessageContent(
188-
type = CodeTransformChatMessageType.FinalizedAnswer,
189-
followUps = listOf(
190-
startNewTransformFollowUp
210+
fun buildUserInputSkipTestsFlagChatIntroContent(): CodeTransformChatMessageContent =
211+
CodeTransformChatMessageContent(
212+
message = message("codemodernizer.chat.message.skip_tests"),
213+
type = CodeTransformChatMessageType.FinalizedAnswer,
191214
)
215+
216+
fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
217+
CodeTransformChatMessageContent(
218+
message = message("codemodernizer.chat.form.user_selection.title"),
219+
buttons = listOf(
220+
confirmSkipTestsSelectionButton,
221+
cancelUserSelectionButton,
222+
),
223+
formItems = listOf(selectSkipTestsFlagFormItem),
224+
type = CodeTransformChatMessageType.FinalizedAnswer,
225+
)
226+
227+
fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
228+
type = CodeTransformChatMessageType.FinalizedAnswer,
229+
message = message("codemodernizer.chat.message.skip_tests_form.response", skipTestsSelection.lowercase())
192230
)
193231

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

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

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTr
5555
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserCancelledChatContent
5656
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserHilSelection
5757
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputChatContent
58+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatContent
59+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatIntroContent
5860
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSelectionSummaryChatContent
61+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSkipTestsFlagSelectionChatContent
5962
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserStopTransformChatContent
6063
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.AuthenticationNeededExceptionMessage
6164
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessage
@@ -66,6 +69,8 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransfo
6669
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
6770
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason
6871
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
72+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_RUN_UNIT_TESTS
73+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_SKIP_UNIT_TESTS
6974
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
7075
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult
7176
import software.aws.toolkits.jetbrains.services.codemodernizer.model.UploadFailureReason
@@ -208,26 +213,47 @@ class CodeTransformChatController(
208213
val moduleVirtualFile: VirtualFile = modulePath.toVirtualFile() as VirtualFile
209214
val moduleName = context.project.getModuleOrProjectNameForFile(moduleVirtualFile)
210215

211-
codeTransformChatHelper.run {
212-
addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
213-
addNewMessage(buildCompileLocalInProgressChatContent())
214-
}
216+
codeTransformChatHelper.addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
215217

216-
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
217-
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleVirtualFile, context.project)?.tryGetJdk(context.project)
218-
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
219-
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")
218+
val sourceJdk = getSourceJdk(moduleVirtualFile)
220219

221220
val selection = CustomerSelection(
222221
moduleVirtualFile,
223222
sourceJdk,
224-
JavaSdkVersion.JDK_17
223+
JavaSdkVersion.JDK_17,
225224
)
226225

226+
// Create and set a session
227+
codeModernizerManager.createCodeModernizerSession(selection, context.project)
228+
227229
// Publish metric to capture user selection before local build starts
228230
telemetry.submitSelection("Confirm", selection)
229231

230-
codeModernizerManager.runLocalMavenBuild(context.project, selection)
232+
codeTransformChatHelper.run {
233+
addNewMessage(buildUserInputSkipTestsFlagChatIntroContent())
234+
addNewMessage(buildUserInputSkipTestsFlagChatContent())
235+
}
236+
}
237+
238+
override suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests) {
239+
val customBuildCommand = when (message.skipTestsSelection) {
240+
message("codemodernizer.chat.message.skip_tests_form.skip") -> MAVEN_BUILD_SKIP_UNIT_TESTS
241+
else -> MAVEN_BUILD_RUN_UNIT_TESTS
242+
}
243+
codeTransformChatHelper.addNewMessage(buildUserSkipTestsFlagSelectionChatContent(message.skipTestsSelection))
244+
codeTransformChatHelper.addNewMessage(buildCompileLocalInProgressChatContent())
245+
codeModernizerManager.codeTransformationSession?.let {
246+
it.sessionContext.customBuildCommand = customBuildCommand
247+
codeModernizerManager.runLocalMavenBuild(context.project, it)
248+
}
249+
}
250+
251+
private fun getSourceJdk(moduleConfigurationFile: VirtualFile): JavaSdkVersion {
252+
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
253+
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleConfigurationFile, context.project)?.tryGetJdk(context.project)
254+
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
255+
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: error("Unable to determine source JDK version")
256+
return sourceJdk
231257
}
232258

233259
private suspend fun handleMavenBuildResult(mavenBuildResult: MavenCopyCommandsResult) {

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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const val ZIP_SOURCES_PATH = "sources"
4444
const val ZIP_DEPENDENCIES_PATH = "dependencies"
4545
const val BUILD_LOG_PATH = "build-logs.txt"
4646
const val MAVEN_CONFIGURATION_FILE_NAME = "pom.xml"
47+
const val MAVEN_BUILD_RUN_UNIT_TESTS = "clean test"
48+
const val MAVEN_BUILD_SKIP_UNIT_TESTS = "clean test-compile"
4749
const val MAVEN_DEFAULT_BUILD_DIRECTORY_NAME = "target"
4850
const val IDEA_DIRECTORY_NAME = ".idea"
4951
const val INVALID_SUFFIX_SHA = "sha1"
@@ -53,6 +55,7 @@ data class CodeModernizerSessionContext(
5355
val configurationFile: VirtualFile,
5456
val sourceJavaVersion: JavaSdkVersion,
5557
val targetJavaVersion: JavaSdkVersion,
58+
var customBuildCommand: String = MAVEN_BUILD_RUN_UNIT_TESTS // run unit tests by default
5659
) {
5760
private val mapper = jacksonObjectMapper()
5861
private val ignoredDependencyFileExtensions = setOf(INVALID_SUFFIX_SHA, INVALID_SUFFIX_REPOSITORIES)
@@ -200,7 +203,7 @@ data class CodeModernizerSessionContext(
200203
val outputFile = createTemporaryZipFile { zip ->
201204
// 1) Manifest file
202205
val dependenciesRoot = if (depDirectory != null) "$ZIP_DEPENDENCIES_PATH/${depDirectory.name}" else null
203-
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot))
206+
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot, customBuildCommand = customBuildCommand))
204207
.byteInputStream()
205208
.use {
206209
zip.putNextEntry(Path(MANIFEST_PATH).toString(), it)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ 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,
1313
)

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 customBuildCommand: String = MAVEN_BUILD_RUN_UNIT_TESTS,
1920
)

0 commit comments

Comments
 (0)