240 lines
6 KiB
Go
240 lines
6 KiB
Go
package qa
|
|
|
|
import (
|
|
"encoding/json"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"forge.lthn.ai/core/cli/pkg/cli"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRunHealthJSONOutput_UsesMachineFriendlyKeysAndKeepsFetchErrors(t *testing.T) {
|
|
dir := t.TempDir()
|
|
writeTestFile(t, filepath.Join(dir, "repos.yaml"), `version: 1
|
|
org: forge
|
|
base_path: .
|
|
repos:
|
|
alpha:
|
|
type: module
|
|
beta:
|
|
type: module
|
|
`)
|
|
writeExecutable(t, filepath.Join(dir, "gh"), `#!/bin/sh
|
|
case "$*" in
|
|
*"--repo forge/alpha"*)
|
|
cat <<'JSON'
|
|
[
|
|
{
|
|
"status": "completed",
|
|
"conclusion": "success",
|
|
"name": "CI",
|
|
"headSha": "abc123",
|
|
"updatedAt": "2026-03-30T00:00:00Z",
|
|
"url": "https://example.com/alpha/run/1"
|
|
}
|
|
]
|
|
JSON
|
|
;;
|
|
*"--repo forge/beta"*)
|
|
printf '%s\n' 'simulated workflow lookup failure' >&2
|
|
exit 1
|
|
;;
|
|
*)
|
|
printf '%s\n' "unexpected gh invocation: $*" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
`)
|
|
|
|
restoreWorkingDir(t, dir)
|
|
prependPath(t, dir)
|
|
resetHealthFlags(t)
|
|
t.Cleanup(func() {
|
|
healthRegistry = ""
|
|
})
|
|
|
|
parent := &cli.Command{Use: "qa"}
|
|
addHealthCommand(parent)
|
|
command := findSubcommand(t, parent, "health")
|
|
require.NoError(t, command.Flags().Set("registry", filepath.Join(dir, "repos.yaml")))
|
|
require.NoError(t, command.Flags().Set("json", "true"))
|
|
|
|
output := captureStdout(t, func() {
|
|
require.NoError(t, command.RunE(command, nil))
|
|
})
|
|
|
|
var payload HealthOutput
|
|
require.NoError(t, json.Unmarshal([]byte(output), &payload))
|
|
assert.Equal(t, 2, payload.Summary.TotalRepos)
|
|
assert.Equal(t, 1, payload.Summary.Passing)
|
|
assert.Equal(t, 1, payload.Summary.Errors)
|
|
assert.Equal(t, 2, payload.Summary.FilteredRepos)
|
|
assert.Len(t, payload.Summary.ByStatus, 6)
|
|
assert.Equal(t, 1, payload.Summary.ByStatus["passing"])
|
|
assert.Equal(t, 1, payload.Summary.ByStatus["error"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["pending"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["disabled"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["no_ci"])
|
|
require.Len(t, payload.Repos, 2)
|
|
assert.Equal(t, "error", payload.Repos[0].Status)
|
|
assert.Equal(t, "beta", payload.Repos[0].Name)
|
|
assert.Equal(t, "passing", payload.Repos[1].Status)
|
|
assert.Equal(t, "alpha", payload.Repos[1].Name)
|
|
assert.Contains(t, output, `"status"`)
|
|
assert.NotContains(t, output, `"Status"`)
|
|
assert.NotContains(t, output, `"FailingSince"`)
|
|
}
|
|
|
|
func TestRunHealthJSONOutput_ProblemsOnlyKeepsOverallSummary(t *testing.T) {
|
|
dir := t.TempDir()
|
|
writeTestFile(t, filepath.Join(dir, "repos.yaml"), `version: 1
|
|
org: forge
|
|
base_path: .
|
|
repos:
|
|
alpha:
|
|
type: module
|
|
beta:
|
|
type: module
|
|
`)
|
|
writeExecutable(t, filepath.Join(dir, "gh"), `#!/bin/sh
|
|
case "$*" in
|
|
*"--repo forge/alpha"*)
|
|
cat <<'JSON'
|
|
[
|
|
{
|
|
"status": "completed",
|
|
"conclusion": "success",
|
|
"name": "CI",
|
|
"headSha": "abc123",
|
|
"updatedAt": "2026-03-30T00:00:00Z",
|
|
"url": "https://example.com/alpha/run/1"
|
|
}
|
|
]
|
|
JSON
|
|
;;
|
|
*"--repo forge/beta"*)
|
|
printf '%s\n' 'simulated workflow lookup failure' >&2
|
|
exit 1
|
|
;;
|
|
*)
|
|
printf '%s\n' "unexpected gh invocation: $*" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
`)
|
|
|
|
restoreWorkingDir(t, dir)
|
|
prependPath(t, dir)
|
|
resetHealthFlags(t)
|
|
t.Cleanup(func() {
|
|
healthRegistry = ""
|
|
})
|
|
|
|
parent := &cli.Command{Use: "qa"}
|
|
addHealthCommand(parent)
|
|
command := findSubcommand(t, parent, "health")
|
|
require.NoError(t, command.Flags().Set("registry", filepath.Join(dir, "repos.yaml")))
|
|
require.NoError(t, command.Flags().Set("json", "true"))
|
|
require.NoError(t, command.Flags().Set("problems", "true"))
|
|
|
|
output := captureStdout(t, func() {
|
|
require.NoError(t, command.RunE(command, nil))
|
|
})
|
|
|
|
var payload HealthOutput
|
|
require.NoError(t, json.Unmarshal([]byte(output), &payload))
|
|
assert.Equal(t, 2, payload.Summary.TotalRepos)
|
|
assert.Equal(t, 1, payload.Summary.Passing)
|
|
assert.Equal(t, 1, payload.Summary.Errors)
|
|
assert.Equal(t, 1, payload.Summary.FilteredRepos)
|
|
assert.True(t, payload.Summary.ProblemsOnly)
|
|
assert.Len(t, payload.Summary.ByStatus, 6)
|
|
assert.Equal(t, 1, payload.Summary.ByStatus["passing"])
|
|
assert.Equal(t, 1, payload.Summary.ByStatus["error"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["pending"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["disabled"])
|
|
assert.Equal(t, 0, payload.Summary.ByStatus["no_ci"])
|
|
require.Len(t, payload.Repos, 1)
|
|
assert.Equal(t, "error", payload.Repos[0].Status)
|
|
assert.Equal(t, "beta", payload.Repos[0].Name)
|
|
}
|
|
|
|
func TestRunHealthHumanOutput_ShowsFetchErrorsAsErrors(t *testing.T) {
|
|
dir := t.TempDir()
|
|
writeTestFile(t, filepath.Join(dir, "repos.yaml"), `version: 1
|
|
org: forge
|
|
base_path: .
|
|
repos:
|
|
alpha:
|
|
type: module
|
|
beta:
|
|
type: module
|
|
`)
|
|
writeExecutable(t, filepath.Join(dir, "gh"), `#!/bin/sh
|
|
case "$*" in
|
|
*"--repo forge/alpha"*)
|
|
cat <<'JSON'
|
|
[
|
|
{
|
|
"status": "completed",
|
|
"conclusion": "success",
|
|
"name": "CI",
|
|
"headSha": "abc123",
|
|
"updatedAt": "2026-03-30T00:00:00Z",
|
|
"url": "https://example.com/alpha/run/1"
|
|
}
|
|
]
|
|
JSON
|
|
;;
|
|
*"--repo forge/beta"*)
|
|
printf '%s\n' 'simulated workflow lookup failure' >&2
|
|
exit 1
|
|
;;
|
|
*)
|
|
printf '%s\n' "unexpected gh invocation: $*" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
`)
|
|
|
|
restoreWorkingDir(t, dir)
|
|
prependPath(t, dir)
|
|
resetHealthFlags(t)
|
|
t.Cleanup(func() {
|
|
healthRegistry = ""
|
|
})
|
|
|
|
parent := &cli.Command{Use: "qa"}
|
|
addHealthCommand(parent)
|
|
command := findSubcommand(t, parent, "health")
|
|
require.NoError(t, command.Flags().Set("registry", filepath.Join(dir, "repos.yaml")))
|
|
|
|
output := captureStdout(t, func() {
|
|
require.NoError(t, command.RunE(command, nil))
|
|
})
|
|
|
|
assert.Contains(t, output, "cmd.qa.health.summary")
|
|
assert.Contains(t, output, "alpha")
|
|
assert.Contains(t, output, "beta")
|
|
assert.Contains(t, output, "cmd.qa.health.fetch_error")
|
|
assert.NotContains(t, output, "no CI")
|
|
}
|
|
|
|
func resetHealthFlags(t *testing.T) {
|
|
t.Helper()
|
|
oldProblems := healthProblems
|
|
oldRegistry := healthRegistry
|
|
oldJSON := healthJSON
|
|
|
|
healthProblems = false
|
|
healthRegistry = ""
|
|
healthJSON = false
|
|
|
|
t.Cleanup(func() {
|
|
healthProblems = oldProblems
|
|
healthRegistry = oldRegistry
|
|
healthJSON = oldJSON
|
|
})
|
|
}
|