Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<CodeWhispererRuntimeClient>()
val mockResponse: SdkIterable<Profile> = SdkIterable<Profile> {
listOf(
Profile.builder().profileName("FOO").arn("foo").build(),
).toMutableList().iterator()
}

val mockResponse2: SdkIterable<Profile> = SdkIterable<Profile> {
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<Consumer<ListAvailableProfilesRequest.Builder>>()) } 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`() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -182,8 +181,12 @@ interface MockResourceCacheInterface {
addEntry(project, resourceId, CompletableFuture.failedFuture<Any>(throws))
}

fun <T> addEntry(connectionSettings: ConnectionSettings, resource: Resource.Cached<T>, value: CompletableFuture<T>) {
addEntry(resource, connectionSettings.region.id, connectionSettings.credentials.id, value)
fun <T> addEntry(connectionSettings: ClientConnectionSettings<*>, resource: Resource.Cached<T>, value: T) {
addEntry(resource, connectionSettings.region.id, connectionSettings.providerId, value)
}

fun <T> addEntry(connectionSettings: ClientConnectionSettings<*>, resource: Resource.Cached<T>, value: CompletableFuture<T>) {
addEntry(resource, connectionSettings.region.id, connectionSettings.providerId, value)
}

fun <T> addEntry(resource: Resource.Cached<T>, regionId: String, credentialsId: String, value: T) {
Expand Down
Loading