Files
grafana/pkg/util/xorm/xorm_test.go
Serge Zaitsev bf918976b2 Chore: Add snowflake xorm tag (#104300)
* add tag handler for snowflake ids

* add snowflake generator

* fill snowflake id back to the bean

* table driven test, mockable snowflake generator

* use math/rand/v2

* snowflake without time.sleep

* more explicit bitwise modulo

* rename snowflake to randomid
2025-05-06 21:12:11 +02:00

91 lines
2.1 KiB
Go

package xorm
import (
"encoding/json"
"testing"
_ "github.com/mattn/go-sqlite3"
"github.com/stretchr/testify/require"
)
func TestBasicOperationsWithSqlite(t *testing.T) {
eng, err := NewEngine("sqlite3", ":memory:")
require.NoError(t, err)
require.NotNil(t, eng)
require.Equal(t, "sqlite3", eng.DriverName())
_, err = eng.Exec("CREATE TABLE test_struct (id int primary key, comment text, json text)")
require.NoError(t, err)
testBasicOperations(t, eng)
}
func testBasicOperations(t *testing.T, eng *Engine) {
t.Run("insert object", func(t *testing.T) {
obj := &TestStruct{Comment: "test comment"}
_, err := eng.Insert(obj)
require.NoError(t, err)
require.Equal(t, int64(1), obj.Id)
})
t.Run("update object with json field", func(t *testing.T) {
sess := eng.NewSession()
defer sess.Close()
obj := &TestStruct{Comment: "new comment"}
_, err := sess.Insert(obj)
require.NoError(t, err)
require.NotZero(t, obj.Id)
obj.Json = json.RawMessage(`{"test": "test", "key": null}`)
_, err = sess.Update(obj)
require.NoError(t, err)
})
}
type TestStruct struct {
Id int64
Comment string
Json json.RawMessage
}
func TestRandomID(t *testing.T) {
type RandomIDRecord struct {
ID int64 `xorm:"'id' pk randomid"`
Comment string
}
eng, err := NewEngine("sqlite3", ":memory:")
require.NoError(t, err)
require.NoError(t, eng.Sync(new(RandomIDRecord)))
// Test sequence of different snowflake values
testCases := []struct {
name string
id int64
comment string
}{
{"first insert", 42, "first comment"},
{"second insert", 123, "second comment"},
{"third insert", 1337, "third comment"},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
eng.randomIDGen = func() int64 { return tc.id }
obj := &RandomIDRecord{Comment: tc.comment}
_, err := eng.Insert(obj)
require.NoError(t, err)
require.Equal(t, tc.id, obj.ID, "ID should match current snowflake value")
// Verify database entry
var retrieved RandomIDRecord
has, err := eng.ID(tc.id).Get(&retrieved)
require.NoError(t, err)
require.True(t, has)
require.Equal(t, tc.comment, retrieved.Comment)
})
}
}