package cassandra import ( "testing" "time" "github.com/gocql/gocql" "github.com/stretchr/testify/assert" ) func TestBatchTx_AllSuccess(t *testing.T) { ctx, cassandraContainer, host, port := setupCassandraContainer(t) defer cassandraContainer.Terminate(ctx) db, err := NewCassandraDB( []string{host}, WithPort(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) now := time.Now() id1 := gocql.TimeUUID() id2 := gocql.TimeUUID() tx := db.NewBatch(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(ctx, &alice, "my_keyspace") assert.NoError(t, err) assert.WithinDuration(t, now.Add(5*time.Minute), alice.UpdateAt, time.Second) // Bob 應該被刪除 err = db.Get(ctx, &MonkeyEntity{ID: id2, Name: "Bob"}, "my_keyspace") assert.Error(t, err) }