diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/QRegionProfileManagerTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/QRegionProfileManagerTest.kt index 0453cf3a766..962ade0a5c6 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/QRegionProfileManagerTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/QRegionProfileManagerTest.kt @@ -26,6 +26,7 @@ import software.amazon.awssdk.services.ssooidc.SsoOidcClient import software.aws.toolkits.core.region.AwsRegion import software.aws.toolkits.jetbrains.core.MockClientManager import software.aws.toolkits.jetbrains.core.MockClientManagerRule +import software.aws.toolkits.jetbrains.core.MockResourceCacheRule import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection import software.aws.toolkits.jetbrains.core.credentials.ManagedSsoProfile import software.aws.toolkits.jetbrains.core.credentials.MockToolkitAuthManagerRule @@ -35,6 +36,7 @@ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES import software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule import software.aws.toolkits.jetbrains.services.amazonq.profile.QEndpoints +import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileResources import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileState import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileSwitchIntent import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile @@ -67,6 +69,9 @@ class QRegionProfileManagerTest { @Rule val disposableRule = DisposableRule() + @get:Rule + val resourceCache = MockResourceCacheRule() + private lateinit var sut: QRegionProfileManager private val project: Project get() = projectRule.project @@ -124,7 +129,39 @@ class QRegionProfileManagerTest { assertThat(cnt).isEqualTo(2) } - // TODO: Add two unit tests for listProfiles — one with cache hit, one without + @Test + fun `listProfiles will call each client to get profiles`() { + val client = clientRule.create() + val mockResponse: SdkIterable = SdkIterable { + listOf( + Profile.builder().profileName("FOO").arn("foo").build(), + ).toMutableList().iterator() + } + + val mockResponse2: SdkIterable = SdkIterable { + listOf( + Profile.builder().profileName("BAR").arn("bar").build(), + ).toMutableList().iterator() + } + + val iterable: ListAvailableProfilesIterable = mock { + on { it.profiles() } doReturn mockResponse doReturn mockResponse2 + } + + // TODO: not sure if we can mock client with different region different response? + client.stub { + onGeneric { listAvailableProfilesPaginator(any>()) } doReturn iterable + } + val connectionSettings = sut.getQClientSettings(project) + resourceCache.addEntry(connectionSettings, QProfileResources.LIST_REGION_PROFILES, QProfileResources.LIST_REGION_PROFILES.fetch(connectionSettings)) + + assertThat(sut.listRegionProfiles(project)) + .hasSize(2) + .containsExactlyInAnyOrder( + QRegionProfile("FOO", "foo"), + QRegionProfile("BAR", "bar") + ) + } @Test fun `validateProfile should cross validate selected profile with latest API response for current project and remove it if its not longer accessible`() { diff --git a/plugins/core/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/core/MockResourceCache.kt b/plugins/core/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/core/MockResourceCache.kt index 66d5249ce53..78cfbe4409c 100644 --- a/plugins/core/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/core/MockResourceCache.kt +++ b/plugins/core/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/core/MockResourceCache.kt @@ -13,7 +13,6 @@ import org.junit.jupiter.api.extension.BeforeEachCallback import org.junit.jupiter.api.extension.ExtensionContext import org.junit.runner.Description import software.aws.toolkits.core.ClientConnectionSettings -import software.aws.toolkits.core.ConnectionSettings import software.aws.toolkits.core.credentials.ToolkitAuthenticationProvider import software.aws.toolkits.core.credentials.ToolkitBearerTokenProvider import software.aws.toolkits.core.credentials.ToolkitCredentialsProvider @@ -182,8 +181,12 @@ interface MockResourceCacheInterface { addEntry(project, resourceId, CompletableFuture.failedFuture(throws)) } - fun addEntry(connectionSettings: ConnectionSettings, resource: Resource.Cached, value: CompletableFuture) { - addEntry(resource, connectionSettings.region.id, connectionSettings.credentials.id, value) + fun addEntry(connectionSettings: ClientConnectionSettings<*>, resource: Resource.Cached, value: T) { + addEntry(resource, connectionSettings.region.id, connectionSettings.providerId, value) + } + + fun addEntry(connectionSettings: ClientConnectionSettings<*>, resource: Resource.Cached, value: CompletableFuture) { + addEntry(resource, connectionSettings.region.id, connectionSettings.providerId, value) } fun addEntry(resource: Resource.Cached, regionId: String, credentialsId: String, value: T) {