pulumi/pkg/codegen/testing/test/README.md

77 lines
2.2 KiB
Markdown

# SDK Codegen Tests
TestSDKCodegen runs the complete set of SDK code generation tests
against a particular language's code generator. It also verifies
that the generated code is structurally sound.
The test files live in `pkg/codegen/testing/test/testdata` and
are registered in the following globals in pkg/codegen/testing/test.
- sdk_driver.go: `PulumiPulumiSDKTests`
- program_driver.go: `PulumiPulumiProgramTests`
- program_driver.go: `PulumiPulumiYAMLProgramTests`
An SDK code generation test files consists of a schema and a set of
expected outputs for each language. Each test is structured as a
directory that contains that information:
```
testdata/
my-simple-schema/ # i.e. `simple-enum-schema`
schema.(json|yaml)
go/
python/
nodejs/
dotnet/
...
```
The schema is the only piece that *must* be manually authored.
Once the schema has been written, the actual codegen outputs can be
generated by running the following in `pkg/codegen` directory:
```bash
PULUMI_ACCEPT=true go test ./...
```
This will rebuild subfolders such as `go/` from scratch and store
the set of code-generated file names in `go/codegen-manifest.json`.
To generate the code for a specific directory in testdata,
run the following instead:
```bash
PULUMI_ACCEPT=true go test ./... -run TestGenerate/$dirName
```
If these outputs look correct, they need to be checked into git and
will then serve as the expected values for the normal test runs:
```bash
$ go test ./...
```
That is, the normal test runs will fail if changes to codegen or
schema lead to a diff in the generated file set. If the diff is
intentional, it can be accepted again via `PULUMI_ACCEPT=true`.
## Writing Program Tests on Generated Code
To support running unit tests over the generated code, the tests
also support mixing in manually written `$lang-extras` files into
the generated tree. For example, given the following input:
```
testdata/
my-simple-schema/
schema.json
go/
go-extras/
tests/
go_test.go
```
The system will copy `go-extras/tests/go_test.go` into
`go/tests/go_test.go` before performing compilation and unit test
checks over the project generated in `go`.