jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/lambda/go/GoLambdaHandlerResolverTest.kt (278 lines of code) (raw):
// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package software.aws.toolkits.jetbrains.services.lambda.go
import com.goide.psi.GoFunctionDeclaration
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.testFramework.runInEdtAndWait
import org.assertj.core.api.Assertions.assertThat
import org.junit.Rule
import org.junit.Test
import software.aws.toolkits.jetbrains.services.lambda.BuiltInRuntimeGroups
import software.aws.toolkits.jetbrains.services.lambda.LambdaHandlerResolver
import software.aws.toolkits.jetbrains.services.lambda.RuntimeGroup
import software.aws.toolkits.jetbrains.utils.rules.GoCodeInsightTestFixtureRule
import software.aws.toolkits.jetbrains.utils.rules.addGoLambdaHandler
class GoLambdaHandlerResolverTest {
@Rule
@JvmField
val projectRule = GoCodeInsightTestFixtureRule()
@Test
fun `Determine handler no return or arguments`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() {
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, "handler")
}
@Test
fun `Determine handler one return`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() error {
return nil
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, "handler")
}
@Test
fun `Determine handler no arguments two returns`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (bool, error) {
return nil
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, "handler")
}
@Test
fun `Determine handler invalid No arguments two returns, second one is not error`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (error, bool) {
return nil
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, null)
}
@Test
fun `Determine handler invalid three returns, second one is not error`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (error, error, error) {
return nil
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, null)
}
@Test
fun `Determine handler one argument`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(abc int) {
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, "handler")
}
@Test
fun `Determine handler two arguments`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a context.Context, abc int) {
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, "handler")
}
@Test
fun `Determine handler invalid two arguments first is not context`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a int, b int) {
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, null)
}
@Test
fun `Determine handler invalid three arguments`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a context.Context, b context.Context, c context.Context) {
}
""".trimIndent()
)
assertDetermineHandler(handlerElement, null)
}
@Test
fun `Find psi no return or arguments`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() {
}
""".trimIndent()
)
assertFindPsiElements("handler", true)
}
@Test
fun `Find psi one return`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() error {
return nil
}
""".trimIndent()
)
assertFindPsiElements("handler", true)
}
@Test
fun `Find psi no arguments two returns`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (bool, error) {
return nil
}
""".trimIndent()
)
assertFindPsiElements("handler", true)
}
@Test
fun `Find psi invalid No arguments two returns, second one is not error`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (error, bool) {
return nil
}
""".trimIndent()
)
assertFindPsiElements("handler", false)
}
@Test
fun `Find psi invalid three returns, second one is not error`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler() (error, error, error) {
return nil
}
""".trimIndent()
)
assertFindPsiElements("handler", false)
}
@Test
fun `Find psi one argument`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(abc int) {
}
""".trimIndent()
)
assertFindPsiElements("handler", true)
}
@Test
fun `Find psi two arguments`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a context.Context, abc int) {
}
""".trimIndent()
)
assertFindPsiElements("handler", true)
}
@Test
fun `Find psi invalid two arguments first is not context`() {
val handlerElement = projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a int, b int) {
}
""".trimIndent()
)
assertFindPsiElements("handler", false)
}
@Test
fun `Find psi invalid three arguments`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileContent = """
package main
func handler(a context.Context, b context.Context, c context.Context) {
}
""".trimIndent()
)
assertFindPsiElements("handler", false)
}
@Test
fun `Finds no results in tests`() {
projectRule.fixture.addGoLambdaHandler(
handlerName = "handler",
fileName = "a_test",
fileContent = """
package main
func handler(a context.Context, abc int) {
}
""".trimIndent()
)
assertFindPsiElements("handler", false)
}
private fun assertDetermineHandler(handlerElement: PsiElement, expectedHandlerFullName: String?) {
val resolver = LambdaHandlerResolver.getInstance(RuntimeGroup.getById(BuiltInRuntimeGroups.Go))
runInEdtAndWait {
if (expectedHandlerFullName != null) {
assertThat(resolver.determineHandler(handlerElement)).isEqualTo(expectedHandlerFullName)
} else {
assertThat(resolver.determineHandler(handlerElement)).isNull()
}
}
}
private fun assertFindPsiElements(handler: String, shouldBeFound: Boolean) {
val resolver = LambdaHandlerResolver.getInstance(RuntimeGroup.getById(BuiltInRuntimeGroups.Go))
runInEdtAndWait {
val project = projectRule.fixture.project
val lambdas = resolver.findPsiElements(project, handler, GlobalSearchScope.allScope(project))
if (shouldBeFound) {
assertThat(lambdas).hasSize(1)
assertThat(lambdas[0]).isInstanceOf(GoFunctionDeclaration::class.java)
} else {
assertThat(lambdas).isEmpty()
}
}
}
}