// internal/store/estimate_inference_test.go package store import ( "testing" "time" "task-dashboard/internal/models" ) func TestAverageEstimateForProject_AveragesUserEnteredEstimates(t *testing.T) { s := newNativeTasksTestStore(t) project, err := s.CreateProject("Sailing prep", "#3B82F6") if err != nil { t.Fatal(err) } due := time.Now() for _, minutes := range []int{30, 60} { task := models.Task{ID: newTaskID(), Content: "task", ProjectID: project.ID, EstimatedMinutes: minutes, DueDate: &due} if err := s.CreateNativeTask(task); err != nil { t.Fatal(err) } } // An unestimated task under the same project must not skew the average. if err := s.CreateNativeTask(models.Task{ID: "t-unestimated", Content: "no estimate", ProjectID: project.ID}); err != nil { t.Fatal(err) } avg, ok, err := s.AverageEstimateForProject(project.ID) if err != nil { t.Fatalf("AverageEstimateForProject: %v", err) } if !ok { t.Fatal("expected ok = true") } if avg != 45 { t.Errorf("avg = %d, want 45", avg) } } func TestAverageEstimateForProject_NoEstimatedTasks_ReturnsNotOK(t *testing.T) { s := newNativeTasksTestStore(t) project, err := s.CreateProject("Empty", "#111111") if err != nil { t.Fatal(err) } _, ok, err := s.AverageEstimateForProject(project.ID) if err != nil { t.Fatal(err) } if ok { t.Error("expected ok = false when no tasks have an estimate") } } func TestAverageEstimateForLabel_AveragesUserEnteredEstimates(t *testing.T) { s := newNativeTasksTestStore(t) for _, minutes := range []int{20, 40} { task := models.Task{ID: newTaskID(), Content: "task", Labels: []string{"errands"}, EstimatedMinutes: minutes} if err := s.CreateNativeTask(task); err != nil { t.Fatal(err) } } if err := s.CreateNativeTask(models.Task{ID: "t-other-label", Content: "other", Labels: []string{"unrelated"}, EstimatedMinutes: 100}); err != nil { t.Fatal(err) } avg, ok, err := s.AverageEstimateForLabel("errands") if err != nil { t.Fatalf("AverageEstimateForLabel: %v", err) } if !ok { t.Fatal("expected ok = true") } if avg != 30 { t.Errorf("avg = %d, want 30", avg) } } func TestAverageEstimateForLabel_NoMatches_ReturnsNotOK(t *testing.T) { s := newNativeTasksTestStore(t) _, ok, err := s.AverageEstimateForLabel("nonexistent") if err != nil { t.Fatal(err) } if ok { t.Error("expected ok = false") } }