Skip to content

Commit 0164a61

Browse files
committed
add a listner in cofig
1 parent 51c66f0 commit 0164a61

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import software.aws.toolkits.core.utils.debug
2222
import software.aws.toolkits.core.utils.getLogger
2323
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
2424
import software.aws.toolkits.jetbrains.services.amazonq.calculateIfIamIdentityCenterConnection
25+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
26+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
2527
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
28+
import software.aws.toolkits.jetbrains.services.codewhisperer.status.CodeWhispererStatusBarWidget.Companion.ID
2629
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
2730
import software.aws.toolkits.jetbrains.utils.notifyInfo
2831
import software.aws.toolkits.jetbrains.utils.notifyWarn
@@ -81,6 +84,18 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe
8184

8285
private var customizationArnOverrideV2: String? = null
8386

87+
init {
88+
ApplicationManager.getApplication().messageBus.connect(this).subscribe(
89+
QRegionProfileSelectedListener.TOPIC,
90+
object : QRegionProfileSelectedListener {
91+
override fun onProfileSelected(project: Project, profile: QRegionProfile?) {
92+
pluginAwareExecuteOnPooledThread {
93+
CodeWhispererModelConfigurator.getInstance().listCustomizations(project, passive = true)
94+
}
95+
}
96+
}
97+
)
98+
}
8499
override fun showConfigDialog(project: Project) {
85100
runInEdt {
86101
calculateIfIamIdentityCenterConnection(project) {

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererModelConfiguratorTest.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.intellij.openapi.application.ApplicationManager
77
import com.intellij.testFramework.ApplicationRule
88
import com.intellij.testFramework.DisposableRule
99
import com.intellij.testFramework.ProjectRule
10+
import com.intellij.testFramework.registerServiceInstance
1011
import com.intellij.testFramework.replaceService
1112
import com.intellij.util.xmlb.XmlSerializer
1213
import org.assertj.core.api.Assertions.assertThat
@@ -40,6 +41,8 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
4041
import software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule
4142
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
4243
import software.aws.toolkits.jetbrains.services.amazonq.FeatureContext
44+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
45+
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
4346
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
4447
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomizationState
4548
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.DefaultCodeWhispererModelConfigurator
@@ -75,6 +78,7 @@ class CodeWhispererModelConfiguratorTest {
7578
private lateinit var sut: DefaultCodeWhispererModelConfigurator
7679
private lateinit var mockClient: CodeWhispererRuntimeClient
7780
private lateinit var abManager: CodeWhispererFeatureConfigService
81+
private lateinit var mockClintAdaptor: CodeWhispererClientAdaptor
7882

7983
@Before
8084
fun setup() {
@@ -110,6 +114,9 @@ class CodeWhispererModelConfiguratorTest {
110114
abManager,
111115
disposableRule.disposable
112116
)
117+
118+
mockClintAdaptor = mock()
119+
projectRule.project.registerServiceInstance(CodeWhispererClientAdaptor::class.java, mockClintAdaptor)
113120
}
114121

115122
@Test
@@ -550,4 +557,47 @@ class CodeWhispererModelConfiguratorTest {
550557
assertThat(actual.previousAvailableCustomizations).hasSize(1)
551558
assertThat(actual.previousAvailableCustomizations["fake-sso-url"]).isEqualTo(listOf("arn_1", "arn_2", "arn_3"))
552559
}
560+
561+
@Test
562+
fun `profile switch should keep using existing customization if new list still contains that arn`() {
563+
val ssoConn = spy(LegacyManagedBearerSsoConnection(region = "us-east-1", startUrl = "url 1", scopes = Q_SCOPES))
564+
ToolkitConnectionManager.getInstance(projectRule.project).switchConnection(ssoConn)
565+
val oldCustomization = CodeWhispererCustomization("oldArn", "oldName", "oldDescription")
566+
sut.switchCustomization(projectRule.project, oldCustomization)
567+
568+
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(oldCustomization)
569+
570+
val fakeCustomizations = listOf(
571+
CodeWhispererCustomization("oldArn", "oldName", "oldDescription")
572+
)
573+
574+
mockClintAdaptor.stub { on { listAvailableCustomizations() } doReturn fakeCustomizations}
575+
576+
ApplicationManager.getApplication().messageBus
577+
.syncPublisher(QRegionProfileSelectedListener.TOPIC)
578+
.onProfileSelected(projectRule.project, null)
579+
580+
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(oldCustomization)
581+
}
582+
583+
@Test
584+
fun `profile switch should invalidate obsolete customization if it's not in the new list`() {
585+
val ssoConn = spy(LegacyManagedBearerSsoConnection(region = "us-east-1", startUrl = "url 1", scopes = Q_SCOPES))
586+
ToolkitConnectionManager.getInstance(projectRule.project).switchConnection(ssoConn)
587+
val oldCustomization = CodeWhispererCustomization("oldArn", "oldName", "oldDescription")
588+
sut.switchCustomization(projectRule.project, oldCustomization)
589+
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(oldCustomization)
590+
591+
val fakeCustomizations = listOf(
592+
CodeWhispererCustomization("newArn", "newName", "oldDescription")
593+
)
594+
mockClintAdaptor.stub { on { listAvailableCustomizations() } doReturn fakeCustomizations}
595+
596+
ApplicationManager.getApplication().messageBus
597+
.syncPublisher(QRegionProfileSelectedListener.TOPIC)
598+
.onProfileSelected(projectRule.project, null)
599+
600+
assertThat(sut.activeCustomization(projectRule.project)).isNull()
601+
}
602+
553603
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
144144
}
145145
}
146146

147-
project.messageBus
147+
ApplicationManager.getApplication().messageBus
148148
.syncPublisher(QRegionProfileSelectedListener.TOPIC)
149149
.onProfileSelected(project, newProfile)
150150
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileSelectedListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.intellij.util.messages.Topic
88

99
interface QRegionProfileSelectedListener {
1010
companion object {
11-
@Topic.ProjectLevel
11+
@Topic.AppLevel
1212
val TOPIC = Topic.create("QRegionProfileSelected", QRegionProfileSelectedListener::class.java)
1313
}
1414

0 commit comments

Comments
 (0)