package coderdtest_test import ( "go/ast" "go/parser" "go/token" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/coder/coder/v2/coderd/coderdtest" ) func TestEndpointsDocumented(t *testing.T) { t.Parallel() swaggerComments, err := coderdtest.ParseSwaggerComments("..") require.NoError(t, err, "can't parse swagger comments") require.NotEmpty(t, swaggerComments, "swagger comments must be present") _, _, api := coderdtest.NewWithAPI(t, nil) coderdtest.VerifySwaggerDefinitions(t, api.APIHandler, swaggerComments) } func TestSDKFieldsFormatted(t *testing.T) { t.Parallel() fileSet := token.NewFileSet() nodes, err := parser.ParseDir(fileSet, "../../codersdk", nil, parser.ParseComments) require.NoError(t, err, "parser.ParseDir failed") for _, node := range nodes { ast.Inspect(node, func(n ast.Node) bool { typeSpec, ok := n.(*ast.TypeSpec) if !ok { return true } structureName := typeSpec.Name structType, ok := typeSpec.Type.(*ast.StructType) if !ok { return true // not a structure } for _, field := range structType.Fields.List { selectorExpr, ok := field.Type.(*ast.SelectorExpr) if !ok { continue // rather a basic, or primitive } if field.Tag == nil || !strings.Contains(field.Tag.Value, `json:"`) { continue // not a JSON property } switch selectorExpr.Sel.Name { case "UUID": assert.Contains(t, field.Tag.Value, `format:"uuid"`, `Swagger formatting requires to annotate the field with - format:"uuid". Location: %s/%s`, structureName, field.Names) case "Time": assert.Contains(t, field.Tag.Value, `format:"date-time"`, `Swagger formatting requires to annotate the field with - format:"date-time". Location: %s/%s`, structureName, field.Names) } } return true }) } }