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.
52 lines
1.5 KiB
Go
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
|
|
}
|