diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codetest/sessionconfig/CodeTestSessionConfig.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codetest/sessionconfig/CodeTestSessionConfig.kt index b2cc33d67d7..a565da482c1 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codetest/sessionconfig/CodeTestSessionConfig.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codetest/sessionconfig/CodeTestSessionConfig.kt @@ -29,6 +29,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.codetest.noFileOpe import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererUnknownLanguage import software.aws.toolkits.jetbrains.services.codewhisperer.language.programmingLanguage +import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_CREATE_PAYLOAD_TIMEOUT_IN_SECONDS import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_CODE_SCAN_TIMEOUT_IN_SECONDS import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_PAYLOAD_LIMIT_IN_BYTES @@ -217,7 +218,7 @@ class CodeTestSessionConfig( for (module in project.modules) { val changeListManager = ChangeListManager.getInstance(module.project) module.guessModuleDir()?.let { moduleDir -> - val gitIgnoreFilteringUtil = GitIgnoreFilteringUtil(moduleDir) + val gitIgnoreFilteringUtil = GitIgnoreFilteringUtil(moduleDir, CodeWhispererConstants.FeatureName.TEST_GENERATION) stack.push(moduleDir) while (stack.isNotEmpty()) { val current = stack.pop() diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtil.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtil.kt index e665f5a3d95..5278b3682fc 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtil.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtil.kt @@ -9,37 +9,58 @@ import kotlinx.coroutines.async import kotlinx.coroutines.withContext import kotlin.coroutines.coroutineContext -class GitIgnoreFilteringUtil(private val moduleDir: VirtualFile) { +class GitIgnoreFilteringUtil( + private val moduleDir: VirtualFile, + private val useCase: CodeWhispererConstants.FeatureName? = null, +) { private var ignorePatternsWithGitIgnore = emptyList() - private val additionalGitIgnoreRules = setOf( - ".aws-sam", - ".gem", - ".git", - ".gitignore", - ".gradle", - ".hg", - ".idea", - ".project", - ".rvm", - ".svn", - "*.zip", - "*.bin", - "*.png", - "*.jpg", - "*.svg", - "*.pyc", - "license.txt", - "License.txt", - "LICENSE.txt", - "license.md", - "License.md", - "LICENSE.md", - "node_modules", - "build", - "dist", - "annotation-generated-src", - "annotation-generated-tst" - ) + private val additionalGitIgnoreRules = buildSet { + addAll( + setOf( + ".aws-sam", + ".gem", + ".git", + ".gitignore", + ".gradle", + ".hg", + ".idea", + ".project", + ".rvm", + ".svn", + "*.zip", + "*.bin", + "*.png", + "*.jpg", + "*.svg", + "*.pyc", + "license.txt", + "License.txt", + "LICENSE.txt", + "license.md", + "License.md", + "LICENSE.md", + "node_modules", + "build", + "dist", + "annotation-generated-src", + "annotation-generated-tst" + ) + ) + if (useCase == CodeWhispererConstants.FeatureName.TEST_GENERATION) { + addAll( + setOf( + "env", + "release-info", + "*.jar", + "*.exe", + "*.a", + "*.map", + "*.graph", + "*.so" + ) + ) + } + } init { ignorePatternsWithGitIgnore = try { diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtilTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtilTest.kt new file mode 100644 index 00000000000..1dd88cc7438 --- /dev/null +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/util/GitIgnoreFilteringUtilTest.kt @@ -0,0 +1,93 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codewhisperer.util + +import com.intellij.openapi.vfs.VirtualFile +import org.assertj.core.api.Assertions.assertThat +import org.junit.Before +import org.junit.Test +import org.mockito.Mock +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.whenever + +class GitIgnoreFilteringUtilTest { + + @Mock + private lateinit var mockModuleDir: VirtualFile + + private lateinit var gitIgnoreFilteringUtil: GitIgnoreFilteringUtil + + @Before + fun setUp() { + MockitoAnnotations.openMocks(this) + gitIgnoreFilteringUtil = GitIgnoreFilteringUtil(mockModuleDir) + } + + @Test + fun `test default gitignore patterns are initialized`() { + val defaultPatterns = listOf( + ".aws-sam", + ".gem", + ".git", + ".gitignore", + ".gradle", + ".hg", + ".idea", + ".project", + ".rvm", + ".svn", + "*.zip", + "*.bin", + "*.png", + "*.jpg", + "*.svg", + "*.pyc", + "license.txt", + "License.txt", + "LICENSE.txt", + "license.md", + "License.md", + "LICENSE.md", + "node_modules", + "build", + "dist", + "annotation-generated-src", + "annotation-generated-tst" + ) + + // Access the private field using reflection for testing + val field = GitIgnoreFilteringUtil::class.java.getDeclaredField("additionalGitIgnoreRules") + field.isAccessible = true + val actualPatterns = field.get(gitIgnoreFilteringUtil) as Set + + assertThat(defaultPatterns.toSet()).isEqualTo(actualPatterns) + } + + @Test + fun `test initialization with different useCase`() { + val utilWithUseCase = GitIgnoreFilteringUtil( + mockModuleDir, + CodeWhispererConstants.FeatureName.CODE_REVIEW + ) + assertThat(utilWithUseCase).isNotNull + } + + @Test + fun `test initialization with null useCase`() { + val utilWithNullUseCase = GitIgnoreFilteringUtil(mockModuleDir, null) + assertThat(utilWithNullUseCase).isNotNull + } + + @Test + fun `test module directory is properly set`() { + whenever(mockModuleDir.path).thenReturn("/test/path") + + val field = GitIgnoreFilteringUtil::class.java.getDeclaredField("moduleDir") + field.isAccessible = true + val actualModuleDir = field.get(gitIgnoreFilteringUtil) as VirtualFile + + assertThat(mockModuleDir).isEqualTo(actualModuleDir) + assertThat("/test/path").isEqualTo(actualModuleDir.path) + } +}