fun generateProtocolTests()

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)
                    }
                }
            }
        }
    }