···11package handlers
2233import (
44+ "bytes"
45 "context"
56 "os"
67 "runtime"
···12131314 "github.com/google/uuid"
1415 "github.com/stormlightlabs/noteleaf/internal/models"
1616+ "github.com/stormlightlabs/noteleaf/internal/ui"
1517)
16181719func setupTaskTest(t *testing.T) (string, func()) {
···922924 if result != "s" {
923925 t.Errorf("Expected 's' for 10, got '%s'", result)
924926 }
927927+ })
928928+ })
929929+930930+ t.Run("InteractiveComponentsStatic", func(t *testing.T) {
931931+ _, cleanup := setupTaskTest(t)
932932+ defer cleanup()
933933+934934+ handler, err := NewTaskHandler()
935935+ if err != nil {
936936+ t.Fatalf("Failed to create task handler: %v", err)
937937+ }
938938+ defer handler.Close()
939939+940940+ ctx := context.Background()
941941+942942+ err = handler.Create(ctx, []string{"Test", "Task", "1"}, "high", "test-project", "test-context", "", []string{"tag1"})
943943+ if err != nil {
944944+ t.Fatalf("Failed to create test task: %v", err)
945945+ }
946946+947947+ err = handler.Create(ctx, []string{"Test", "Task", "2"}, "medium", "test-project", "test-context", "", []string{"tag2"})
948948+ if err != nil {
949949+ t.Fatalf("Failed to create test task: %v", err)
950950+ }
951951+952952+ t.Run("taskListStaticMode", func(t *testing.T) {
953953+ var output bytes.Buffer
954954+955955+ t.Run("lists all tasks", func(t *testing.T) {
956956+ output.Reset()
957957+ taskTable := ui.NewTaskListFromTable(handler.repos.Tasks, &output, os.Stdin, true, true, "", "", "")
958958+ err := taskTable.Browse(ctx)
959959+ if err != nil {
960960+ t.Errorf("Static task list should succeed: %v", err)
961961+ }
962962+ if !strings.Contains(output.String(), "Test Task 1") {
963963+ t.Error("Output should contain Test Task 1")
964964+ }
965965+ if !strings.Contains(output.String(), "Test Task 2") {
966966+ t.Error("Output should contain Test Task 2")
967967+ }
968968+ })
969969+970970+ t.Run("filters by status", func(t *testing.T) {
971971+ output.Reset()
972972+ taskTable := ui.NewTaskListFromTable(handler.repos.Tasks, &output, os.Stdin, true, false, "pending", "", "")
973973+ err := taskTable.Browse(ctx)
974974+ if err != nil {
975975+ t.Errorf("Static task list with status filter should succeed: %v", err)
976976+ }
977977+ })
978978+979979+ t.Run("filters by priority", func(t *testing.T) {
980980+ output.Reset()
981981+ taskTable := ui.NewTaskListFromTable(handler.repos.Tasks, &output, os.Stdin, true, false, "", "high", "")
982982+ err := taskTable.Browse(ctx)
983983+ if err != nil {
984984+ t.Errorf("Static task list with priority filter should succeed: %v", err)
985985+ }
986986+ })
987987+988988+ t.Run("filters by project", func(t *testing.T) {
989989+ output.Reset()
990990+ taskTable := ui.NewTaskListFromTable(handler.repos.Tasks, &output, os.Stdin, true, false, "", "", "test-project")
991991+ err := taskTable.Browse(ctx)
992992+ if err != nil {
993993+ t.Errorf("Static task list with project filter should succeed: %v", err)
994994+ }
995995+ })
996996+ })
997997+998998+ t.Run("projectListStaticMode", func(t *testing.T) {
999999+ var output bytes.Buffer
10001000+10011001+ t.Run("lists projects", func(t *testing.T) {
10021002+ output.Reset()
10031003+ projectTable := ui.NewProjectListFromTable(handler.repos.Tasks, &output, os.Stdin, true)
10041004+ err := projectTable.Browse(ctx)
10051005+ if err != nil {
10061006+ t.Errorf("Static project list should succeed: %v", err)
10071007+ }
10081008+ if !strings.Contains(output.String(), "test-project") {
10091009+ t.Error("Output should contain test-project")
10101010+ }
10111011+ })
10121012+ })
10131013+10141014+ t.Run("tagListStaticMode", func(t *testing.T) {
10151015+ var output bytes.Buffer
10161016+10171017+ t.Run("lists tags", func(t *testing.T) {
10181018+ output.Reset()
10191019+ tagTable := ui.NewTagListFromTable(handler.repos.Tasks, &output, os.Stdin, true)
10201020+ err := tagTable.Browse(ctx)
10211021+ if err != nil {
10221022+ t.Errorf("Static tag list should succeed: %v", err)
10231023+ }
10241024+ if !strings.Contains(output.String(), "tag1") {
10251025+ t.Error("Output should contain tag1")
10261026+ }
10271027+ })
9251028 })
9261029 })
9271030}
+2-2
justfile
···1515 @echo "Coverage report generated: coverage.html"
16161717# Run tests and show coverage in terminal
1818-test-coverage:
1818+cov:
1919 go test ./... -coverprofile=coverage.out
2020 go tool cover -func=coverage.out
2121···3636 go fmt ./...
37373838# Run all quality checks
3939-check: lint test-coverage
3939+check: lint cov
40404141# Install dependencies
4242deps: