package statuses_test import ( "context" "database/sql" "path/filepath" "strings" "testing" "vibetree/internal/database" "vibetree/internal/statuses" ) func testDB(t *testing.T) *sql.DB { t.Helper() dir := t.TempDir() db, err := database.Open(filepath.Join(dir, "test.db")) if err != nil { t.Fatalf("open db: %v", err) } t.Cleanup(func() { db.Close() }) return db } func TestImportCreatesAndUpdatesByName(t *testing.T) { ctx := context.Background() s := statuses.NewStore(testDB(t)) // "In Use" already exists from seed data; this should update its // color rather than create a duplicate, and create "Awaiting Parts". csvData := "Name,Color\nIn Use,primary\nAwaiting Parts,warning\n" result, err := s.Import(ctx, strings.NewReader(csvData)) if err != nil { t.Fatalf("import: %v", err) } if result.Created != 1 || result.Updated != 1 { t.Fatalf("expected 1 created, 1 updated, got %+v", result) } list, err := s.List(ctx) if err != nil { t.Fatalf("list: %v", err) } var foundInUse, foundAwaiting bool for _, st := range list { if st.Name == "In Use" { foundInUse = true if st.Color != "primary" { t.Errorf("expected In Use color updated to primary, got %s", st.Color) } } if st.Name == "Awaiting Parts" { foundAwaiting = true if st.Color != "warning" { t.Errorf("expected Awaiting Parts color warning, got %s", st.Color) } } } if !foundInUse || !foundAwaiting { t.Fatalf("expected both statuses present, got %+v", list) } } func TestImportSkipsRowsMissingName(t *testing.T) { ctx := context.Background() s := statuses.NewStore(testDB(t)) csvData := "Name,Color\n,primary\n" result, err := s.Import(ctx, strings.NewReader(csvData)) if err != nil { t.Fatalf("import: %v", err) } if result.Created != 0 || len(result.Errors) != 1 { t.Fatalf("expected 0 created and 1 error, got %+v", result) } }