fun generateTests()

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
            }
        }
    }