mirror of
https://github.com/coder/coder.git
synced 2026-10-16 14:48:56 +08:00
Removes the Tasks API and task orchestration from coderd and codersdk: the `/api/v2/tasks` handlers, task middleware and search filters, task name generation, autobuild pause/resume logic, task notification enqueues, telemetry, and the codersdk task types. Regenerates apidoc, the API reference docs, and `typesGenerated.ts`. **Breaking change:** the Tasks API is removed; requests to `/api/v2/tasks` fail. Tasks was deprecated in v2.34. **Stack context:** Coder Tasks removal stack (CODAGT-642): #28743 frontend → #28788 CLI → #28789 API → #28790 provisioner → #29084 notifications → #29085 build reasons → #29086 tables → #28750 permissions. The last four PRs replace the single data-drop migration that used to live in #28750; each carries one concern and its own migration number. **Why:** with the UI (#28743) and CLI (#28788) gone, this deletes the server surface. Database tables, RBAC, and notification templates stay until the top of the stack so every layer builds and migrates independently. **What to scrutinize:** - The `enable-ai-tasks` option is removed outright (review feedback): configs still carrying `enableAITasks` fail to parse until the key is deleted. - provisionerdserver now writes `HasAITask: false` on template/build flags; the column and these lines are dropped in #29085. - `codersdk.ResourceTypeTask` stays so audit logs recorded before the removal keep rendering. **Validation:** `go build ./...`, `go vet ./...`, `go test ./codersdk/...`, site biome and tsc, CLI goldens regenerated, pre-commit hooks. **Size:** +242/-10,792 over 76 files; additions are regenerated docs/goldens and test fixture updates. > Created by Xum (AI agent) on behalf of @ibetitsmike.
100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package coderdtest_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/token"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/coder/coder/v2/coderd/apidoc"
|
|
"github.com/coder/coder/v2/coderd/coderdtest"
|
|
)
|
|
|
|
func TestEndpointsDocumented(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
swaggerComments, err := coderdtest.ParseSwaggerComments("..", "../workspaceconnwatcher")
|
|
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, coderdtest.WithSwaggerRoutePrefix("/api/v2"))
|
|
}
|
|
|
|
func TestChatModelPathParametersFormatted(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
var swagger struct {
|
|
Paths map[string]map[string]struct {
|
|
Parameters []struct {
|
|
Name string `json:"name"`
|
|
In string `json:"in"`
|
|
Format string `json:"format"`
|
|
} `json:"parameters"`
|
|
} `json:"paths"`
|
|
}
|
|
require.NoError(t, json.Unmarshal([]byte(apidoc.SwaggerInfo.ReadDoc()), &swagger))
|
|
|
|
operations := swagger.Paths["/api/v2/organizations/{organization}/chats/models/{model}"]
|
|
for _, method := range []string{"get", "patch", "delete"} {
|
|
t.Run(method, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for _, parameter := range operations[method].Parameters {
|
|
if parameter.Name == "model" && parameter.In == "path" {
|
|
require.Equal(t, "uuid", parameter.Format)
|
|
return
|
|
}
|
|
}
|
|
require.Fail(t, "model path parameter not found")
|
|
})
|
|
}
|
|
}
|
|
|
|
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
|
|
})
|
|
}
|
|
}
|