Files
dbx/ksuid_test.go
T
end a303e025b2 feat: add StringKSUID and BinaryKSUID types
Replace the UUID wrapper with storage-specific KSUID types that share
GraphQL string transit but use distinct SQL Scan/Value encodings.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 17:47:41 -07:00

135 lines
3.1 KiB
Go

package dbx
import (
"bytes"
"encoding/json"
"testing"
"github.com/segmentio/ksuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestStringKSUID_ScanValue(t *testing.T) {
id := NewStringKSUID()
require.False(t, id.IsNil())
val, err := id.Value()
require.NoError(t, err)
assert.Equal(t, id.String(), val)
var scanned StringKSUID
require.NoError(t, scanned.Scan(id.String()))
assert.Equal(t, id, scanned)
require.NoError(t, scanned.Scan([]byte(id.String())))
assert.Equal(t, id, scanned)
var nilKSUID StringKSUID
val, err = nilKSUID.Value()
require.NoError(t, err)
assert.Nil(t, val)
require.NoError(t, scanned.Scan(nil))
assert.True(t, scanned.IsNil())
}
func TestStringKSUID_ScanRejectsBinary(t *testing.T) {
var s StringKSUID
err := s.Scan(idBytes(t))
assert.ErrorContains(t, err, "BinaryKSUID")
}
func TestStringKSUID_Conversion(t *testing.T) {
s := NewStringKSUID()
b := s.AsBinaryKSUID()
assert.Equal(t, s.String(), b.String())
assert.Equal(t, s.Bytes(), b.Bytes())
assert.Equal(t, s, b.AsStringKSUID())
}
func TestStringKSUID_GQL(t *testing.T) {
id := NewStringKSUID()
var buf bytes.Buffer
id.MarshalGQL(&buf)
var transport ksuidGQLTransport
require.NoError(t, json.Unmarshal(buf.Bytes(), &transport))
assert.Equal(t, id.String(), transport.KSUIDStr)
var parsed StringKSUID
require.NoError(t, parsed.UnmarshalGQL(id.String()))
assert.Equal(t, id, parsed)
}
func TestBinaryKSUID_ScanValue(t *testing.T) {
id := NewBinaryKSUID()
require.False(t, id.IsNil())
val, err := id.Value()
require.NoError(t, err)
assert.Equal(t, id.Bytes(), val)
var scanned BinaryKSUID
require.NoError(t, scanned.Scan(id.Bytes()))
assert.Equal(t, id, scanned)
var nilKSUID BinaryKSUID
val, err = nilKSUID.Value()
require.NoError(t, err)
assert.Nil(t, val)
require.NoError(t, scanned.Scan(nil))
assert.True(t, scanned.IsNil())
}
func TestBinaryKSUID_ScanRejectsStringEncoding(t *testing.T) {
s := NewStringKSUID()
var b BinaryKSUID
err := b.Scan([]byte(s.String()))
assert.ErrorContains(t, err, "StringKSUID")
err = b.Scan(s.String())
assert.ErrorContains(t, err, "StringKSUID")
}
func TestBinaryKSUID_Conversion(t *testing.T) {
b := NewBinaryKSUID()
s := b.AsStringKSUID()
assert.Equal(t, b.String(), s.String())
assert.Equal(t, b, s.AsBinaryKSUID())
}
func TestBinaryKSUID_GQL(t *testing.T) {
id := NewBinaryKSUID()
var buf bytes.Buffer
id.MarshalGQL(&buf)
var transport ksuidGQLTransport
require.NoError(t, json.Unmarshal(buf.Bytes(), &transport))
assert.Equal(t, id.String(), transport.KSUIDStr)
var parsed BinaryKSUID
require.NoError(t, parsed.UnmarshalGQL(id.String()))
assert.Equal(t, id, parsed)
}
func TestParseStringKSUID(t *testing.T) {
id := ksuid.New()
parsed, err := ParseStringKSUID(id.String())
require.NoError(t, err)
assert.Equal(t, id.String(), parsed.String())
}
func TestParseBinaryKSUID(t *testing.T) {
id := ksuid.New()
parsed, err := ParseBinaryKSUID(id.Bytes())
require.NoError(t, err)
assert.Equal(t, id.Bytes(), parsed.Bytes())
}
func idBytes(t *testing.T) []byte {
t.Helper()
return ksuid.New().Bytes()
}