diff --git a/internal/service/registry.go b/internal/service/registry.go index 9fcf3b9..975a60e 100644 --- a/internal/service/registry.go +++ b/internal/service/registry.go @@ -1,6 +1,8 @@ package service import ( + "sort" + "github.com/adcondev/poster-tuis/internal/assets" "github.com/adcondev/poster-tuis/internal/config" ) @@ -57,7 +59,13 @@ func GetServiceRegistry() map[string][]Variant { } } -// GetFamilyNames returns the ordered list of service family identifiers +// GetFamilyNames returns a sorted list of available service families. func GetFamilyNames() []string { - return []string{"scale", "ticket"} + reg := GetServiceRegistry() + names := make([]string, 0, len(reg)) + for name := range reg { + names = append(names, name) + } + sort.Strings(names) + return names } diff --git a/internal/service/registry_test.go b/internal/service/registry_test.go new file mode 100644 index 0000000..56cefcd --- /dev/null +++ b/internal/service/registry_test.go @@ -0,0 +1,33 @@ +package service + +import ( + "reflect" + "sort" + "testing" +) + +func TestGetFamilyNames(t *testing.T) { + // Call the function + names := GetFamilyNames() + + // Get the registry to compare + reg := GetServiceRegistry() + + // 1. Verify the length + if len(names) != len(reg) { + t.Fatalf("GetFamilyNames() returned %d items, expected %d", len(names), len(reg)) + } + + // 2. Verify all keys from the registry are present + expectedNames := make([]string, 0, len(reg)) + for name := range reg { + expectedNames = append(expectedNames, name) + } + + // 3. Verify it is sorted + sort.Strings(expectedNames) + + if !reflect.DeepEqual(names, expectedNames) { + t.Errorf("GetFamilyNames() = %v, want %v", names, expectedNames) + } +} diff --git a/internal/ui/builders.go b/internal/ui/builders.go index a5dcd88..628765b 100644 --- a/internal/ui/builders.go +++ b/internal/ui/builders.go @@ -9,6 +9,13 @@ import ( "github.com/adcondev/poster-tuis/internal/service" ) +const ( + actionBack = "back" + actionForceStop = "force-stop" + titleVolver = "Volver" + iconBack = "[<]" +) + // ══════════════════════════════════════════════════════════════ // Menu Item Type // ══════════════════════════════════════════════════════════════ @@ -91,10 +98,10 @@ func buildFamilyMenuItems(fs service.FamilyStatus) []list.Item { data: "install-remote", }, menuItem{ - title: "Volver", + title: titleVolver, description: "Regresar al menú principal", - icon: "[<]", - data: "back", + icon: iconBack, + data: actionBack, }, } } @@ -130,7 +137,7 @@ func buildFamilyMenuItems(fs service.FamilyStatus) []list.Item { title: "Forzar Detención", description: "El servicio está en transición — forzar detención", icon: "[!]", - data: "force-stop", + data: actionForceStop, }) case service.StatusUnknown: @@ -138,7 +145,7 @@ func buildFamilyMenuItems(fs service.FamilyStatus) []list.Item { title: "Forzar Detención", description: "Estado desconocido — intentar forzar detención del servicio", icon: "[!]", - data: "force-stop", + data: actionForceStop, }) default: log.Printf("Estado inesperado para %s: %s", installed, status.String()) @@ -159,10 +166,10 @@ func buildFamilyMenuItems(fs service.FamilyStatus) []list.Item { data: "uninstall", }, menuItem{ - title: "Volver", + title: titleVolver, description: "Regresar al menú principal", - icon: "[<]", - data: "back", + icon: iconBack, + data: actionBack, }, ) @@ -189,10 +196,10 @@ func buildLogsMenuItems() []list.Item { data: "open-dir", }, menuItem{ - title: "Volver", + title: titleVolver, description: "Regresar al menú de servicio", - icon: "[<]", - data: "back", + icon: iconBack, + data: actionBack, }, } } diff --git a/internal/ui/update.go b/internal/ui/update.go index 915a3a3..f496473 100644 --- a/internal/ui/update.go +++ b/internal/ui/update.go @@ -211,7 +211,7 @@ func (m Model) handleFamilyKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { } switch selected.data { - case "back": + case actionBack: return m.goToDashboard() case "install-local": @@ -236,7 +236,7 @@ func (m Model) handleFamilyKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { } return m.executeAction("Detener Servicio", mgr.Stop) - case "force-stop": + case actionForceStop: mgr := m.getActiveManager() if mgr == nil { m.statusMessage = "No se pudo determinar el servicio a detener." @@ -313,7 +313,7 @@ func (m Model) handleLogsKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { m.statusMessage = "Abriendo carpeta de logs..." return m, nil - case "back": + case actionBack: return m.returnToFamilyMenu() } }