diff --git a/ui-tests-starter/build.gradle.kts b/ui-tests-starter/build.gradle.kts index 5bd6f620958..4fb743dea29 100644 --- a/ui-tests-starter/build.gradle.kts +++ b/ui-tests-starter/build.gradle.kts @@ -48,6 +48,14 @@ configurations.getByName(uiTestSource.runtimeClasspathConfigurationName) { extendsFrom(uiTestImplementation) } +configurations { + configureEach { + if (name.contains("runtime", ignoreCase = true) && !name.contains("uiTest", ignoreCase = true)) { + exclude(group = "org.jetbrains.kotlinx") + } + } +} + dependencies { // should really be set by the BOM, but too much work to figure out right now uiTestImplementation("org.kodein.di:kodein-di-jvm:7.20.2") @@ -57,10 +65,11 @@ dependencies { // not sure why not coming in transitively for starter uiTestRuntimeOnly(libs.kotlin.coroutines) + uiTestRuntimeOnly(libs.junit.platform.launcher) intellijPlatform { val version = ideProfile.community.sdkVersion - intellijIdeaCommunity(version, !version.contains("SNAPSHOT")) + intellijIdeaCommunity(version, useInstaller = false) localPlugin(project(":plugin-core")) testImplementation(project(":plugin-core:core")) @@ -87,12 +96,22 @@ val prepareAmazonQTest by intellijPlatformTesting.testIde.registering { } } +// Task to install npm dependencies +tasks.register("npmInstall") { + workingDir = projectDir + commandLine("npm", "install") + inputs.file("package.json") + outputs.dir("node_modules") +} + tasks.register("uiTest") { testClassesDirs = uiTestSource.output.classesDirs classpath = uiTestSource.runtimeClasspath dependsOn(prepareAmazonQTest) dependsOn(testPlugins) + dependsOn("npmInstall") // Ensure npm dependencies are installed + systemProperty("ui.test.plugins", testPlugins.get().asPath) systemProperty("org.gradle.project.ideProfileName", ideProfile.name) val testSuite = System.getenv("TEST_DIR") ?: "" diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/chatTests/AmazonQChatTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/chatTests/AmazonQChatTest.kt index 39873a0e164..74601b8a237 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/chatTests/AmazonQChatTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/chatTests/AmazonQChatTest.kt @@ -22,6 +22,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.executePuppeteerScript import software.aws.toolkits.jetbrains.uitests.setupTestEnvironment import software.aws.toolkits.jetbrains.uitests.useExistingConnectionForTest diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeTest.kt index 10cf87e9fa8..f0b55fe4072 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeTest.kt @@ -24,6 +24,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.docTests.prepTestData import software.aws.toolkits.jetbrains.uitests.docTests.scripts.createReadmeScripts.acceptReadmeTestScript import software.aws.toolkits.jetbrains.uitests.docTests.scripts.createReadmeScripts.createReadmePromptedToConfirmFolderTestScript diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeWorkspacesTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeWorkspacesTest.kt index 471e50d514d..e17ade7c4fa 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeWorkspacesTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/createReadmeTests/CreateReadmeWorkspacesTest.kt @@ -24,6 +24,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.docTests.prepTestData import software.aws.toolkits.jetbrains.uitests.docTests.scripts.createReadmeScripts.acceptReadmeTestScript import software.aws.toolkits.jetbrains.uitests.docTests.scripts.createReadmeScripts.createReadmeSubFolderPostFolderChangeTestScript diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeLatestChangesTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeLatestChangesTest.kt index 1d6450c093e..c6cccf51715 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeLatestChangesTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeLatestChangesTest.kt @@ -23,6 +23,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.docTests.prepTestData import software.aws.toolkits.jetbrains.uitests.docTests.scripts.updateReadmeLatestChangesConfirmOptionsTestScript import software.aws.toolkits.jetbrains.uitests.docTests.scripts.updateReadmeLatestChangesMakeChangesFlowTestScript diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeSpecificChangesTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeSpecificChangesTest.kt index 23956e3c295..e480e297c5f 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeSpecificChangesTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/docTests/updateReadmeTests/UpdateReadmeSpecificChangesTest.kt @@ -23,6 +23,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.docTests.prepTestData import software.aws.toolkits.jetbrains.uitests.docTests.scripts.updateReadmeSpecificChangesMakeChangesFlowTestScript import software.aws.toolkits.jetbrains.uitests.docTests.scripts.updateReadmeSpecificChangesTestScript diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/featureDevTests/FeatureDevTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/featureDevTests/FeatureDevTest.kt index aebd2a43985..65f2fef4299 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/featureDevTests/FeatureDevTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/featureDevTests/FeatureDevTest.kt @@ -24,6 +24,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.executePuppeteerScript import software.aws.toolkits.jetbrains.uitests.setupTestEnvironment import software.aws.toolkits.jetbrains.uitests.useExistingConnectionForTest diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileSelectionTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileSelectionTest.kt new file mode 100644 index 00000000000..cf8a59d1d27 --- /dev/null +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileSelectionTest.kt @@ -0,0 +1,341 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.uitests.profileTests + +import com.intellij.driver.client.Driver +import com.intellij.driver.sdk.openFile +import com.intellij.driver.sdk.ui.components.common.editor +import com.intellij.driver.sdk.ui.components.common.ideFrame +import com.intellij.driver.sdk.ui.ui +import com.intellij.driver.sdk.ui.xQuery +import com.intellij.driver.sdk.waitForProjectOpen +import com.intellij.ide.starter.ci.CIServer +import com.intellij.ide.starter.config.ConfigurationStorage +import com.intellij.ide.starter.di.di +import com.intellij.ide.starter.driver.engine.runIdeWithDriver +import com.intellij.ide.starter.ide.IdeProductProvider +import com.intellij.ide.starter.junit5.hyphenateWithClass +import com.intellij.ide.starter.models.TestCase +import com.intellij.ide.starter.project.LocalProjectInfo +import com.intellij.ide.starter.report.AllureHelper.step +import com.intellij.ide.starter.runner.CurrentTestMethod +import com.intellij.ide.starter.runner.Starter +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.AfterAll +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import org.kodein.di.DI +import org.kodein.di.bindSingleton +import software.aws.toolkits.jetbrains.uitests.TestCIServer +import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig +import software.aws.toolkits.jetbrains.uitests.executePuppeteerScript +import software.aws.toolkits.jetbrains.uitests.setupMultipleProfilesForTest +import software.aws.toolkits.jetbrains.uitests.setupMultipleProfilesWithSelectionForTest +import software.aws.toolkits.jetbrains.uitests.setupTestEnvironment +import software.aws.toolkits.jetbrains.uitests.useExistingConnectionForTest +import java.awt.event.KeyEvent +import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardOpenOption + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class QProfileSelectionTest { + + private val setupContent = """public class Example { + public static void main(String[] args) { + int a = 10; + int b = 20; + int c = add(a, b); + System.out.println("The sum of a and b is: " + c); + } + +}""" + + init { + di = DI { + extend(di) + bindSingleton(overrides = true) { TestCIServer } + val defaults = ConfigurationStorage.instance().defaults.toMutableMap().apply { + put("LOG_ENVIRONMENT_VARIABLES", (!System.getenv("CI").toBoolean()).toString()) + } + + bindSingleton(overrides = true) { + ConfigurationStorage(this, defaults) + } + } + } + + @BeforeEach + fun setUp() { + setupTestEnvironment() + } + + @BeforeEach + fun resetTestFile() { + val path = Paths.get("tstData", "Hello", "Example.java") + + Files.createDirectories(path.parent) + Files.write( + path, + setupContent.toByteArray(), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING + ) + } + + @Test + fun `Test single dev profile user accounts`() { + val testCase = TestCase( + IdeProductProvider.IC, + LocalProjectInfo( + Paths.get("tstData", "Hello") + ) + ).withVersion(System.getProperty("org.gradle.project.ideProfileName")) + + useExistingConnectionForTest() + + Starter.newContext(CurrentTestMethod.hyphenateWithClass(), testCase).apply { + System.getProperty("ui.test.plugins").split(File.pathSeparator).forEach { path -> + pluginConfigurator.installPluginFromPath( + Path.of(path) + ) + } + + copyExistingConfig(Paths.get("tstData", "configAmazonQTests")) + updateGeneralSettings() + }.runIdeWithDriver() + .useDriverAndCloseIde { + waitForProjectOpen() + // Wait for the system to be fully ready + Thread.sleep(10000) + + step("Test chat shown directly for users with single profile") { + val result = executePuppeteerScript(testActiveToolWindowPage) + assertThat(result).contains("Chat is shown") + } + + step("Test changing same profile A -> A does nothing") { + changeProfileAndVerify(this, false) + } + + step("Dev features work with single profile user") { + triggerDevFeatures(this, true) + } + } + } + + @Test + fun `Test 2+ dev profile user account fresh login`() { + val testCase = TestCase( + IdeProductProvider.IC, + LocalProjectInfo( + Paths.get("tstData", "Hello") + ) + ).withVersion(System.getProperty("org.gradle.project.ideProfileName")) + + // Configure test with multiple profiles + setupMultipleProfilesForTest() + + Starter.newContext(CurrentTestMethod.hyphenateWithClass(), testCase).apply { + System.getProperty("ui.test.plugins").split(File.pathSeparator).forEach { path -> + pluginConfigurator.installPluginFromPath( + Path.of(path) + ) + } + + copyExistingConfig(Paths.get("tstData", "configAmazonQTests")) + updateGeneralSettings() + }.runIdeWithDriver() + .useDriverAndCloseIde { + waitForProjectOpen() + // Wait for the system to be fully ready + Thread.sleep(10000) + + step("profile selector shown when signed in with no selection") { + val result = executePuppeteerScript(testActiveToolWindowPage) + assertThat(result).contains("Profile selector is shown") + } + + step("Q services not triggered when no profile selected") { + triggerDevFeatures(this, false) + } + + step("Switching profile notifies and shows chat") { + changeProfileAndVerify(this, true) + val result = executePuppeteerScript(testActiveToolWindowPage) + assertThat(result).contains("Chat is shown") + } + + step("Q features work with selected profile") { + triggerDevFeatures(this, true) + } + + step("Changing profile A -> A does nothing") { + changeProfileAndVerify(this, false) + } + } + } + + @Test + fun `Test 2+ profile user account with selected profile startup`() { + val testCase = TestCase( + IdeProductProvider.IC, + LocalProjectInfo( + Paths.get("tstData", "Hello") + ) + ).withVersion(System.getProperty("org.gradle.project.ideProfileName")) + + setupMultipleProfilesWithSelectionForTest() + + Starter.newContext(CurrentTestMethod.hyphenateWithClass(), testCase).apply { + System.getProperty("ui.test.plugins").split(File.pathSeparator).forEach { path -> + pluginConfigurator.installPluginFromPath( + Path.of(path) + ) + } + + copyExistingConfig(Paths.get("tstData", "configAmazonQTests")) + updateGeneralSettings() + }.runIdeWithDriver() + .useDriverAndCloseIde { + waitForProjectOpen() + // Wait for the system to be fully read + Thread.sleep(10000) + + // tab starts closed and needs to be clicked to open + ideFrame { + x(xQuery { byAccessibleName("Amazon Q Chat") }).click() + } + + step("Chat is shown directly on startup") { + val result = executePuppeteerScript(testActiveToolWindowPage) + assertThat(result).contains("Chat is shown") + } + + step("Changing profile A -> A does nothing") { + changeProfileAndVerify(this, false) + } + + step("Dev features work with selected profile") { + triggerDevFeatures(this, true) + } + } + } + + @AfterAll + fun clearAwsXml() { + clearAwsXmlFile() + + val path = Paths.get("tstData", "Hello", "Example.java") + Files.write(path, ByteArray(0), StandardOpenOption.TRUNCATE_EXISTING) + } + + private fun changeProfileAndVerify(driver: Driver, switchingProfiles: Boolean) = + driver.ideFrame { + // Click Amazon Q button in status bar + x( + xQuery { + byAccessibleName("Amazon Q") and byJavaClass("com.intellij.openapi.wm.impl.status.MultipleTextValues") + } + ).click() + Thread.sleep(100) + + driver.ui.keyboard { + // navigate and select "Change Profile" in the popup menu + key(KeyEvent.VK_UP) + key(KeyEvent.VK_UP) + key(KeyEvent.VK_ENTER) + + // wait for list to load + Thread.sleep(3000) + + // profile combobox selection and select connection + key(KeyEvent.VK_TAB) + if (switchingProfiles) { + // navigate past (current) + key(KeyEvent.VK_DOWN) + } + key(KeyEvent.VK_DOWN) + key(KeyEvent.VK_ENTER) + + // confirm selection + key(KeyEvent.VK_ENTER) + } + + // Verify notification behavior + Thread.sleep(100) + val notification = x(xQuery { byVisibleText("You changed your profile") }) + if (switchingProfiles) { + assertTrue { notification.present() } + } else { + assertTrue { notification.notPresent() } + } + } + + private fun triggerDevFeatures(driver: Driver, isProfileSelected: Boolean) { + // trigger inline completion + var originalText: String? = null + var afterSuggestion: String? = null + driver.ideFrame { + driver.openFile("Example.java") + editor { + originalText = text + moveCaretToOffset(text.length - 2) + + driver.ui.keyboard { + pressing(KeyEvent.VK_ALT) { + key(KeyEvent.VK_C) + } + } + Thread.sleep(2000) + + val hintExists = editor.getInlayModel().getInlineElementsInRange(0, text.length).isNotEmpty() + if (isProfileSelected) { + assertThat(hintExists).isTrue() + } else { + assertThat(hintExists).isFalse() + } + driver.ui.keyboard { + key(KeyEvent.VK_TAB) + } + afterSuggestion = text + text = setupContent + } + } + if (isProfileSelected) { + assertThat(afterSuggestion?.replace(Regex("\\s+"), " ")?.trim()) + .isNotEqualTo(originalText?.replace(Regex("\\s+"), " ")?.trim()) + } else { + assertThat(afterSuggestion?.replace(Regex("\\s+"), " ")?.trim()) + .isEqualTo(originalText?.replace(Regex("\\s+"), " ")?.trim()) + } + + // check q features + driver.ideFrame { + val editor = x(xQuery { byClass("EditorComponentImpl") }) + editor.click() + editor.rightClick() + + // Wait for context menu to appear + Thread.sleep(100) + + // Check if "Amazon Q" option is present + val amazonQInMenu = x( + xQuery { + byVisibleText("Amazon Q") and byJavaClass("com.intellij.openapi.actionSystem.impl.ActionMenu") + } + ) + if (isProfileSelected) { + assertTrue { amazonQInMenu.present() } + } else { + assertTrue { amazonQInMenu.notPresent() } + } + } + } +} diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileTestScripts.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileTestScripts.kt new file mode 100644 index 00000000000..331279abd37 --- /dev/null +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/profileTests/QProfileTestScripts.kt @@ -0,0 +1,53 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.uitests.profileTests + +import software.aws.toolkits.jetbrains.uitests.testScriptPrefix + +// language=JS +val testActiveToolWindowPage = """ +$testScriptPrefix + +async function testProfileSelector() { + const { JSDOM } = require('jsdom'); + const dom = new JSDOM(''); + global.window = dom.window; + global.document = dom.window.document; + global.self = dom.window; + + const MynahUITestIds = require("@aws/mynah-ui").MynahUITestIds; + const browser = await puppeteer.connect({ + browserURL: "http://localhost:9222" + }) + try { + const pages = await browser.pages() + + // Use the last page (most recently active) + const activePage = pages[pages.length - 1] + + if(!activePage) { + console.log("No pages found") + return + } + + // Check the active page for chat input or profile selector + const chatInput = await activePage.${'$'}(`[${'$'}{MynahUITestIds.selector}="${'$'}{MynahUITestIds.prompt.input}"]`) + if(chatInput) { + console.log("Chat is shown") + return + } + + const profileSelector = await activePage.${'$'}('div#profile-page') + if(profileSelector) { + console.log("Profile selector is shown") + return + } + + console.log("Neither profile selector nor chat found on active page") + } finally { + await browser.close() + } +} +testProfileSelector().catch(console.error); +""".trimIndent() diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/testTests/QTestGenerationChatTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/testTests/QTestGenerationChatTest.kt index 2b61093a6df..c1ac7233441 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/testTests/QTestGenerationChatTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/testTests/QTestGenerationChatTest.kt @@ -23,6 +23,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.executePuppeteerScript import software.aws.toolkits.jetbrains.uitests.setupTestEnvironment import software.aws.toolkits.jetbrains.uitests.useExistingConnectionForTest diff --git a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/transformTests/TransformChatTest.kt b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/transformTests/TransformChatTest.kt index e4858f2e36b..fb226c6dbe1 100644 --- a/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/transformTests/TransformChatTest.kt +++ b/ui-tests-starter/tst-243+/software/aws/toolkits/jetbrains/uitests/transformTests/TransformChatTest.kt @@ -22,6 +22,7 @@ import org.kodein.di.DI import org.kodein.di.bindSingleton import software.aws.toolkits.jetbrains.uitests.TestCIServer import software.aws.toolkits.jetbrains.uitests.clearAwsXmlFile +import software.aws.toolkits.jetbrains.uitests.copyExistingConfig import software.aws.toolkits.jetbrains.uitests.executePuppeteerScript import software.aws.toolkits.jetbrains.uitests.setupTestEnvironment import software.aws.toolkits.jetbrains.uitests.useExistingConnectionForTest diff --git a/ui-tests-starter/tst-prep/PreAmazonQUiTest.kt b/ui-tests-starter/tst-prep/PreAmazonQUiTest.kt index 4c92b33e3d1..0c33126a57e 100644 --- a/ui-tests-starter/tst-prep/PreAmazonQUiTest.kt +++ b/ui-tests-starter/tst-prep/PreAmazonQUiTest.kt @@ -19,7 +19,7 @@ import software.aws.toolkits.jetbrains.utils.extensions.SsoLogin import software.aws.toolkits.jetbrains.utils.extensions.SsoLoginExtension @ExtendWith(ApplicationExtension::class, SsoLoginExtension::class) -@SsoLogin("amazonq-test-account") +@SsoLogin("single_profile_user") class PreAmazonQUiTest { @TestDisposable diff --git a/ui-tests-starter/tst/software/aws/toolkits/jetbrains/uitests/TestUtils.kt b/ui-tests-starter/tst/software/aws/toolkits/jetbrains/uitests/TestUtils.kt index 15e83860c77..00c17d9ee9b 100644 --- a/ui-tests-starter/tst/software/aws/toolkits/jetbrains/uitests/TestUtils.kt +++ b/ui-tests-starter/tst/software/aws/toolkits/jetbrains/uitests/TestUtils.kt @@ -3,14 +3,24 @@ package software.aws.toolkits.jetbrains.uitests +import com.intellij.ide.starter.ide.IDETestContext import org.assertj.core.api.Assertions.assertThat import org.intellij.lang.annotations.Language import java.io.File import java.nio.file.Files +import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardOpenOption +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.copyToRecursively private const val TEST_RESOURCES_PATH = "src/test/tstData" + +@OptIn(ExperimentalPathApi::class) +fun IDETestContext.copyExistingConfig(configPath: Path): IDETestContext { + configPath.copyToRecursively(paths.configDir, followLinks = false, overwrite = true) + return this +} fun executePuppeteerScript(@Language("JS") scriptContent: String): String { val scriptFile = File("$TEST_RESOURCES_PATH/temp-script.js") scriptFile.parentFile.mkdirs() @@ -71,6 +81,118 @@ fun useExistingConnectionForTest() { writeToAwsXml(configContent) } +fun setupMultipleProfilesForTest() { + val testStartUrl = System.getenv("TEST_START_URL") + val testRegion = System.getenv("TEST_REGION") + val configContent = """ + + + + + + + + + + + """.trimIndent() + writeToAwsXml(configContent) +} + +fun setupMultipleProfilesWithSelectionForTest() { + val testRegion = System.getenv("TEST_REGION") + val testStartUrl = System.getenv("TEST_START_URL") + val testArn = System.getenv("TEST_ARN") + val testProfile = System.getenv("TEST_PROFILE") + val testProfileName = testStartUrl.substringAfter("https://").substringBefore(".awsapps.com") + val configContent = """ + + + + + + + + + + + + + + + + + + + + + + + """.trimIndent() + writeToAwsXml(configContent) +} + fun clearAwsXmlFile() { val configContent = """ @@ -104,6 +226,8 @@ fun writeToAwsXml(@Language("XML") configContent: String) { ) } +fun String.normalizeWhitespace(): String = this.replace(Regex("\\s+"), " ").trim() + // language=JS val testScriptPrefix = """ const puppeteer = require('puppeteer');