package cassandra import ( "fmt" "testing" "time" "github.com/gocql/gocql" "github.com/stretchr/testify/assert" ) func setupForTest(t *testing.T) (Container, *CassandraDB) { // 啟動 Cassandra container dbContainer, err := initCassandraContainer("5.0.4") assert.NoError(t, err) db, err := NewCassandraDB( []string{dbContainer.Host}, WithPort(dbContainer.Port), WithConsistency(gocql.One), WithNumConns(2), ) assert.NoError(t, err) // 建立 keyspace 和 table err = db.EnsureTable(` CREATE KEYSPACE IF NOT EXISTS my_keyspace WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1 };`) assert.NoError(t, err) err = db.EnsureTable(` CREATE TABLE IF NOT EXISTS my_keyspace.monkey_entity ( id UUID, name TEXT, update_at TIMESTAMP, create_at TIMESTAMP, PRIMARY KEY ((id), name) );`) assert.NoError(t, err) return dbContainer, db } func TestBatchTx_AllSuccess(t *testing.T) { container, db := setupForTest(t) defer func() { _ = container.Container.Terminate(container.Ctx) fmt.Println("[TEST] Container terminated") }() now := time.Now() id1 := gocql.TimeUUID() id2 := gocql.TimeUUID() tx := db.NewBatch(container.Ctx, "my_keyspace") err := tx.Insert(&MonkeyEntity{ID: id1, Name: "Alice", UpdateAt: now, CreateAt: now}) assert.NoError(t, err) err = tx.Insert(&MonkeyEntity{ID: id2, Name: "Bob", UpdateAt: now, CreateAt: now}) assert.NoError(t, err) err = tx.Update(&MonkeyEntity{ID: id1, Name: "Alice", UpdateAt: now.Add(5 * time.Minute)}) assert.NoError(t, err) err = tx.Delete(&MonkeyEntity{ID: id2, Name: "Bob"}) assert.NoError(t, err) err = tx.Commit() assert.NoError(t, err) // Alice 應該還在,且被更新 var alice MonkeyEntity alice.ID, alice.Name = id1, "Alice" err = db.Get(container.Ctx, &alice, "my_keyspace") assert.NoError(t, err) assert.WithinDuration(t, now.Add(5*time.Minute), alice.UpdateAt, time.Second) // Bob 應該被刪除 err = db.Get(container.Ctx, &MonkeyEntity{ID: id2, Name: "Bob"}, "my_keyspace") assert.Error(t, err) }