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  }