Files
marc b7cc06b7c1 Widget-Rahmen: Widgets sind Beschreibungen, keine Kaesten in der Seite
widgetAnmelden({ id, titel, wo, sichtbar, laden, leer, inhalt, takt }) —
der Rahmen macht daraus ein Fenster in der Spalte (Terminal) oder ein
Schild (Desktop), kennt lädt/fertig/nichts da/Fehler und haelt den
Nachladetakt. Benutzer, Wetter und Systemzustand sind umgestellt; aus
index.html sind vier feste Kaesten verschwunden und aus dem Raster die
Einzelplaetze.

Zwei Dinge, die erst dabei sichtbar wurden:

- Der Server meldete 'kein Ort eingestellt' und 'Dienst nicht
  erreichbar' beide als 204. Ein Ausfall sah damit aus wie ein
  abgeschaltetes Widget. Ausfall ist jetzt 502, mit Test.
- Die Reihenfolge haengt nicht mehr an der Modulauswertung: Seit
  glyphs.js seine Raster mit await auf oberster Ebene laedt, laufen
  Module ohne Symbole vorher durch — der Systemzustand stand deshalb
  ueber dem Benutzer. widgetsOrdnen() macht die Reihenfolge zur Angabe,
  und genau dort haengt spaeter die im Server gespeicherte ein.
2026-08-30 03:12:00 +02:00

52 lines
1.5 KiB
Go

package weather
import (
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
// FakeFuerTest gibt einen Dienst, der einen erfundenen Wetterserver befragt.
//
// Steht bewusst nicht in der _test.go: Auch die Server-Tests im Wurzelpaket
// brauchen ihn, und kein Test in diesem Projekt fragt je wirklich bei
// Open-Meteo an — das wäre langsam, unzuverlässig und benutzte einen fremden
// Dienst für unsere Testläufe.
func FakeFuerTest(t *testing.T, code int, grad float64) *Dienst {
return fake(t, code, grad, false)
}
// KaputtFuerTest stellt einen Dienst, der nicht antwortet — für den Fall, den
// die Oberfläche seit dem Widget-Rahmen anders behandelt als „nichts da".
func KaputtFuerTest(t *testing.T) *Dienst {
return fake(t, 0, 0, true)
}
func fake(t *testing.T, code int, grad float64, kaputt bool) *Dienst {
t.Helper()
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if kaputt {
w.WriteHeader(http.StatusInternalServerError)
return
}
if strings.Contains(r.URL.Path, "search") {
json.NewEncoder(w).Encode(map[string]any{"results": []map[string]any{
{"name": "Köln", "country": "Deutschland", "admin1": "Nordrhein-Westfalen",
"latitude": 50.938, "longitude": 6.96},
}})
return
}
json.NewEncoder(w).Encode(map[string]any{"current": map[string]any{
"temperature_2m": grad, "weather_code": code,
}})
}))
t.Cleanup(srv.Close)
d := Neu()
d.wetterURL = srv.URL + "/forecast"
d.sucheURL = srv.URL + "/search"
return d
}