package cassandra import ( "testing" "time" "github.com/gocql/gocql" "github.com/stretchr/testify/assert" ) func TestOptions(t *testing.T) { tests := []struct { name string option Option check func(conf *cassandraConf) }{ { name: "WithPort", option: WithPort(1234), check: func(conf *cassandraConf) { assert.Equal(t, 1234, conf.Port, "Port 設定錯誤") }, }, { name: "WithKeyspace", option: WithKeyspace("my_keyspace"), check: func(conf *cassandraConf) { assert.Equal(t, "my_keyspace", conf.Keyspace, "Keyspace 設定錯誤") }, }, { name: "WithAuth", option: WithAuth("user", "pass"), check: func(conf *cassandraConf) { assert.Equal(t, "user", conf.Username, "Username 設定錯誤") assert.Equal(t, "pass", conf.Password, "Password 設定錯誤") assert.True(t, conf.UseAuth, "UseAuth 應該為 true") }, }, { name: "WithConsistency", option: WithConsistency(gocql.Quorum), check: func(conf *cassandraConf) { assert.Equal(t, gocql.Quorum, conf.Consistency, "Consistency 設定錯誤") }, }, { name: "WithConnectTimeoutSec", option: WithConnectTimeoutSec(45), check: func(conf *cassandraConf) { assert.Equal(t, 45, conf.ConnectTimeoutSec, "ConnectTimeoutSec 設定錯誤") }, }, { name: "WithConnectTimeoutSec_default", option: WithConnectTimeoutSec(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultTimeoutSec, conf.ConnectTimeoutSec, "ConnectTimeoutSec 設定錯誤") }, }, { name: "WithNumConns", option: WithNumConns(10), check: func(conf *cassandraConf) { assert.Equal(t, 10, conf.NumConns, "NumConns 設定錯誤") }, }, { name: "WithNumConns_default", option: WithNumConns(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultNumConns, conf.NumConns, "NumConns 設定錯誤") }, }, { name: "WithMaxRetries", option: WithMaxRetries(5), check: func(conf *cassandraConf) { assert.Equal(t, 5, conf.MaxRetries, "MaxRetries 設定錯誤") }, }, { name: "WithMaxRetries_default", option: WithMaxRetries(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultMaxRetries, conf.MaxRetries, "MaxRetries 設定錯誤") }, }, { name: "WithRetryMinInterval", option: WithRetryMinInterval(2 * time.Second), check: func(conf *cassandraConf) { assert.Equal(t, 2*time.Second, conf.RetryMinInterval, "RetryMinInterval 設定錯誤") }, }, { name: "WithRetryMinInterval_default", option: WithRetryMinInterval(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultRetryMinInterval, conf.RetryMinInterval, "RetryMinInterval 設定錯誤") }, }, { name: "WithRetryMaxInterval", option: WithRetryMaxInterval(10 * time.Second), check: func(conf *cassandraConf) { assert.Equal(t, 10*time.Second, conf.RetryMaxInterval, "RetryMaxInterval 設定錯誤") }, }, { name: "WithRetryMaxInterval_default", option: WithRetryMaxInterval(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultRetryMaxInterval, conf.RetryMaxInterval, "RetryMaxInterval 設定錯誤") }, }, { name: "WithReconnectInitialInterval", option: WithReconnectInitialInterval(1 * time.Second), check: func(conf *cassandraConf) { assert.Equal(t, 1*time.Second, conf.ReconnectInitialInterval, "ReconnectInitialInterval 設定錯誤") }, }, { name: "WithReconnectInitialInterval_default", option: WithReconnectInitialInterval(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultReconnectInitialInterval, conf.ReconnectInitialInterval, "ReconnectInitialInterval 設定錯誤") }, }, { name: "WithReconnectMaxInterval", option: WithReconnectMaxInterval(10 * time.Second), check: func(conf *cassandraConf) { assert.Equal(t, 10*time.Second, conf.ReconnectMaxInterval, "ReconnectMaxInterval 設定錯誤") }, }, { name: "WithReconnectMaxInterval_default", option: WithReconnectMaxInterval(0), check: func(conf *cassandraConf) { assert.Equal(t, defaultReconnectMaxInterval, conf.ReconnectMaxInterval, "ReconnectMaxInterval 設定錯誤") }, }, } for _, tc := range tests { tc := tc // 避免 closure 捕捉迴圈變數 t.Run(tc.name, func(t *testing.T) { // 為每個測試案例產生一個新的 cassandraConf 實例 conf := &cassandraConf{} // 套用 Option tc.option(conf) // 執行檢查 tc.check(conf) }) } }