Config: pick the default quality profile and root folder from the server
The two defaults of Radarr and Sonarr are dropdowns filled from the server with the address and key in the fields: when the view opens, on Revert, and shortly after either is changed. A configured value the server does not list stays selectable, marked "(not on the server)". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019reK4DUGYqDUjniWYJvwUW
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/gdamore/tcell/v2"
|
||||
"github.com/rivo/tview"
|
||||
"net/http"
|
||||
@@ -133,7 +134,8 @@ func TestSettingsViewSavesAndAppliesLive(t *testing.T) {
|
||||
// Edit the fields like a user would and save.
|
||||
v.inputs["radarr.url"].SetText(radarr.URL)
|
||||
v.inputs["radarr.apikey"].SetText("brand-new-key")
|
||||
v.inputs["sonarr.profile"].SetText("Any")
|
||||
v.choices["sonarr.profile"].set("Any")
|
||||
v.edited()
|
||||
v.refresh.SetText("7")
|
||||
v.bell.SetChecked(true)
|
||||
if !v.dirty {
|
||||
@@ -319,10 +321,9 @@ func TestHelpOverConfigTakesTheFocus(t *testing.T) {
|
||||
a.handleKey(tcell.NewEventKey(tcell.KeyF6, 0, 0))
|
||||
moveDown := a.settings.form.GetInputCapture()
|
||||
moveDown(tcell.NewEventKey(tcell.KeyDown, 0, 0))
|
||||
moveDown(tcell.NewEventKey(tcell.KeyDown, 0, 0))
|
||||
field := a.settings.inputs["radarr.profile"]
|
||||
field := a.settings.inputs["radarr.apikey"]
|
||||
if a.app.GetFocus() != field {
|
||||
t.Fatalf("after ↓↓ the application's focus is %T, not the third field", a.app.GetFocus())
|
||||
t.Fatalf("after ↓ the application's focus is %T, not the second field", a.app.GetFocus())
|
||||
}
|
||||
|
||||
a.handleKey(tcell.NewEventKey(tcell.KeyF9, 0, 0))
|
||||
@@ -340,3 +341,73 @@ func TestHelpOverConfigTakesTheFocus(t *testing.T) {
|
||||
t.Errorf("closing the help returns to %T, not the field that was in use", a.app.GetFocus())
|
||||
}
|
||||
}
|
||||
|
||||
func TestDefaultsAreChosenFromTheServer(t *testing.T) {
|
||||
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
switch {
|
||||
case r.Header.Get("X-Api-Key") != "key":
|
||||
w.WriteHeader(http.StatusUnauthorized)
|
||||
case strings.HasSuffix(r.URL.Path, "/qualityprofile"):
|
||||
w.Write([]byte(`[{"id":1,"name":"Any"},{"id":4,"name":"HD-1080p"}]`))
|
||||
case strings.HasSuffix(r.URL.Path, "/rootfolder"):
|
||||
w.Write([]byte(`[{"id":1,"path":"/movies"}]`))
|
||||
}
|
||||
}))
|
||||
defer srv.Close()
|
||||
|
||||
profiles, folders, err := fetchChoices(t.Context(), srv.URL, "key")
|
||||
if err != nil || strings.Join(profiles, ",") != "Any,HD-1080p" || strings.Join(folders, ",") != "/movies" {
|
||||
t.Fatalf("fetched %v %v %v", profiles, folders, err)
|
||||
}
|
||||
if _, _, err := fetchChoices(t.Context(), srv.URL, "wrong"); err == nil {
|
||||
t.Error("a wrong key must fail")
|
||||
}
|
||||
|
||||
a := newTestApp(t)
|
||||
v := a.settings
|
||||
p := v.choices["radarr.profile"]
|
||||
p.set("Old profile") // configured, but not on the server
|
||||
v.dirty = false
|
||||
v.choiceGen["radarr"] = 1
|
||||
v.applyChoices("radarr", 1, profiles, folders, nil)
|
||||
|
||||
n := p.GetOptionCount()
|
||||
var labels []string
|
||||
for i := 0; i < n; i++ {
|
||||
labels = append(labels, p.valueAt(i))
|
||||
}
|
||||
if strings.Join(labels, "|") != "|Any|HD-1080p|Old profile" {
|
||||
t.Errorf("options %q", labels)
|
||||
}
|
||||
if _, text := p.GetCurrentOption(); text != "Old profile (not on the server)" || p.value != "Old profile" {
|
||||
t.Errorf("selected %q, value %q", text, p.value)
|
||||
}
|
||||
if v.dirty {
|
||||
t.Error("loading the options is not an edit")
|
||||
}
|
||||
|
||||
// Choosing one is an edit and is what gets saved.
|
||||
p.SetCurrentOption(2)
|
||||
if p.value != "HD-1080p" || !v.dirty || v.read().radarrProfile != "HD-1080p" {
|
||||
t.Errorf("chosen %q dirty %v", p.value, v.dirty)
|
||||
}
|
||||
// An answer for an address that has changed since is dropped.
|
||||
v.choiceGen["radarr"] = 2
|
||||
v.applyChoices("radarr", 1, nil, nil, nil)
|
||||
if p.GetOptionCount() != n {
|
||||
t.Error("stale answer applied")
|
||||
}
|
||||
// Typing a new address asks that server again (after a pause); SABnzbd has no such lists.
|
||||
v.inputs["sonarr.url"].SetText("http://elsewhere:8989")
|
||||
v.inputs["sabnzbd.url"].SetText("http://elsewhere:8080")
|
||||
if v.choiceTimers["sonarr"] == nil || v.choiceTimers["sabnzbd"] != nil {
|
||||
t.Errorf("reload scheduled: %v", v.choiceTimers)
|
||||
}
|
||||
v.choiceTimers["sonarr"].Stop() // the test has no event loop to deliver it
|
||||
|
||||
// Without the server only none and the value in use are offered.
|
||||
v.applyChoices("radarr", 2, nil, nil, errors.New("connection refused"))
|
||||
if p.GetOptionCount() != 2 || !strings.Contains(v.status.GetText(false), "connection refused") {
|
||||
t.Errorf("offline: %d options, result %q", p.GetOptionCount(), v.status.GetText(false))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user