Complete tasks 4.1-4.2: Page management service and HTTP endpoints

- Implemented PageService with full CRUD operations
- Added GetPages, CreatePage, UpdatePage, DeletePage, ReorderPages methods
- Cascade deletion of widgets when page is deleted
- Prevention of last page deletion
- Created page HTTP endpoints (GET, POST, PUT, DELETE, reorder)
- HTMX-friendly HTML fragment responses
- Comprehensive unit tests for service and handlers
- Updated dashboard to use PageService and create default pages
This commit is contained in:
2026-02-19 00:08:05 -05:00
parent 9f07b0c6f9
commit 299ac03939
16 changed files with 1572 additions and 31 deletions

View File

@@ -0,0 +1,73 @@
package services
import (
"testing"
"github.com/stretchr/testify/assert"
"custom-start-page/internal/models"
)
// TestSortPagesByOrder tests the sorting function without requiring DynamoDB
func TestSortPagesByOrder(t *testing.T) {
pages := []*models.Page{
{ID: "page-3", Order: 2},
{ID: "page-1", Order: 0},
{ID: "page-2", Order: 1},
}
sortPagesByOrder(pages)
assert.Equal(t, "page-1", pages[0].ID)
assert.Equal(t, "page-2", pages[1].ID)
assert.Equal(t, "page-3", pages[2].ID)
}
// TestSortPagesByOrderAlreadySorted tests sorting already sorted pages
func TestSortPagesByOrderAlreadySorted(t *testing.T) {
pages := []*models.Page{
{ID: "page-1", Order: 0},
{ID: "page-2", Order: 1},
{ID: "page-3", Order: 2},
}
sortPagesByOrder(pages)
assert.Equal(t, "page-1", pages[0].ID)
assert.Equal(t, "page-2", pages[1].ID)
assert.Equal(t, "page-3", pages[2].ID)
}
// TestSortPagesByOrderReversed tests sorting reversed pages
func TestSortPagesByOrderReversed(t *testing.T) {
pages := []*models.Page{
{ID: "page-3", Order: 2},
{ID: "page-2", Order: 1},
{ID: "page-1", Order: 0},
}
sortPagesByOrder(pages)
assert.Equal(t, "page-1", pages[0].ID)
assert.Equal(t, "page-2", pages[1].ID)
assert.Equal(t, "page-3", pages[2].ID)
}
// TestSortPagesByOrderEmpty tests sorting empty slice
func TestSortPagesByOrderEmpty(t *testing.T) {
pages := []*models.Page{}
sortPagesByOrder(pages)
assert.Empty(t, pages)
}
// TestSortPagesByOrderSingle tests sorting single page
func TestSortPagesByOrderSingle(t *testing.T) {
pages := []*models.Page{
{ID: "page-1", Order: 0},
}
sortPagesByOrder(pages)
assert.Len(t, pages, 1)
assert.Equal(t, "page-1", pages[0].ID)
}