211 lines
5.4 KiB
Go
211 lines
5.4 KiB
Go
|
|
package cassandra
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"testing"
|
|||
|
|
|
|||
|
|
"github.com/stretchr/testify/assert"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func TestIsSAISupported(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
version string
|
|||
|
|
expected bool
|
|||
|
|
}{
|
|||
|
|
{"5.0.0", true}, // 5.x 支援
|
|||
|
|
{"5.1.2", true}, // 5.x 支援
|
|||
|
|
{"6.0.0", true}, // 6.x 理論上也支援
|
|||
|
|
{"4.0.8", false}, // 4.0.8 不支援
|
|||
|
|
{"4.0.9", true}, // 4.0.9 支援
|
|||
|
|
{"4.1.0", true}, // 4.1.0 支援
|
|||
|
|
{"4.2.2", true}, // 4.2.2 支援
|
|||
|
|
{"3.11.10", false}, // 3.x 不支援
|
|||
|
|
{"3.0.0", false},
|
|||
|
|
{"", false}, // 空字串,不支援
|
|||
|
|
{"unknown", false}, // 無效格式
|
|||
|
|
{"4", false}, // 缺 patch,不支援
|
|||
|
|
{"4.0", false}, // 缺 patch,不支援
|
|||
|
|
{"5", false}, // 缺 minor
|
|||
|
|
{"5.0", true}, // 5.0 預設支援
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.version, func(t *testing.T) {
|
|||
|
|
result := isSAISupported(tt.version)
|
|||
|
|
assert.Equal(t, tt.expected, result, "version: %s", tt.version)
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestCassandraDB_Integration_TableDriven 使用 table-driven 方式整合測試
|
|||
|
|
// func TestCassandraDB_Integration_TableDriven(t *testing.T) {
|
|||
|
|
// // 啟動 Cassandra container
|
|||
|
|
// dbContainer, err := initCassandraContainer("5.0.4")
|
|||
|
|
// defer func() {
|
|||
|
|
// _ = dbContainer.Container.Terminate(dbContainer.Ctx)
|
|||
|
|
// fmt.Println("[TEST] Container terminated")
|
|||
|
|
// }()
|
|||
|
|
|
|||
|
|
// // 建立 CassandraDB 連線
|
|||
|
|
// hosts := []string{dbContainer.Host}
|
|||
|
|
// db, err := NewCassandraDB(
|
|||
|
|
// hosts,
|
|||
|
|
// WithPort(dbContainer.Port),
|
|||
|
|
// WithConsistency(gocql.One),
|
|||
|
|
// WithNumConns(2),
|
|||
|
|
// )
|
|||
|
|
// assert.NoError(t, err, "should success create CassandraDB")
|
|||
|
|
// assert.NotNil(t, db, "db should not be nil")
|
|||
|
|
// assert.NotNil(t, db.GetSession(), "get Session should not be nil")
|
|||
|
|
|
|||
|
|
// err = db.EnsureTable("CREATE KEYSPACE my_keyspace\nWITH replication = {\n 'class': 'SimpleStrategy',\n 'replication_factor': 1\n};\n")
|
|||
|
|
// assert.NoError(t, err, "should success ensure table")
|
|||
|
|
// // 注意:由於 Close 會關閉 session,因此請把測試 Close 的子案例放在所有使用 session 的子案例之後
|
|||
|
|
// tests := []struct {
|
|||
|
|
// name string
|
|||
|
|
// action func() error
|
|||
|
|
// wantErr bool
|
|||
|
|
// }{
|
|||
|
|
// {
|
|||
|
|
// name: "ok",
|
|||
|
|
// action: func() error {
|
|||
|
|
// // 建立一個合法的資料表 (使用 IF NOT EXISTS 避免重複建立錯誤)
|
|||
|
|
// schema := "CREATE TABLE IF NOT EXISTS my_keyspace.test (id uuid PRIMARY KEY, name text)"
|
|||
|
|
// return db.EnsureTable(schema)
|
|||
|
|
// },
|
|||
|
|
// wantErr: false,
|
|||
|
|
// },
|
|||
|
|
// {
|
|||
|
|
// name: "failed to ensure table since wrong schema",
|
|||
|
|
// action: func() error {
|
|||
|
|
// // 傳入無效的 CQL 語法,預期應回傳錯誤
|
|||
|
|
// schema := "CREATE TABLE invalid schema"
|
|||
|
|
// return db.EnsureTable(schema)
|
|||
|
|
// },
|
|||
|
|
// wantErr: true,
|
|||
|
|
// },
|
|||
|
|
// {
|
|||
|
|
// name: "GetSession 返回有效 Session",
|
|||
|
|
// action: func() error {
|
|||
|
|
// if db.GetSession().Session == nil {
|
|||
|
|
// return fmt.Errorf("session is nil")
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return nil
|
|||
|
|
// },
|
|||
|
|
// wantErr: false,
|
|||
|
|
// },
|
|||
|
|
// {
|
|||
|
|
// name: "Close close Session",
|
|||
|
|
// action: func() error {
|
|||
|
|
// db.Close()
|
|||
|
|
// // 無法直接驗證內部是否已關閉,但可避免再次使用 session 產生 panic
|
|||
|
|
// return nil
|
|||
|
|
// },
|
|||
|
|
// wantErr: false,
|
|||
|
|
// },
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// // 依序執行各子案例
|
|||
|
|
// for _, tc := range tests {
|
|||
|
|
// t.Run(tc.name, func(t *testing.T) {
|
|||
|
|
// err := tc.action()
|
|||
|
|
// if (err != nil) != tc.wantErr {
|
|||
|
|
// t.Errorf("%s havs error = %v, wantErr %v", tc.name, err, tc.wantErr)
|
|||
|
|
// }
|
|||
|
|
// })
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// Mark: new multiple container lead to unit test too slow
|
|||
|
|
// func TestCassandraDB_getReleaseVersion(t *testing.T) {
|
|||
|
|
// t.Parallel()
|
|||
|
|
|
|||
|
|
// type fields struct {
|
|||
|
|
// Version string
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// tests := []struct {
|
|||
|
|
// name string
|
|||
|
|
// fields fields
|
|||
|
|
// want string
|
|||
|
|
// wantError bool
|
|||
|
|
// }{
|
|||
|
|
// {
|
|||
|
|
// name: "3",
|
|||
|
|
// fields: fields{Version: "3.11"},
|
|||
|
|
// want: "3.11.19",
|
|||
|
|
// wantError: false,
|
|||
|
|
// },
|
|||
|
|
// {
|
|||
|
|
// name: "5",
|
|||
|
|
// fields: fields{Version: "5.0.4"},
|
|||
|
|
// want: "5.0.4",
|
|||
|
|
// wantError: false,
|
|||
|
|
// },
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// for _, tt := range tests {
|
|||
|
|
// t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
// container, err := initCassandraContainer(tt.fields.Version)
|
|||
|
|
// defer func() {
|
|||
|
|
// _ = container.Container.Terminate(container.Ctx)
|
|||
|
|
// fmt.Println("[TEST] Container terminated")
|
|||
|
|
// }()
|
|||
|
|
|
|||
|
|
// if !tt.wantError {
|
|||
|
|
// assert.NoError(t, err)
|
|||
|
|
// // 建立 CassandraDB 連線
|
|||
|
|
// hosts := []string{container.Host}
|
|||
|
|
// db, err := NewCassandraDB(
|
|||
|
|
// hosts,
|
|||
|
|
// WithPort(container.Port),
|
|||
|
|
// WithConsistency(gocql.One),
|
|||
|
|
// WithNumConns(2),
|
|||
|
|
// )
|
|||
|
|
// assert.NoError(t, err)
|
|||
|
|
// version, err := db.getReleaseVersion()
|
|||
|
|
// assert.NoError(t, err)
|
|||
|
|
// assert.Equal(t, version, tt.want)
|
|||
|
|
// }
|
|||
|
|
// })
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
func TestCassandraDB_getReleaseVersion(t *testing.T) {
|
|||
|
|
t.Parallel()
|
|||
|
|
|
|||
|
|
type fields struct {
|
|||
|
|
Version string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
fields fields
|
|||
|
|
want string
|
|||
|
|
wantError bool
|
|||
|
|
}{
|
|||
|
|
// {
|
|||
|
|
// name: "3",
|
|||
|
|
// fields: fields{Version: "3.11"},
|
|||
|
|
// want: "3.11.19",
|
|||
|
|
// wantError: false,
|
|||
|
|
// },
|
|||
|
|
{
|
|||
|
|
name: "5.0.4",
|
|||
|
|
fields: fields{Version: "5.0.4"},
|
|||
|
|
want: "5.0.4",
|
|||
|
|
wantError: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
if !tt.wantError {
|
|||
|
|
version, err := cassandraDBTest.getReleaseVersion()
|
|||
|
|
assert.NoError(t, err)
|
|||
|
|
assert.Equal(t, version, tt.want)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|