Befehle login, servers, distros, profiles, presets, vm, lxc, template list|build, batch, status, logs --follow, cancel. Renderer im Aufbau der Vorgabe (zeichengenau per Golden-File), 24-bit/256/ohne Farbe, --ascii, --quiet, --json, --dry-run; live im Terminal, zeilenweise ohne. SSE mit Wiederverbinden und Polling als Rückfall. Typen aus openapi.json per oapi-codegen; Release-Builds per cli/bauen.sh. Refs #013 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
898 B
Go
32 lines
898 B
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSseLesen(t *testing.T) {
|
|
strom := ": ping\r\n\r\nid: 41\r\nevent: log\r\ndata: [1,\r\ndata: 2]\r\n\r\nevent: stand\ndata: {}\n\n: ping\n\nevent: ende\ndata: {}\n\n"
|
|
var gesehen []Ereignis
|
|
err := sseLesen(strings.NewReader(strom), func(e Ereignis) error {
|
|
gesehen = append(gesehen, e)
|
|
if e.Art == "ende" {
|
|
return Ende
|
|
}
|
|
return nil
|
|
})
|
|
if !errors.Is(err, Ende) {
|
|
t.Fatalf("Fehler %v", err)
|
|
}
|
|
if len(gesehen) != 3 || gesehen[0].ID != "41" || string(gesehen[0].Daten) != "[1,\n2]" || gesehen[1].Art != "stand" {
|
|
t.Errorf("gelesen: %+v", gesehen)
|
|
}
|
|
// Bricht der Strom vor `ende` ab, merkt der Aufrufer es (und verbindet neu).
|
|
err = sseLesen(strings.NewReader("event: stand\ndata: {}\n\n"), func(Ereignis) error { return nil })
|
|
if !errors.Is(err, io.ErrUnexpectedEOF) {
|
|
t.Errorf("Abbruch: %v", err)
|
|
}
|
|
}
|