package main import ( "encoding/json" "testing" "time" "tera-clone/services/tera-api/internal/domain" "tera-clone/services/tera-api/internal/logstorage" "tera-clone/services/tera-api/internal/serial" ) type captureJournal struct { class string timestamp time.Time payload json.RawMessage } func (j *captureJournal) Append(class string, timestamp time.Time, value any) error { payload, err := json.Marshal(value) if err != nil { return err } j.class, j.timestamp, j.payload = class, timestamp, payload return nil } func (*captureJournal) Read(string) ([]json.RawMessage, error) { return nil, nil } func (*captureJournal) ApplyRetention(logstorage.Retention) error { return nil } func (*captureJournal) Snapshot() (logstorage.Snapshot, error) { return logstorage.Snapshot{}, nil } func TestRecordPayloadAppendsBoundedPortEvent(t *testing.T) { now := time.Date(2026, 7, 31, 1, 2, 3, 0, time.UTC) payload := []byte{0x00, 0xff, 'A'} journal := &captureJournal{} if err := recordPayload(journal, serial.StreamEvent{ Timestamp: now, Channel: "CH01", LeaseID: "lease-1", ClientID: "session-1", Direction: "rx", Bytes: uint64(len(payload)), Payload: payload, }); err != nil { t.Fatal(err) } if journal.class != logstorage.ClassPort || !journal.timestamp.Equal(now) { t.Fatalf("journal routing = %q %s", journal.class, journal.timestamp) } var event domain.PortLogEvent if err := json.Unmarshal(journal.payload, &event); err != nil { t.Fatal(err) } if event.Channel != "CH01" || event.Direction != "RX" || event.Actor != "session-1" || event.PayloadBytes != len(payload) || event.PayloadEncoding != "base64" || string(event.Payload) != string(payload) { t.Fatalf("port event = %#v", event) } }