in smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpProtocolTestGenerator.kt [42:131]
fun generateProtocolTests() {
val operationIndex: OperationIndex = OperationIndex.of(ctx.model)
val topDownIndex: TopDownIndex = TopDownIndex.of(ctx.model)
for (operation in TreeSet(topDownIndex.getContainedOperations(ctx.service).filterNot(::serverOnly))) {
// 1. Generate test cases for each request.
val requestTests = operation.getTrait<HttpRequestTestsTrait>()
?.getTestCasesFor(AppliesTo.CLIENT)
?.filter(::isTestCaseAllowedForRunMode)
requestTests?.let { testCases ->
val testOperationName = operation.id.name.replaceFirstChar { c -> c.uppercaseChar() }
val testClassName = "${testOperationName}RequestTest"
val testFilename = "$testClassName.kt"
ctx.delegator.useTestFileWriter(testFilename, ctx.settings.pkg.name) { writer ->
LOGGER.fine("Generating request protocol test cases for ${operation.id}")
// import package.models.*
writer.addImport("${ctx.settings.pkg.name}.model", "*")
requestTestBuilder
.writer(writer)
.model(ctx.model)
.symbolProvider(ctx.symbolProvider)
.operation(operation)
.service(ctx.service)
.testCases(testCases)
.build()
.renderTestClass(testClassName)
}
}
// 2. Generate test cases for each response.
val responseTests = operation.getTrait<HttpResponseTestsTrait>()
?.getTestCasesFor(AppliesTo.CLIENT)
?.filter(::isTestCaseAllowedForRunMode)
responseTests?.let { testCases ->
val testOperationName = operation.id.name.replaceFirstChar { c -> c.uppercaseChar() }
val testClassName = "${testOperationName}ResponseTest"
val testFilename = "$testClassName.kt"
ctx.delegator.useTestFileWriter(testFilename, ctx.settings.pkg.name) { writer ->
LOGGER.fine("Generating response protocol test cases for ${operation.id}")
writer.addImport("${ctx.settings.pkg.name}.model", "*")
responseTestBuilder
.writer(writer)
.model(ctx.model)
.symbolProvider(ctx.symbolProvider)
.operation(operation)
.service(ctx.service)
.testCases(testCases)
.build()
.renderTestClass(testClassName)
}
}
// 3. Generate test cases for each error on each operation.
for (error in operationIndex.getErrors(operation).filterNot(::serverOnly)) {
val errorTests = error.getTrait<HttpResponseTestsTrait>()
?.getTestCasesFor(AppliesTo.CLIENT)
?.filter(::isTestCaseAllowedForRunMode)
errorTests?.let { testCases ->
// use operation name as filename
val opName = operation.id.name.replaceFirstChar { c -> c.uppercaseChar() }
val testFilename = "${opName}ErrorTest.kt"
// multiple error (tests) may be associated with a single operation,
// use the operation name + error name as the class name
val testClassName = "${opName}${error.defaultName(ctx.service)}Test"
ctx.delegator.useTestFileWriter(testFilename, ctx.settings.pkg.name) { writer ->
LOGGER.fine("Generating error protocol test cases for ${operation.id}")
writer.addImport("${ctx.settings.pkg.name}.model", "*")
errorTestBuilder
.error(error)
.writer(writer)
.model(ctx.model)
.symbolProvider(ctx.symbolProvider)
.operation(operation)
.service(ctx.service)
.testCases(testCases)
.build()
.renderTestClass(testClassName)
}
}
}
}
}