- qa issues: intelligent issue triage with priority grouping - Groups: needs response, ready to work, blocked, needs triage - Flags: --mine, --triage, --blocked Closes #61 - qa health: aggregate CI health across all repos - Shows passing/failing/pending summary - Flag: --problems for filtering Closes #63 - dev workflow: CI template management - list: show workflows across repos - sync: copy workflow to repos (with --dry-run) Closes #54 Co-authored-by: Claude <noreply@anthropic.com>
107 lines
3.1 KiB
Go
107 lines
3.1 KiB
Go
package dev
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestFindWorkflows_Good(t *testing.T) {
|
|
// Create a temp directory with workflow files
|
|
tmpDir := t.TempDir()
|
|
workflowsDir := filepath.Join(tmpDir, ".github", "workflows")
|
|
if err := os.MkdirAll(workflowsDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create workflows dir: %v", err)
|
|
}
|
|
|
|
// Create some workflow files
|
|
for _, name := range []string{"qa.yml", "tests.yml", "codeql.yaml"} {
|
|
if err := os.WriteFile(filepath.Join(workflowsDir, name), []byte("name: Test"), 0644); err != nil {
|
|
t.Fatalf("Failed to create workflow file: %v", err)
|
|
}
|
|
}
|
|
|
|
// Create a non-workflow file (should be ignored)
|
|
if err := os.WriteFile(filepath.Join(workflowsDir, "readme.md"), []byte("# Workflows"), 0644); err != nil {
|
|
t.Fatalf("Failed to create readme file: %v", err)
|
|
}
|
|
|
|
workflows := findWorkflows(tmpDir)
|
|
|
|
if len(workflows) != 3 {
|
|
t.Errorf("Expected 3 workflows, got %d", len(workflows))
|
|
}
|
|
|
|
// Check that all expected workflows are found
|
|
found := make(map[string]bool)
|
|
for _, wf := range workflows {
|
|
found[wf] = true
|
|
}
|
|
|
|
for _, expected := range []string{"qa.yml", "tests.yml", "codeql.yaml"} {
|
|
if !found[expected] {
|
|
t.Errorf("Expected to find workflow %s", expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFindWorkflows_NoWorkflowsDir(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
workflows := findWorkflows(tmpDir)
|
|
|
|
if len(workflows) != 0 {
|
|
t.Errorf("Expected 0 workflows for non-existent dir, got %d", len(workflows))
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_Good(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
templatesDir := filepath.Join(tmpDir, ".github", "workflow-templates")
|
|
if err := os.MkdirAll(templatesDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create templates dir: %v", err)
|
|
}
|
|
|
|
templateContent := "name: QA\non: [push]"
|
|
if err := os.WriteFile(filepath.Join(templatesDir, "qa.yml"), []byte(templateContent), 0644); err != nil {
|
|
t.Fatalf("Failed to create template file: %v", err)
|
|
}
|
|
|
|
// Test finding with .yml extension
|
|
result := findTemplateWorkflow(tmpDir, "qa.yml")
|
|
if result == "" {
|
|
t.Error("Expected to find qa.yml template")
|
|
}
|
|
|
|
// Test finding without extension (should auto-add .yml)
|
|
result = findTemplateWorkflow(tmpDir, "qa")
|
|
if result == "" {
|
|
t.Error("Expected to find qa template without extension")
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_FallbackToWorkflows(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
workflowsDir := filepath.Join(tmpDir, ".github", "workflows")
|
|
if err := os.MkdirAll(workflowsDir, 0755); err != nil {
|
|
t.Fatalf("Failed to create workflows dir: %v", err)
|
|
}
|
|
|
|
templateContent := "name: Tests\non: [push]"
|
|
if err := os.WriteFile(filepath.Join(workflowsDir, "tests.yml"), []byte(templateContent), 0644); err != nil {
|
|
t.Fatalf("Failed to create workflow file: %v", err)
|
|
}
|
|
|
|
result := findTemplateWorkflow(tmpDir, "tests.yml")
|
|
if result == "" {
|
|
t.Error("Expected to find tests.yml in workflows dir")
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_NotFound(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
|
|
result := findTemplateWorkflow(tmpDir, "nonexistent.yml")
|
|
if result != "" {
|
|
t.Errorf("Expected empty string for non-existent template, got %s", result)
|
|
}
|
|
}
|