diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/handlers/buckets_web_test.go | 1 | ||||
| -rw-r--r-- | internal/handlers/handlers_test.go | 110 | ||||
| -rw-r--r-- | internal/handlers/settings.go | 54 | ||||
| -rw-r--r-- | internal/models/types.go | 7 | ||||
| -rw-r--r-- | internal/store/sqlite.go | 61 | ||||
| -rw-r--r-- | internal/store/sqlite_test.go | 94 |
6 files changed, 0 insertions, 327 deletions
diff --git a/internal/handlers/buckets_web_test.go b/internal/handlers/buckets_web_test.go index 9e09ca0..befdc01 100644 --- a/internal/handlers/buckets_web_test.go +++ b/internal/handlers/buckets_web_test.go @@ -169,7 +169,6 @@ func TestHandleSettingsPage_IncludesBucketsProjectsLabels(t *testing.T) { data, ok := lastCall.Data.(struct { Configs map[string][]models.SourceConfig Sources []string - Toggles []models.FeatureToggle SyncLog []store.SyncLogEntry Agents []models.Agent Buckets []models.BucketSummary diff --git a/internal/handlers/handlers_test.go b/internal/handlers/handlers_test.go index 9d92faa..4c776b0 100644 --- a/internal/handlers/handlers_test.go +++ b/internal/handlers/handlers_test.go @@ -1122,116 +1122,6 @@ func TestHandleUnifiedAdd_MissingContent(t *testing.T) { } // ============================================================================= -// Settings Handler Tests -// ============================================================================= - -func TestHandleToggleFeature(t *testing.T) { - db, cleanup := setupTestDB(t) - defer cleanup() - - h := &Handler{ - store: db, - renderer: newTestRenderer(), - config: &config.Config{}, - } - - // Create a feature toggle - _ = db.CreateFeatureToggle("test_feature", "Test feature", false) - - req := httptest.NewRequest("POST", "/settings/feature/toggle", nil) - req.Form = map[string][]string{ - "name": {"test_feature"}, - "enabled": {"true"}, - } - w := httptest.NewRecorder() - - h.HandleToggleFeature(w, req) - - if w.Code != http.StatusOK { - t.Errorf("Expected status 200, got %d", w.Code) - } - - // Verify feature was enabled - if !db.IsFeatureEnabled("test_feature") { - t.Error("Feature should be enabled after toggle") - } -} - -func TestHandleCreateFeature(t *testing.T) { - db, cleanup := setupTestDB(t) - defer cleanup() - - h := &Handler{ - store: db, - renderer: newTestRenderer(), - config: &config.Config{}, - } - - req := httptest.NewRequest("POST", "/settings/feature/create", nil) - req.Form = map[string][]string{ - "name": {"new_feature"}, - "description": {"A new feature"}, - } - w := httptest.NewRecorder() - - h.HandleCreateFeature(w, req) - - if w.Code != http.StatusOK { - t.Errorf("Expected status 200, got %d", w.Code) - } - - // Verify feature was created - toggles, _ := db.GetFeatureToggles() - found := false - for _, t := range toggles { - if t.Name == "new_feature" { - found = true - break - } - } - if !found { - t.Error("Feature should be created") - } -} - -func TestHandleDeleteFeature(t *testing.T) { - db, cleanup := setupTestDB(t) - defer cleanup() - - h := &Handler{ - store: db, - renderer: newTestRenderer(), - config: &config.Config{}, - } - - // Create a feature to delete - _ = db.CreateFeatureToggle("delete_me", "To be deleted", false) - - req := httptest.NewRequest("DELETE", "/settings/feature/delete_me", nil) - - // Add chi URL params - rctx := chi.NewRouteContext() - rctx.URLParams.Add("name", "delete_me") - req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx)) - - w := httptest.NewRecorder() - - h.HandleDeleteFeature(w, req) - - if w.Code != http.StatusOK { - t.Errorf("Expected status 200, got %d", w.Code) - } - - // Verify feature was deleted - toggles, _ := db.GetFeatureToggles() - for _, toggle := range toggles { - if toggle.Name == "delete_me" { - t.Error("Feature should be deleted") - } - } -} - -// ============================================================================= // Response Helper Tests // ============================================================================= diff --git a/internal/handlers/settings.go b/internal/handlers/settings.go index 43fce20..5ba3724 100644 --- a/internal/handlers/settings.go +++ b/internal/handlers/settings.go @@ -4,8 +4,6 @@ import ( "encoding/json" "net/http" - "github.com/go-chi/chi/v5" - "task-dashboard/internal/auth" "task-dashboard/internal/models" "task-dashboard/internal/store" @@ -14,7 +12,6 @@ import ( // HandleSettingsPage renders the settings page func (h *Handler) HandleSettingsPage(w http.ResponseWriter, r *http.Request) { configs, _ := h.store.GetSourceConfigs() - toggles, _ := h.store.GetFeatureToggles() syncLog, _ := h.store.GetRecentSyncLog(20) agents, _ := h.store.GetAllAgents() buckets, _ := BuildBucketSummaries(h.store) @@ -30,7 +27,6 @@ func (h *Handler) HandleSettingsPage(w http.ResponseWriter, r *http.Request) { data := struct { Configs map[string][]models.SourceConfig Sources []string - Toggles []models.FeatureToggle SyncLog []store.SyncLogEntry Agents []models.Agent Buckets []models.BucketSummary @@ -41,7 +37,6 @@ func (h *Handler) HandleSettingsPage(w http.ResponseWriter, r *http.Request) { }{ Configs: bySource, Sources: []string{"trello", "gcal", "gtasks"}, - Toggles: toggles, SyncLog: syncLog, Agents: agents, Buckets: buckets, @@ -163,52 +158,3 @@ func (h *Handler) HandleToggleSourceConfig(w http.ResponseWriter, r *http.Reques json.NewEncoder(w).Encode(map[string]bool{"enabled": enabled}) } -// HandleToggleFeature toggles a feature flag -func (h *Handler) HandleToggleFeature(w http.ResponseWriter, r *http.Request) { - name, ok := requireFormValue(w, r, "name") - if !ok { - return - } - enabled := r.FormValue("enabled") == "true" - - if err := h.store.SetFeatureEnabled(name, enabled); err != nil { - JSONError(w, http.StatusInternalServerError, "Failed to update feature", err) - return - } - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(map[string]bool{"enabled": enabled}) -} - -// HandleCreateFeature creates a new feature toggle -func (h *Handler) HandleCreateFeature(w http.ResponseWriter, r *http.Request) { - name, ok := requireFormValue(w, r, "name") - if !ok { - return - } - description := r.FormValue("description") - - if err := h.store.CreateFeatureToggle(name, description, false); err != nil { - JSONError(w, http.StatusInternalServerError, "Failed to create feature", err) - return - } - - // Return updated toggles list - h.HandleSettingsPage(w, r) -} - -// HandleDeleteFeature removes a feature toggle -func (h *Handler) HandleDeleteFeature(w http.ResponseWriter, r *http.Request) { - name := chi.URLParam(r, "name") - if name == "" { - JSONError(w, http.StatusBadRequest, "Feature name required", nil) - return - } - - if err := h.store.DeleteFeatureToggle(name); err != nil { - JSONError(w, http.StatusInternalServerError, "Failed to delete feature", err) - return - } - - w.WriteHeader(http.StatusOK) -} diff --git a/internal/models/types.go b/internal/models/types.go index 151ef54..41ba162 100644 --- a/internal/models/types.go +++ b/internal/models/types.go @@ -339,10 +339,3 @@ type SourceConfig struct { Enabled bool `json:"enabled"` } -// FeatureToggle represents a feature flag -type FeatureToggle struct { - ID int64 `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - Enabled bool `json:"enabled"` -} diff --git a/internal/store/sqlite.go b/internal/store/sqlite.go index d48cb09..2a062ff 100644 --- a/internal/store/sqlite.go +++ b/internal/store/sqlite.go @@ -628,67 +628,6 @@ func (s *Store) InvalidateAllCaches() error { return err } -// Feature toggles - -// GetFeatureToggles returns all feature toggles -func (s *Store) GetFeatureToggles() ([]models.FeatureToggle, error) { - rows, err := s.db.Query(` - SELECT id, name, description, enabled FROM feature_toggles ORDER BY name - `) - if err != nil { - return nil, err - } - defer func() { _ = rows.Close() }() - - var toggles []models.FeatureToggle - for rows.Next() { - var t models.FeatureToggle - var desc sql.NullString - if err := rows.Scan(&t.ID, &t.Name, &desc, &t.Enabled); err != nil { - return nil, err - } - if desc.Valid { - t.Description = desc.String - } - toggles = append(toggles, t) - } - return toggles, rows.Err() -} - -// IsFeatureEnabled checks if a feature toggle is enabled -func (s *Store) IsFeatureEnabled(name string) bool { - var enabled bool - err := s.db.QueryRow(`SELECT enabled FROM feature_toggles WHERE name = ?`, name).Scan(&enabled) - if err != nil { - return false - } - return enabled -} - -// SetFeatureEnabled updates a feature toggle's enabled state -func (s *Store) SetFeatureEnabled(name string, enabled bool) error { - _, err := s.db.Exec(` - UPDATE feature_toggles SET enabled = ?, updated_at = datetime('now', 'localtime') - WHERE name = ? - `, enabled, name) - return err -} - -// CreateFeatureToggle creates a new feature toggle -func (s *Store) CreateFeatureToggle(name, description string, enabled bool) error { - _, err := s.db.Exec(` - INSERT INTO feature_toggles (name, description, enabled) - VALUES (?, ?, ?) - `, name, description, enabled) - return err -} - -// DeleteFeatureToggle removes a feature toggle -func (s *Store) DeleteFeatureToggle(name string) error { - _, err := s.db.Exec(`DELETE FROM feature_toggles WHERE name = ?`, name) - return err -} - // SyncLogEntry represents a single entry in the sync activity log type SyncLogEntry struct { ID int64 diff --git a/internal/store/sqlite_test.go b/internal/store/sqlite_test.go index 7f7e56d..c64e6b3 100644 --- a/internal/store/sqlite_test.go +++ b/internal/store/sqlite_test.go @@ -642,100 +642,6 @@ func TestGetCardsByDateRange(t *testing.T) { // ============================================================================= // ============================================================================= -// Feature Toggles Tests -// ============================================================================= - -func setupTestStoreWithFeatureToggles(t *testing.T) *Store { - t.Helper() - - tempDir := t.TempDir() - dbPath := filepath.Join(tempDir, "test.db") - - db, err := sql.Open("sqlite3", dbPath) - if err != nil { - t.Fatalf("Failed to open test database: %v", err) - } - - db.SetMaxOpenConns(1) - store := &Store{db: db} - - schema := ` - CREATE TABLE IF NOT EXISTS feature_toggles ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - description TEXT, - enabled BOOLEAN DEFAULT FALSE, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME DEFAULT CURRENT_TIMESTAMP - ); - ` - if _, err := db.Exec(schema); err != nil { - t.Fatalf("Failed to create schema: %v", err) - } - - return store -} - -func TestFeatureToggles_CRUD(t *testing.T) { - store := setupTestStoreWithFeatureToggles(t) - defer func() { _ = store.Close() }() - - // Create feature toggle - if err := store.CreateFeatureToggle("new_feature", "A new feature", false); err != nil { - t.Fatalf("Failed to create feature toggle: %v", err) - } - - // Get all toggles - toggles, err := store.GetFeatureToggles() - if err != nil { - t.Fatalf("Failed to get feature toggles: %v", err) - } - if len(toggles) != 1 { - t.Errorf("Expected 1 toggle, got %d", len(toggles)) - } - if toggles[0].Name != "new_feature" { - t.Errorf("Expected name 'new_feature', got '%s'", toggles[0].Name) - } - if toggles[0].Enabled { - t.Error("New feature should be disabled") - } - - // Check if enabled - if store.IsFeatureEnabled("new_feature") { - t.Error("IsFeatureEnabled should return false for disabled feature") - } - - // Enable feature - if err := store.SetFeatureEnabled("new_feature", true); err != nil { - t.Fatalf("Failed to enable feature: %v", err) - } - - if !store.IsFeatureEnabled("new_feature") { - t.Error("IsFeatureEnabled should return true after enabling") - } - - // Delete feature - if err := store.DeleteFeatureToggle("new_feature"); err != nil { - t.Fatalf("Failed to delete feature toggle: %v", err) - } - - toggles, _ = store.GetFeatureToggles() - if len(toggles) != 0 { - t.Errorf("Expected 0 toggles after delete, got %d", len(toggles)) - } -} - -func TestIsFeatureEnabled_NonExistent(t *testing.T) { - store := setupTestStoreWithFeatureToggles(t) - defer func() { _ = store.Close() }() - - // Non-existent feature should return false - if store.IsFeatureEnabled("does_not_exist") { - t.Error("Non-existent feature should return false") - } -} - -// ============================================================================= // Completed Tasks Tests // ============================================================================= |
