80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
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)
|
|
}
|