diff --git a/src/server/routes.go b/src/server/routes.go index 9cdef97..603d3c0 100644 --- a/src/server/routes.go +++ b/src/server/routes.go @@ -141,12 +141,10 @@ func (s *Server) handleFolder(c *router.Context) { c.Out.WriteHeader(http.StatusBadRequest) return } - if body.Title != nil { - s.db.RenameFolder(id, *body.Title) - } - if body.IsExpanded != nil { - s.db.ToggleFolderExpanded(id, *body.IsExpanded) - } + s.db.UpdateFolder(id, storage.UpdateFolderParams{ + Title: body.Title, + IsExpanded: body.IsExpanded, + }) c.Out.WriteHeader(http.StatusOK) } else if c.Req.Method == "DELETE" { s.db.DeleteFolder(id) diff --git a/src/storage/folder.go b/src/storage/folder.go index c06875a..a929631 100644 --- a/src/storage/folder.go +++ b/src/storage/folder.go @@ -38,20 +38,27 @@ func (s *Storage) DeleteFolder(folderId int64) bool { return err == nil } -func (s *Storage) RenameFolder(folderId int64, newTitle string) bool { - _, err := s.db.Exec(`update folders set title = :title where id = :id`, - sql.Named("title", newTitle), - sql.Named("id", folderId), - ) - return err == nil +type UpdateFolderParams struct { + Title *string + IsExpanded *bool } -func (s *Storage) ToggleFolderExpanded(folderId int64, isExpanded bool) bool { - _, err := s.db.Exec(`update folders set is_expanded = :is_expanded where id = :id`, - sql.Named("is_expanded", isExpanded), +func (s *Storage) UpdateFolder(folderId int64, params UpdateFolderParams) (bool, error) { + _, err := s.db.Exec(` + update folders set + title = coalesce(:title, title), + is_expanded = coalesce(:is_expanded, is_expanded) + where id = :id + `, sql.Named("id", folderId), + sql.Named("title", params.Title), + sql.Named("is_expanded", params.IsExpanded), ) - return err == nil + if err != nil { + log.Print(err) + return false, err + } + return true, nil } func (s *Storage) ListFolders() []Folder { diff --git a/src/storage/folder_test.go b/src/storage/folder_test.go new file mode 100644 index 0000000..90b304c --- /dev/null +++ b/src/storage/folder_test.go @@ -0,0 +1,78 @@ +package storage + +import ( + "testing" +) + +func TestUpdateFolder(t *testing.T) { + db := testDB() + folder := db.CreateFolder("old title") + if folder.IsExpanded != true { + t.Fatal("expected folder to be expanded by default") + } + + t.Run("rename only", func(t *testing.T) { + newTitle := "new title" + ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{ + Title: &newTitle, + }) + if !ok || err != nil { + t.Fatalf("UpdateFolder failed: %v", err) + } + + folders := db.ListFolders() + if len(folders) != 1 || folders[0].Title != "new title" { + t.Errorf("expected title to be updated, got %s", folders[0].Title) + } + if folders[0].IsExpanded != true { + t.Error("expected expansion state to remain unchanged") + } + }) + + t.Run("toggle expanded only", func(t *testing.T) { + isExpanded := false + ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{ + IsExpanded: &isExpanded, + }) + if !ok || err != nil { + t.Fatalf("UpdateFolder failed: %v", err) + } + + folders := db.ListFolders() + if len(folders) != 1 || folders[0].IsExpanded != false { + t.Errorf("expected is_expanded to be false, got %v", folders[0].IsExpanded) + } + if folders[0].Title != "new title" { + t.Error("expected title to remain unchanged") + } + }) + + t.Run("update both", func(t *testing.T) { + bothTitle := "both" + isExpanded := true + ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{ + Title: &bothTitle, + IsExpanded: &isExpanded, + }) + if !ok || err != nil { + t.Fatalf("UpdateFolder failed: %v", err) + } + + folders := db.ListFolders() + if len(folders) != 1 || folders[0].Title != "both" || folders[0].IsExpanded != true { + t.Errorf("expected both to be updated, got title=%s expanded=%v", folders[0].Title, folders[0].IsExpanded) + } + }) + + t.Run("update none", func(t *testing.T) { + ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{}) + if !ok || err != nil { + t.Fatalf("UpdateFolder failed: %v", err) + } + + folders := db.ListFolders() + if len(folders) != 1 || folders[0].Title != "both" || folders[0].IsExpanded != true { + t.Errorf("expected no changes, got title=%s expanded=%v", folders[0].Title, folders[0].IsExpanded) + } + }) +}