package stream import ( "encoding/json" "errors" "strings" "testing" "time" ) func TestNewEvent(t *testing.T) { before := time.Now().Unix() ev, err := NewEvent(EventNodeCommand, map[string]string{"action": "drain"}) if err != nil { t.Fatalf("unerwarteter Fehler: %v", err) } if !strings.HasPrefix(ev.ID, "evt_") || len(ev.ID) <= len("evt_") { t.Errorf("ID = %q, erwartet Präfix evt_", ev.ID) } if ev.Timestamp < before || ev.Timestamp > time.Now().Unix() { t.Errorf("Timestamp = %d liegt nicht im Testzeitraum", ev.Timestamp) } if ev.Type != EventNodeCommand { t.Errorf("Type = %q", ev.Type) } if ev.NodeID != "" { t.Errorf("NodeID = %q, erwartet leer (setzt der Hub)", ev.NodeID) } if string(ev.Payload) != `{"action":"drain"}` { t.Errorf("Payload = %s", ev.Payload) } } func TestNewEvent_NilPayload(t *testing.T) { ev, err := NewEvent(EventLeaseRenew, nil) if err != nil { t.Fatalf("unerwarteter Fehler: %v", err) } if ev.Payload != nil { t.Errorf("Payload = %s, erwartet nil", ev.Payload) } } func TestNewEvent_Errors(t *testing.T) { if _, err := NewEvent("", nil); !errors.Is(err, ErrInvalidEvent) { t.Errorf("leerer Typ: erwartet ErrInvalidEvent, bekommen %v", err) } if _, err := NewEvent(EventError, make(chan int)); !errors.Is(err, ErrInvalidEvent) { t.Errorf("nicht serialisierbare Payload: erwartet ErrInvalidEvent, bekommen %v", err) } } func TestNewEvent_UniqueIDs(t *testing.T) { seen := map[string]bool{} for range 1000 { ev, err := NewEvent(EventError, nil) if err != nil { t.Fatal(err) } if seen[ev.ID] { t.Fatalf("doppelte ID %q", ev.ID) } seen[ev.ID] = true } } // Feldnamen gemäß Spec Abschnitt 4.2. func TestEvent_JSONFieldNames(t *testing.T) { ev := Event{ ID: "evt_1", Timestamp: 1727618531, Type: EventServiceState, NodeID: "node-proxmox-vm-42", Payload: json.RawMessage(`{"a":1}`), } b, err := json.Marshal(ev) if err != nil { t.Fatal(err) } want := `{"event_id":"evt_1","timestamp":1727618531,"type":"service_state","node_id":"node-proxmox-vm-42","payload":{"a":1}}` if string(b) != want { t.Errorf("JSON weicht ab\n got: %s\nwant: %s", b, want) } }