@@ -9,6 +9,7 @@ import com.intellij.diff.DiffManagerEx
9
9
import com.intellij.diff.requests.SimpleDiffRequest
10
10
import com.intellij.ide.BrowserUtil
11
11
import com.intellij.openapi.application.ApplicationManager
12
+ import com.intellij.openapi.application.runInEdt
12
13
import com.intellij.openapi.fileEditor.FileEditorManager
13
14
import com.intellij.openapi.project.Project
14
15
import com.intellij.openapi.project.guessProjectDir
@@ -53,6 +54,7 @@ import software.aws.toolkits.jetbrains.core.AwsClientManager
53
54
import software.aws.toolkits.jetbrains.core.coroutines.EDT
54
55
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
55
56
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
57
+ import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
56
58
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
57
59
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
58
60
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
@@ -92,12 +94,14 @@ import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTri
92
94
import software.aws.toolkits.jetbrains.services.cwc.editor.context.file.FileContext
93
95
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
94
96
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
97
+ import software.aws.toolkits.jetbrains.ui.feedback.TestGenFeedbackDialog
95
98
import software.aws.toolkits.jetbrains.utils.notifyError
96
99
import software.aws.toolkits.resources.message
97
100
import software.aws.toolkits.telemetry.AmazonqTelemetry
98
101
import software.aws.toolkits.telemetry.FeatureId
99
102
import software.aws.toolkits.telemetry.InteractionType
100
103
import software.aws.toolkits.telemetry.MetricResult
104
+ import software.aws.toolkits.telemetry.Status
101
105
import software.aws.toolkits.telemetry.UiTelemetry
102
106
import java.io.File
103
107
import java.nio.file.Files
@@ -167,13 +171,14 @@ class CodeTestChatController(
167
171
override suspend fun processStartTestGen (message : IncomingCodeTestMessage .StartTestGen ) {
168
172
codeTestChatHelper.setActiveCodeTestTabId(message.tabId)
169
173
val session = codeTestChatHelper.getActiveSession()
174
+ if (session.isGeneratingTests) {
175
+ return
176
+ }
177
+ sessionCleanUp(session.tabId)
170
178
// check if IDE has active file open, yes return (fileName and filePath) else return null
171
179
val project = context.project
172
180
val fileInfo = checkActiveFileInIDE(project, message) ? : return
173
181
session.programmingLanguage = fileInfo.fileLanguage
174
- if (session.isGeneratingTests == = true ) {
175
- return
176
- }
177
182
session.startTimeOfTestGeneration = Instant .now().toEpochMilli().toDouble()
178
183
session.isGeneratingTests = true
179
184
@@ -310,7 +315,8 @@ class CodeTestChatController(
310
315
credentialStartUrl = getStartUrl(project),
311
316
result = MetricResult .Succeeded ,
312
317
perfClientLatency = (Instant .now().toEpochMilli() - session.startTimeOfTestGeneration),
313
- requestId = id
318
+ requestId = id,
319
+ status = Status .ACCEPTED ,
314
320
)
315
321
}
316
322
session.isGeneratingTests = false
@@ -563,7 +569,7 @@ class CodeTestChatController(
563
569
session.linesOfCodeGenerated = lineDifference.coerceAtLeast(0 )
564
570
session.charsOfCodeGenerated = charDifference.coerceAtLeast(0 )
565
571
session.latencyOfTestGeneration = (Instant .now().toEpochMilli() - session.startTimeOfTestGeneration)
566
- UiTelemetry .click(null as Project ? , " unitTestGeneration_viewDiff" )
572
+ UiTelemetry .click(context.project , " unitTestGeneration_viewDiff" )
567
573
568
574
val buttonList = mutableListOf<Button >()
569
575
buttonList.add(
@@ -661,7 +667,7 @@ class CodeTestChatController(
661
667
testGenerationEventResponse.responseMetadata().requestId()} "
662
668
}
663
669
664
- UiTelemetry .click(null as Project ? , " unitTestGeneration_acceptDiff" )
670
+ UiTelemetry .click(context.project , " unitTestGeneration_acceptDiff" )
665
671
666
672
AmazonqTelemetry .utgGenerateTests(
667
673
cwsprChatProgrammingLanguage = session.programmingLanguage.languageId,
@@ -683,16 +689,17 @@ class CodeTestChatController(
683
689
artifactsUploadDuration = session.artifactUploadDuration,
684
690
buildPayloadBytes = session.srcPayloadSize,
685
691
buildZipFileBytes = session.srcZipFileSize,
686
- requestId = session.startTestGenerationRequestId
692
+ requestId = session.startTestGenerationRequestId,
693
+ status = Status .ACCEPTED ,
687
694
)
688
695
codeTestChatHelper.addAnswer(
689
696
CodeTestChatMessageContent (
690
697
message = message(" testgen.message.success" ),
691
698
type = ChatMessageType .Answer ,
692
- canBeVoted = false
699
+ canBeVoted = false ,
700
+ buttons = this .showFeedbackButton()
693
701
)
694
702
)
695
- sessionCleanUp(session.tabId)
696
703
codeTestChatHelper.updateUI(
697
704
promptInputDisabledState = false ,
698
705
promptInputPlaceholder = message(" testgen.placeholder.enter_slash_quick_actions" ),
@@ -838,7 +845,8 @@ class CodeTestChatController(
838
845
CodeTestChatMessageContent (
839
846
message = message(" testgen.message.success" ),
840
847
type = ChatMessageType .Answer ,
841
- canBeVoted = false
848
+ canBeVoted = false ,
849
+ buttons = this .showFeedbackButton()
842
850
)
843
851
)
844
852
val testGenerationEventResponse = client.sendTestGenerationEvent(
@@ -879,9 +887,13 @@ class CodeTestChatController(
879
887
artifactsUploadDuration = session.artifactUploadDuration,
880
888
buildPayloadBytes = session.srcPayloadSize,
881
889
buildZipFileBytes = session.srcZipFileSize,
882
- requestId = session.startTestGenerationRequestId
890
+ requestId = session.startTestGenerationRequestId,
891
+ status = Status .REJECTED ,
883
892
)
884
- sessionCleanUp(message.tabId)
893
+ }
894
+ " utg_feedback" -> {
895
+ sendFeedback()
896
+ UiTelemetry .click(context.project, " unitTestGeneration_provideFeedback" )
885
897
}
886
898
" utg_skip_and_finish" -> {
887
899
codeTestChatHelper.addAnswer(
@@ -1370,6 +1382,33 @@ class CodeTestChatController(
1370
1382
println (message)
1371
1383
}
1372
1384
1385
+ private fun sendFeedback () {
1386
+ runInEdt {
1387
+ TestGenFeedbackDialog (
1388
+ context.project,
1389
+ codeTestChatHelper.getActiveSession().startTestGenerationRequestId,
1390
+ codeTestChatHelper.getActiveSession().testGenerationJob
1391
+ ).show()
1392
+ }
1393
+ }
1394
+
1395
+ private fun showFeedbackButton (): MutableList <Button > {
1396
+ val buttonList = mutableListOf<Button >()
1397
+ if (isInternalUser(getStartUrl(context.project))) {
1398
+ buttonList.add(
1399
+ Button (
1400
+ " utg_feedback" ,
1401
+ message(" testgen.button.feedback" ),
1402
+ keepCardAfterClick = true ,
1403
+ position = " outside" ,
1404
+ status = " info" ,
1405
+ icon = " comment"
1406
+ ),
1407
+ )
1408
+ }
1409
+ return buttonList
1410
+ }
1411
+
1373
1412
companion object {
1374
1413
private val LOG = getLogger<CodeTestChatController >()
1375
1414
0 commit comments