268 lines
5.7 KiB
Go
268 lines
5.7 KiB
Go
package cassandra
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestDefaultSAIIndexOptions(t *testing.T) {
|
|
opts := DefaultSAIIndexOptions()
|
|
assert.NotNil(t, opts)
|
|
assert.Equal(t, SAIIndexTypeStandard, opts.IndexType)
|
|
assert.False(t, opts.IsAsync)
|
|
assert.True(t, opts.CaseSensitive)
|
|
}
|
|
|
|
func TestCreateSAIIndex_Validation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
keyspace string
|
|
table string
|
|
column string
|
|
indexName string
|
|
opts *SAIIndexOptions
|
|
wantErr bool
|
|
errMsg string
|
|
}{
|
|
{
|
|
name: "missing keyspace",
|
|
keyspace: "",
|
|
table: "test_table",
|
|
column: "test_column",
|
|
indexName: "test_idx",
|
|
opts: nil,
|
|
wantErr: true,
|
|
errMsg: "keyspace is required",
|
|
},
|
|
{
|
|
name: "missing table",
|
|
keyspace: "test_keyspace",
|
|
table: "",
|
|
column: "test_column",
|
|
indexName: "test_idx",
|
|
opts: nil,
|
|
wantErr: true,
|
|
errMsg: "table is required",
|
|
},
|
|
{
|
|
name: "missing column",
|
|
keyspace: "test_keyspace",
|
|
table: "test_table",
|
|
column: "",
|
|
indexName: "test_idx",
|
|
opts: nil,
|
|
wantErr: true,
|
|
errMsg: "column is required",
|
|
},
|
|
{
|
|
name: "valid parameters with default options",
|
|
keyspace: "test_keyspace",
|
|
table: "test_table",
|
|
column: "test_column",
|
|
indexName: "test_idx",
|
|
opts: nil,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid parameters with custom options",
|
|
keyspace: "test_keyspace",
|
|
table: "test_table",
|
|
column: "test_column",
|
|
indexName: "test_idx",
|
|
opts: &SAIIndexOptions{
|
|
IndexType: SAIIndexTypeFullText,
|
|
IsAsync: true,
|
|
CaseSensitive: false,
|
|
},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "auto-generate index name",
|
|
keyspace: "test_keyspace",
|
|
table: "test_table",
|
|
column: "test_column",
|
|
indexName: "",
|
|
opts: nil,
|
|
wantErr: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// 注意:這需要一個有效的 DB 實例和 SAI 支援
|
|
// 在實際測試中,需要使用 mock 或 testcontainers
|
|
_ = tt
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDropSAIIndex_Validation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
keyspace string
|
|
indexName string
|
|
wantErr bool
|
|
errMsg string
|
|
}{
|
|
{
|
|
name: "missing keyspace",
|
|
keyspace: "",
|
|
indexName: "test_idx",
|
|
wantErr: true,
|
|
errMsg: "keyspace is required",
|
|
},
|
|
{
|
|
name: "missing index name",
|
|
keyspace: "test_keyspace",
|
|
indexName: "",
|
|
wantErr: true,
|
|
errMsg: "index name is required",
|
|
},
|
|
{
|
|
name: "valid parameters",
|
|
keyspace: "test_keyspace",
|
|
indexName: "test_idx",
|
|
wantErr: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// 注意:這需要一個有效的 DB 實例
|
|
// 在實際測試中,需要使用 mock 或 testcontainers
|
|
_ = tt
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestListSAIIndexes_Validation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
keyspace string
|
|
table string
|
|
wantErr bool
|
|
errMsg string
|
|
}{
|
|
{
|
|
name: "missing keyspace",
|
|
keyspace: "",
|
|
table: "test_table",
|
|
wantErr: true,
|
|
errMsg: "keyspace is required",
|
|
},
|
|
{
|
|
name: "missing table",
|
|
keyspace: "test_keyspace",
|
|
table: "",
|
|
wantErr: true,
|
|
errMsg: "table is required",
|
|
},
|
|
{
|
|
name: "valid parameters",
|
|
keyspace: "test_keyspace",
|
|
table: "test_table",
|
|
wantErr: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// 注意:這需要一個有效的 DB 實例
|
|
// 在實際測試中,需要使用 mock 或 testcontainers
|
|
_ = tt
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCheckSAIIndexExists_Validation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
keyspace string
|
|
indexName string
|
|
wantErr bool
|
|
errMsg string
|
|
}{
|
|
{
|
|
name: "missing keyspace",
|
|
keyspace: "",
|
|
indexName: "test_idx",
|
|
wantErr: true,
|
|
errMsg: "keyspace is required",
|
|
},
|
|
{
|
|
name: "missing index name",
|
|
keyspace: "test_keyspace",
|
|
indexName: "",
|
|
wantErr: true,
|
|
errMsg: "index name is required",
|
|
},
|
|
{
|
|
name: "valid parameters",
|
|
keyspace: "test_keyspace",
|
|
indexName: "test_idx",
|
|
wantErr: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// 注意:這需要一個有效的 DB 實例
|
|
// 在實際測試中,需要使用 mock 或 testcontainers
|
|
_ = tt
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSAIIndexType_Constants(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
indexType SAIIndexType
|
|
expected string
|
|
}{
|
|
{
|
|
name: "standard index type",
|
|
indexType: SAIIndexTypeStandard,
|
|
expected: "STANDARD",
|
|
},
|
|
{
|
|
name: "collection index type",
|
|
indexType: SAIIndexTypeCollection,
|
|
expected: "COLLECTION",
|
|
},
|
|
{
|
|
name: "full text index type",
|
|
indexType: SAIIndexTypeFullText,
|
|
expected: "FULL_TEXT",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
assert.Equal(t, tt.expected, string(tt.indexType))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCreateSAIIndex_NotSupported(t *testing.T) {
|
|
t.Run("should return error when SAI not supported", func(t *testing.T) {
|
|
// 注意:這需要一個不支援 SAI 的 DB 實例
|
|
// 在實際測試中,需要使用 mock 或 testcontainers
|
|
})
|
|
}
|
|
|
|
func TestCreateSAIIndex_IndexNameGeneration(t *testing.T) {
|
|
t.Run("should generate index name when not provided", func(t *testing.T) {
|
|
// 測試自動生成索引名稱的邏輯
|
|
// 格式應該是: {table}_{column}_sai_idx
|
|
table := "users"
|
|
column := "email"
|
|
expected := "users_email_sai_idx"
|
|
|
|
// 這裡只是測試命名邏輯,實際建立需要 DB 實例
|
|
generated := fmt.Sprintf("%s_%s_sai_idx", table, column)
|
|
assert.Equal(t, expected, generated)
|
|
})
|
|
}
|