github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/gokv/sqlkv/sqlkv_test.go (about) 1 package sqlkv_test 2 3 import ( 4 "fmt" 5 "log" 6 "net" 7 "testing" 8 9 "github.com/bingoohuang/gg/pkg/gokv/sqlkv" 10 _ "github.com/go-sql-driver/mysql" 11 sqle "github.com/src-d/go-mysql-server" 12 "github.com/src-d/go-mysql-server/auth" 13 "github.com/src-d/go-mysql-server/memory" 14 "github.com/src-d/go-mysql-server/server" 15 "github.com/src-d/go-mysql-server/sql" 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestSQL(t *testing.T) { 20 driver := sqle.NewDefault() 21 db, err := createTestDatabase("testdb") 22 assert.Nil(t, err) 23 driver.AddDatabase(db) 24 25 l, _ := net.Listen("tcp", ":0") 26 port := l.Addr().(*net.TCPAddr).Port 27 _ = l.Close() 28 29 config := server.Config{ 30 Protocol: "tcp", 31 Address: fmt.Sprintf("localhost:%d", port), 32 Auth: auth.NewNativeSingle("user", "pass", auth.AllPermissions), 33 } 34 35 s, err := server.NewDefaultServer(config, driver) 36 assert.Nil(t, err) 37 38 go func() { 39 if err := s.Start(); err != nil { 40 log.Print("start", err) 41 } 42 }() 43 44 client, err := sqlkv.NewClient(sqlkv.Config{ 45 DataSourceName: fmt.Sprintf("user:pass@tcp(localhost:%d)/testdb", port), 46 UpdateSQL: "update kv set v = :v, updated = :time where k = :k and state = 1", 47 }) 48 49 k := "Key1" 50 assert.Nil(t, client.Set(k, "bingoohuang")) 51 52 found, v, err := client.Get(k) 53 assert.Nil(t, err) 54 assert.True(t, found) 55 assert.Equal(t, "bingoohuang", v) 56 57 err = client.Del(k) 58 assert.Nil(t, err) 59 60 found, v, err = client.Get(k) 61 assert.Nil(t, err) 62 assert.False(t, found) 63 64 client.Get("Key2") 65 client.Get("Key3") 66 } 67 68 func createTestDatabase(dbName string) (*memory.Database, error) { 69 const tableName = "kv" 70 71 db := memory.NewDatabase(dbName) 72 table := memory.NewTable(tableName, sql.Schema{ 73 {Name: "k", Type: sql.VarChar(10), Nullable: false, Source: tableName}, 74 {Name: "v", Type: sql.Text, Nullable: false, Source: tableName}, 75 {Name: "state", Type: sql.Int8, Nullable: false, Source: tableName}, 76 {Name: "updated", Type: sql.VarChar(30), Nullable: true, Source: tableName}, 77 {Name: "created", Type: sql.VarChar(30), Nullable: true, Source: tableName}, 78 }) 79 80 fmt.Println(table.String()) 81 82 db.AddTable(tableName, table) 83 ctx := sql.NewEmptyContext() 84 85 rows := []sql.Row{ 86 sql.NewRow("Key1", `"value1"`, 1, nil, nil), 87 sql.NewRow("Key2", `"value2"`, 1, nil, nil), 88 sql.NewRow("Key3", `"value3"`, 1, nil, nil), 89 } 90 91 for _, row := range rows { 92 if err := table.Insert(ctx, row); err != nil { 93 return nil, err 94 } 95 } 96 97 return db, nil 98 }