Skip to content

Commit

Permalink
fix: update test operation generator to find any operation in the ser…
Browse files Browse the repository at this point in the history
…vice closure

When using operations nested under resources, the current search will raise "NoSuchElementException".
This fixes the search to include all operations within the service closure
  • Loading branch information
mcmasn-amzn committed Nov 26, 2024
1 parent e54cc56 commit 282e2e1
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package software.amazon.smithy.rustsdk.endpoints

import software.amazon.smithy.model.knowledge.TopDownIndex
import software.amazon.smithy.model.node.Node
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.shapes.ShapeId
Expand Down Expand Up @@ -222,4 +223,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test:
}

fun ClientCodegenContext.operationId(testOperationInput: EndpointTestOperationInput): ShapeId =
this.serviceShape.allOperations.first { it.name == testOperationInput.operationName }
TopDownIndex.of(this.model)
.getContainedOperations(this.serviceShape)
.map { it.toShapeId() }
.first { it.name == testOperationInput.operationName }
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,50 @@ class OperationInputTestGeneratorTests {
assertEquals("operations#Ping", operationId.toString())
}

@Test
fun `finds operation shape by name from nested operations`() {
val prefix = "\$version: \"2\""
val operationModel =
"""
$prefix
namespace operations.bells
resource Bell {
operations: [Ding]
}
operation Ding {}
""".trimIndent()
val serviceModel =
"""
$prefix
namespace service
use operations#Bell
service MyService {
resources: [Bell]
}
""".trimIndent()

val model =
Model.assembler()
.discoverModels()
.addUnparsedModel("operation.smithy", operationModel)
.addUnparsedModel("main.smithy", serviceModel)
.assemble()
.unwrap()

val context = testClientCodegenContext(model)
val testOperationInput =
EndpointTestOperationInput.builder()
.operationName("Ding")
.build()

val operationId = context.operationId(testOperationInput)
assertEquals("operations.bells#Ding", operationId.toString())
}

@Test
fun `fails for operation name not found`() {
val model =
Expand Down

0 comments on commit 282e2e1

Please sign in to comment.