Codex 5.5 batch lane processed 26 open Mantis tickets. 13 stale-fixed, 4 implemented, 9 deferred. Tickets implemented: - #142 — agentic_sprint_start + agentic_sprint_complete MCP tools wired to /v1/sprints/{id}/{start,complete} platform endpoints with tests - #225 — cmd/core-agent/commands.go: removed raw flag parsing; startupArgs() uses Core arg filtering + local log-level strip - #226 — cmd/core-agent/main.go: syscall.Exit(1) → core.Exit(1) - #227 — pkg/agentic/dispatch.go: runtime.GOOS → Core environment-backed OS detection Tickets stale-fixed: #161, #162, #163, #166, #167, #168, #171, #172, #223, #224, #230, #231, #232, #233 Tickets deferred: #160, #164, #165, #173, #222, #228, #229, #234 Co-authored-by: Codex <noreply@openai.com> Closes tasks.lthn.sh/view.php?id=142 Closes tasks.lthn.sh/view.php?id=225 Closes tasks.lthn.sh/view.php?id=226 Closes tasks.lthn.sh/view.php?id=227
127 lines
4.8 KiB
Go
127 lines
4.8 KiB
Go
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
package agentic
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
core "dappco.re/go/core"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSprint_HandleSprintCreate_Good(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, "/v1/sprints", r.URL.Path)
|
|
require.Equal(t, http.MethodPost, r.Method)
|
|
|
|
bodyResult := core.ReadAll(r.Body)
|
|
require.True(t, bodyResult.OK)
|
|
|
|
var payload map[string]any
|
|
parseResult := core.JSONUnmarshalString(bodyResult.Value.(string), &payload)
|
|
require.True(t, parseResult.OK)
|
|
require.Equal(t, "AX Follow-up", payload["title"])
|
|
require.Equal(t, "Finish RFC parity", payload["goal"])
|
|
|
|
_, _ = w.Write([]byte(`{"data":{"slug":"ax-follow-up","title":"AX Follow-up","goal":"Finish RFC parity","status":"active"}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
subsystem := testPrepWithPlatformServer(t, server, "secret-token")
|
|
result := subsystem.handleSprintCreate(context.Background(), core.NewOptions(
|
|
core.Option{Key: "title", Value: "AX Follow-up"},
|
|
core.Option{Key: "goal", Value: "Finish RFC parity"},
|
|
))
|
|
require.True(t, result.OK)
|
|
|
|
output, ok := result.Value.(SprintOutput)
|
|
require.True(t, ok)
|
|
assert.True(t, output.Success)
|
|
assert.Equal(t, "ax-follow-up", output.Sprint.Slug)
|
|
assert.Equal(t, "active", output.Sprint.Status)
|
|
}
|
|
|
|
func TestSprint_HandleSprintGet_Bad(t *testing.T) {
|
|
subsystem := testPrepWithPlatformServer(t, nil, "secret-token")
|
|
|
|
result := subsystem.handleSprintGet(context.Background(), core.NewOptions())
|
|
assert.False(t, result.OK)
|
|
assert.EqualError(t, result.Value.(error), "sprintGet: id or slug is required")
|
|
}
|
|
|
|
func TestSprint_HandleSprintGet_Good_IDAlias(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, "/v1/sprints/7", r.URL.Path)
|
|
_, _ = w.Write([]byte(`{"data":{"id":7,"slug":"ax-follow-up","title":"AX Follow-up","status":"active"}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
subsystem := testPrepWithPlatformServer(t, server, "secret-token")
|
|
result := subsystem.handleSprintGet(context.Background(), core.NewOptions(
|
|
core.Option{Key: "id", Value: "7"},
|
|
))
|
|
require.True(t, result.OK)
|
|
|
|
output, ok := result.Value.(SprintOutput)
|
|
require.True(t, ok)
|
|
assert.Equal(t, 7, output.Sprint.ID)
|
|
assert.Equal(t, "ax-follow-up", output.Sprint.Slug)
|
|
}
|
|
|
|
func TestSprint_HandleSprintList_Ugly_NestedEnvelope(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, "/v1/sprints", r.URL.Path)
|
|
require.Equal(t, "active", r.URL.Query().Get("status"))
|
|
_, _ = w.Write([]byte(`{"data":{"sprints":[{"id":4,"workspace_id":2,"slug":"ax-follow-up","title":"AX Follow-up","goal":"Finish RFC parity","status":"active"}],"total":1}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
subsystem := testPrepWithPlatformServer(t, server, "secret-token")
|
|
result := subsystem.handleSprintList(context.Background(), core.NewOptions(
|
|
core.Option{Key: "status", Value: "active"},
|
|
))
|
|
require.True(t, result.OK)
|
|
|
|
output, ok := result.Value.(SprintListOutput)
|
|
require.True(t, ok)
|
|
require.Len(t, output.Sprints, 1)
|
|
assert.Equal(t, 1, output.Count)
|
|
assert.Equal(t, 2, output.Sprints[0].WorkspaceID)
|
|
assert.Equal(t, "Finish RFC parity", output.Sprints[0].Goal)
|
|
}
|
|
|
|
func TestSprint_SprintStart_Good(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, "/v1/sprints/ax-follow-up/start", r.URL.Path)
|
|
require.Equal(t, http.MethodPost, r.Method)
|
|
_, _ = w.Write([]byte(`{"data":{"sprint":{"slug":"ax-follow-up","title":"AX Follow-up","status":"active"}}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
subsystem := testPrepWithPlatformServer(t, server, "secret-token")
|
|
_, output, err := subsystem.sprintStart(context.Background(), nil, SprintTransitionInput{Slug: "ax-follow-up"})
|
|
require.NoError(t, err)
|
|
assert.True(t, output.Success)
|
|
assert.Equal(t, "ax-follow-up", output.Sprint.Slug)
|
|
assert.Equal(t, "active", output.Sprint.Status)
|
|
}
|
|
|
|
func TestSprint_SprintComplete_Good(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, "/v1/sprints/7/complete", r.URL.Path)
|
|
require.Equal(t, http.MethodPost, r.Method)
|
|
_, _ = w.Write([]byte(`{"data":{"sprint":{"id":7,"slug":"ax-follow-up","title":"AX Follow-up","status":"completed"}}}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
subsystem := testPrepWithPlatformServer(t, server, "secret-token")
|
|
_, output, err := subsystem.sprintComplete(context.Background(), nil, SprintTransitionInput{ID: "7"})
|
|
require.NoError(t, err)
|
|
assert.True(t, output.Success)
|
|
assert.Equal(t, 7, output.Sprint.ID)
|
|
assert.Equal(t, "completed", output.Sprint.Status)
|
|
}
|