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 @@ -3,8 +3,9 @@

package software.aws.toolkits.jetbrains.services.amazonq.lsp.util

import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.roots.ModuleRootManager
import org.eclipse.lsp4j.WorkspaceFolder
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString

Expand All @@ -13,10 +14,12 @@
if (project.isDefault) {
emptyList()
} else {
ProjectRootManager.getInstance(project).contentRoots.map { contentRoot ->
WorkspaceFolder().apply {
name = contentRoot.name
this.uri = toUriString(contentRoot)
ModuleManager.getInstance(project).modules.mapNotNull { module ->

Check warning on line 17 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt#L17

Added line #L17 was not covered by tests
ModuleRootManager.getInstance(module).contentRoots.firstOrNull()?.let { contentRoot ->
WorkspaceFolder().apply {
name = module.name
uri = toUriString(contentRoot)
}

Check warning on line 22 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt#L19-L22

Added lines #L19 - L22 were not covered by tests
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,39 @@

package software.aws.toolkits.jetbrains.services.amazonq.lsp.util

import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.vfs.VirtualFile
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import java.net.URI
import java.nio.file.Path

class WorkspaceFolderUtilTest {

@Test
fun `createWorkspaceFolders returns empty list when no workspace folders`() {
fun `createWorkspaceFolders returns empty list when project is default`() {
val mockProject = mockk<Project>()
every { mockProject.isDefault } returns true

val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)

assertThat(result).isEqualTo(emptyList<VirtualFile>())
assertThat(result).isEmpty()
}

@Test
fun `createWorkspaceFolders returns workspace folders for non-default project`() {
fun `createWorkspaceFolders returns workspace folders for non-default project with modules`() {
val mockProject = mockk<Project>()
val mockProjectRootManager = mockk<ProjectRootManager>()
val mockModuleManager = mockk<ModuleManager>()
val mockModule1 = mockk<Module>()
val mockModule2 = mockk<Module>()
val mockModuleRootManager1 = mockk<ModuleRootManager>()
val mockModuleRootManager2 = mockk<ModuleRootManager>()

val mockContentRoot1 = createMockVirtualFile(
URI("file:///path/to/root1"),
name = "root1"
Expand All @@ -38,58 +45,65 @@ class WorkspaceFolderUtilTest {
name = "root2"
)

mockkStatic(ModuleManager::class, ModuleRootManager::class)

every { mockProject.isDefault } returns false
every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager
every { mockProjectRootManager.contentRoots } returns arrayOf(mockContentRoot1, mockContentRoot2)
every { ModuleManager.getInstance(mockProject) } returns mockModuleManager
every { mockModuleManager.modules } returns arrayOf(mockModule1, mockModule2)
every { mockModule1.name } returns "module1"
every { mockModule2.name } returns "module2"
every { ModuleRootManager.getInstance(mockModule1) } returns mockModuleRootManager1
every { ModuleRootManager.getInstance(mockModule2) } returns mockModuleRootManager2
every { mockModuleRootManager1.contentRoots } returns arrayOf(mockContentRoot1)
every { mockModuleRootManager2.contentRoots } returns arrayOf(mockContentRoot2)

val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)

assertThat(result).hasSize(2)
assertThat(result[0].uri).isEqualTo(normalizeFileUri("file:///path/to/root1"))
assertThat(result[1].uri).isEqualTo(normalizeFileUri("file:///path/to/root2"))
assertThat(result[0].name).isEqualTo("root1")
assertThat(result[1].name).isEqualTo("root2")
assertThat(result[0].name).isEqualTo("module1")
assertThat(result[1].name).isEqualTo("module2")
}

@Test
fun `createWorkspaceFolders returns empty list when project has no content roots`() {
fun `createWorkspaceFolders handles modules with no content roots`() {
val mockProject = mockk<Project>()
val mockProjectRootManager = mockk<ProjectRootManager>()
val mockModuleManager = mockk<ModuleManager>()
val mockModule = mockk<Module>()
val mockModuleRootManager = mockk<ModuleRootManager>()

mockkStatic(ModuleManager::class, ModuleRootManager::class)

every { mockProject.isDefault } returns false
every { ProjectRootManager.getInstance(mockProject) } returns mockProjectRootManager
every { mockProjectRootManager.contentRoots } returns emptyArray()
every { ModuleManager.getInstance(mockProject) } returns mockModuleManager
every { mockModuleManager.modules } returns arrayOf(mockModule)
every { ModuleRootManager.getInstance(mockModule) } returns mockModuleRootManager
every { mockModuleRootManager.contentRoots } returns emptyArray()

val result = WorkspaceFolderUtil.createWorkspaceFolders(mockProject)

assertThat(result).isEqualTo(emptyList<VirtualFile>())
assertThat(result).isEmpty()
}

private fun createMockVirtualFile(uri: URI, name: String): VirtualFile {
val path = mockk<Path> {
every { toUri() } returns uri
}
return mockk<VirtualFile> {
private fun createMockVirtualFile(uri: URI, name: String): VirtualFile =
mockk<VirtualFile> {
every { url } returns uri.toString()
every { getName() } returns name
every { toNioPath() } returns path
every { isDirectory } returns false
every { fileSystem } returns mockk {
every { protocol } returns "file"
}
}
}

// for windows unit tests
private fun normalizeFileUri(uri: String): String {
if (!System.getProperty("os.name").lowercase().contains("windows")) {
return uri
}

if (!uri.startsWith("file:///")) {
return uri
}

val path = uri.substringAfter("file:///")
return "file:///C:/$path"
}
Expand Down
Loading