70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
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)
|
|
}
|