in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt [482:575]
fun generateTests(
prompt: String,
codeTestChatHelper: CodeTestChatHelper,
previousIterationContext: PreviousUTGIterationContext?,
selectionRange: Range?,
): Job? {
val shouldStart = performTestGenPreChecks()
val session = codeTestChatHelper.getActiveSession()
if (!shouldStart) {
session.conversationState = ConversationState.IDLE
return null
}
beforeTestGenFlow(session)
return cs.launch {
try {
launchTestGenFlow(prompt, codeTestChatHelper, previousIterationContext, selectionRange)
} catch (e: Exception) {
// reset number of unitTestGenerated to null
session.numberOfUnitTestCasesGenerated = null
// Add an answer for displaying error message
val errorMessage = when {
e is CodeTestException &&
e.message?.startsWith("CreateTestJobError: Maximum") == true ->
message("testgen.error.maximum_generations_reach")
e is CodeTestException -> e.uiMessage
e is JsonParseException -> message("testgen.error.generic_technical_error_message")
else -> message("testgen.error.generic_error_message")
}
val buttonList = mutableListOf<Button>()
if (isInternalUser(getStartUrl(project))) {
buttonList.add(
Button(
"utg_feedback",
message("testgen.button.feedback"),
keepCardAfterClick = true,
position = "outside",
status = "info",
icon = "comment"
),
)
}
codeTestChatHelper.addAnswer(
CodeTestChatMessageContent(
message = errorMessage,
type = ChatMessageType.Answer,
canBeVoted = false,
buttons = buttonList
)
)
AmazonqTelemetry.utgGenerateTests(
cwsprChatProgrammingLanguage = session.programmingLanguage.languageId,
hasUserPromptSupplied = session.hasUserPromptSupplied,
isFileInWorkspace = true,
isSupportedLanguage = true,
credentialStartUrl = getStartUrl(project),
jobGroup = session.testGenerationJobGroupName,
jobId = session.testGenerationJob,
result = if (e.message == message("testgen.message.cancelled")) MetricResult.Cancelled else MetricResult.Failed,
reason = (e as? CodeTestException)?.code ?: "DefaultError",
reasonDesc = if (e.message == message("testgen.message.cancelled")) "${(e as? CodeTestException)?.code}: ${e.message}" else e.message,
perfClientLatency = (Instant.now().toEpochMilli() - session.startTimeOfTestGeneration),
isCodeBlockSelected = session.isCodeBlockSelected,
artifactsUploadDuration = session.artifactUploadDuration,
buildPayloadBytes = session.srcPayloadSize,
buildZipFileBytes = session.srcZipFileSize,
requestId = session.startTestGenerationRequestId,
status = if (e.message == message("testgen.message.cancelled")) Status.CANCELLED else Status.FAILED,
)
session.isGeneratingTests = false
} finally {
// Reset the flow if there is any error
if (!session.isGeneratingTests) {
codeTestChatHelper.updateUI(
promptInputProgress = cancellingProgressField
)
delay(1000)
codeTestChatHelper.sendUpdatePromptProgress(session.tabId, null)
codeTestChatHelper.deleteSession(session.tabId)
codeTestChatHelper.updateUI(
promptInputDisabledState = false,
promptInputPlaceholder = message("testgen.placeholder.enter_slash_quick_actions"),
)
}
session.isGeneratingTests = false
session.conversationState = ConversationState.IDLE
afterTestGenFlow()
// send message displaying card
}
}
}