64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
package audit
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCursorRoundTrip(t *testing.T) {
|
|
now := time.Date(2026, 7, 21, 12, 0, 0, 0, time.UTC)
|
|
cursor := encodeCursor(now, "turn-abc-123")
|
|
decoded, err := decodeCursor(cursor)
|
|
if err != nil {
|
|
t.Fatalf("decodeCursor: %v", err)
|
|
}
|
|
if !decoded.CreatedAt.Equal(now) {
|
|
t.Fatalf("CreatedAt=%v, want %v", decoded.CreatedAt, now)
|
|
}
|
|
if decoded.ID != "turn-abc-123" {
|
|
t.Fatalf("ID=%q, want %q", decoded.ID, "turn-abc-123")
|
|
}
|
|
}
|
|
|
|
func TestDecodeCursorRejectsEmpty(t *testing.T) {
|
|
_, err := decodeCursor("")
|
|
if err == nil {
|
|
t.Fatal("expected error for empty cursor")
|
|
}
|
|
}
|
|
|
|
func TestDecodeCursorRejectsInvalidBase64(t *testing.T) {
|
|
_, err := decodeCursor("!!!not-valid-base64!!!")
|
|
if err == nil {
|
|
t.Fatal("expected error for invalid base64")
|
|
}
|
|
}
|
|
|
|
func TestDecodeCursorRejectsTruncated(t *testing.T) {
|
|
// Create a valid cursor then truncate it
|
|
cursor := encodeCursor(time.Now().UTC(), "id")
|
|
truncated := cursor[:len(cursor)-3]
|
|
_, err := decodeCursor(truncated)
|
|
if err == nil {
|
|
t.Fatal("expected error for truncated cursor")
|
|
}
|
|
}
|
|
|
|
func TestDecodeCursorRejectsTooLong(t *testing.T) {
|
|
// 1024 bytes should exceed max cursor length
|
|
_, err := decodeCursor(strings.Repeat("A", 1024))
|
|
if err == nil {
|
|
t.Fatal("expected error for too-long cursor")
|
|
}
|
|
}
|
|
|
|
func TestDecodeCursorRejectsMissingFields(t *testing.T) {
|
|
// Invalid JSON payload (not a valid cursor struct)
|
|
// We create a cursor-like string that decodes but has missing fields
|
|
_, err := decodeCursor(encodeCursorString("{}"))
|
|
if err == nil {
|
|
t.Fatal("expected error for missing fields in cursor")
|
|
}
|
|
}
|