package gen

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/tal-tech/go-zero/tools/goctl/model/sql/parser"
	"github.com/tal-tech/go-zero/tools/goctl/util/stringx"
)

func TestGenCacheKeys(t *testing.T) {
	m, err := genCacheKeys(parser.Table{
		Name: stringx.From("user"),
		PrimaryKey: parser.Primary{
			Field: parser.Field{
				Name:         stringx.From("id"),
				DataBaseType: "bigint",
				DataType:     "int64",
				IsKey:        false,
				IsPrimaryKey: true,
				IsUniqueKey:  false,
				Comment:      "自增id",
			},
			AutoIncrement: true,
		},
		Fields: []parser.Field{
			{
				Name:         stringx.From("mobile"),
				DataBaseType: "varchar",
				DataType:     "string",
				IsKey:        false,
				IsPrimaryKey: false,
				IsUniqueKey:  true,
				Comment:      "手机号",
			},
			{
				Name:         stringx.From("name"),
				DataBaseType: "varchar",
				DataType:     "string",
				IsKey:        false,
				IsPrimaryKey: false,
				IsUniqueKey:  true,
				Comment:      "姓名",
			},
			{
				Name:         stringx.From("createTime"),
				DataBaseType: "timestamp",
				DataType:     "time.Time",
				IsKey:        false,
				IsPrimaryKey: false,
				IsUniqueKey:  false,
				Comment:      "创建时间",
			},
			{
				Name:         stringx.From("updateTime"),
				DataBaseType: "timestamp",
				DataType:     "time.Time",
				IsKey:        false,
				IsPrimaryKey: false,
				IsUniqueKey:  false,
				Comment:      "更新时间",
			},
		},
	})
	assert.Nil(t, err)

	for fieldName, key := range m {
		name := stringx.From(fieldName)
		assert.Equal(t, fmt.Sprintf(`cacheUser%sPrefix = "cache#User#%s#"`, name.ToCamel(), name.UnTitle()), key.VarExpression)
		assert.Equal(t, fmt.Sprintf(`cacheUser%sPrefix`, name.ToCamel()), key.Left)
		assert.Equal(t, fmt.Sprintf(`cache#User#%s#`, name.UnTitle()), key.Right)
		assert.Equal(t, fmt.Sprintf(`user%sKey`, name.ToCamel()), key.Variable)
		assert.Equal(t, `user`+name.ToCamel()+`Key := fmt.Sprintf("%s%v", cacheUser`+name.ToCamel()+`Prefix,`+name.UnTitle()+`)`, key.KeyExpression)
	}

}
