projects_test.go

 1package cmd
 2
 3import (
 4	"bytes"
 5	"encoding/json"
 6	"testing"
 7
 8	"github.com/charmbracelet/crush/internal/projects"
 9	"github.com/stretchr/testify/require"
10)
11
12func TestProjectsEmpty(t *testing.T) {
13	// Use a temp directory for projects.json
14	tmpDir := t.TempDir()
15	t.Setenv("XDG_DATA_HOME", tmpDir)
16
17	var b bytes.Buffer
18	projectsCmd.SetOut(&b)
19	projectsCmd.SetErr(&b)
20	projectsCmd.SetIn(bytes.NewReader(nil))
21	err := projectsCmd.RunE(projectsCmd, nil)
22	require.NoError(t, err)
23	require.Equal(t, "No projects tracked yet.\n", b.String())
24}
25
26func TestProjectsJSON(t *testing.T) {
27	tmpDir := t.TempDir()
28	t.Setenv("XDG_DATA_HOME", tmpDir)
29
30	// Register a project
31	err := projects.Register("/test/project", "/test/project/.crush")
32	require.NoError(t, err)
33
34	var b bytes.Buffer
35	projectsCmd.SetOut(&b)
36	projectsCmd.SetErr(&b)
37	projectsCmd.SetIn(bytes.NewReader(nil))
38
39	// Set the --json flag
40	projectsCmd.Flags().Set("json", "true")
41	defer projectsCmd.Flags().Set("json", "false")
42
43	err = projectsCmd.RunE(projectsCmd, nil)
44	require.NoError(t, err)
45
46	// Parse the JSON output
47	var result struct {
48		Projects []projects.Project `json:"projects"`
49	}
50	err = json.Unmarshal(b.Bytes(), &result)
51	require.NoError(t, err)
52
53	require.Len(t, result.Projects, 1)
54	require.Equal(t, "/test/project", result.Projects[0].Path)
55	require.Equal(t, "/test/project/.crush", result.Projects[0].DataDir)
56}