grokkit/cmd/workon_test.go
Greg Gauthier 5c9689e4da
Some checks failed
CI / Test (push) Successful in 40s
CI / Lint (push) Failing after 20s
CI / Build (push) Successful in 22s
test: add unit tests for cmd, config, git, linter, logger, prompts, todo, and workon
- Introduce tests for analyze, recipe, workon commands
- Expand scaffold tests with language detection and context harvesting
- Add tests for config getters, git utilities (tags, logs, diff)
- Enhance linter with primary language detection tests
- Cover logger level setting branches
- New prompts loading tests with local/global fallback
- Todo bootstrap and structure tests
- Comprehensive workon flow tests including file moves, git integration, README updates
- Update README coverage from 54% to 62%
2026-03-31 22:47:36 +01:00

108 lines
2.6 KiB
Go

package cmd
import (
"os"
"testing"
)
// TestWorkonCmd — FAST DEFAULT TEST (runs on make test / go test ./cmd)
func TestWorkonCmd(t *testing.T) {
t.Log("✓ Fast workon unit test (no Grok API call)")
// Verify the command is registered
found := false
for _, c := range rootCmd.Commands() {
if c.Use == "workon <todo_item_title>" {
found = true
break
}
}
if !found {
t.Fatal("workon command not registered on rootCmd")
}
}
func TestWorkonFlagRegistration(t *testing.T) {
tests := []struct {
name string
flagName string
shorthand string
}{
{"message flag", "message", "M"},
{"fix flag", "fix", "f"},
{"complete flag", "complete", "c"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
flag := workonCmd.Flags().Lookup(tt.flagName)
if flag == nil {
t.Fatalf("flag %q not found on workon command", tt.flagName)
}
if flag.Shorthand != tt.shorthand {
t.Errorf("flag %q shorthand = %q, want %q", tt.flagName, flag.Shorthand, tt.shorthand)
}
})
}
}
func TestWorkonFlagExclusivity(t *testing.T) {
// Run in a temp dir so todo.Bootstrap() doesn't leave orphan dirs in cmd/
tmpDir := t.TempDir()
origDir, _ := os.Getwd()
if err := os.Chdir(tmpDir); err != nil {
t.Fatal(err)
}
defer func() { _ = os.Chdir(origDir) }()
tests := []struct {
name string
args []string
expectErr bool
}{
{
name: "complete alone is valid",
args: []string{"workon", "test-item", "-c"},
expectErr: false, // will fail at Run level (no git repo), but not at flag validation
},
{
name: "complete with fix is valid",
args: []string{"workon", "test-item", "-c", "-f"},
expectErr: false,
},
{
name: "complete with message is invalid",
args: []string{"workon", "test-item", "-c", "-M", "some msg"},
expectErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rootCmd.SetArgs(tt.args)
err := rootCmd.Execute()
if tt.expectErr && err == nil {
t.Error("expected error, got nil")
}
// Note: non-error cases may still fail (no git, no API key, etc.)
// We only assert that the flag validation error fires when expected
if tt.expectErr && err != nil {
// Verify it's the right error
if err.Error() != "-c cannot be combined with -m" {
// The error might be wrapped
t.Logf("got error: %v (flag validation may have been triggered)", err)
}
}
})
}
}
func TestWorkonRequiresArgs(t *testing.T) {
rootCmd.SetArgs([]string{"workon"})
err := rootCmd.Execute()
if err == nil {
t.Error("expected error when no args provided, got nil")
}
}