Add Projects #13
95
internal/repository/transaction_test.go
Normal file
95
internal/repository/transaction_test.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package repository_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"gitea.badhouseplants.net/softplayer/softplayer-backend/internal/helpers/postgres"
|
||||
"gitea.badhouseplants.net/softplayer/softplayer-backend/internal/repository"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func newTestDBConnection(ctx context.Context) *sql.DB {
|
||||
connStr, ok := os.LookupEnv("SOFTPLAYER_DB_CONNECTION_STRING")
|
||||
if !ok {
|
||||
// Default connection string
|
||||
connStr = "postgres://softplayer:qwertyu9@localhost:30432/softplayer?sslmode=disable"
|
||||
}
|
||||
db, err := postgres.Open(ctx, connStr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
func TestTransactionFlow_Success(t *testing.T) {
|
||||
db := newTestDBConnection(t.Context())
|
||||
tx, err := repository.StartTransaction(t.Context(), db)
|
||||
assert.NoError(t, err)
|
||||
query1 := "CREATE TABLE transaction_test_success (id SERIAL PRIMARY KEY, data VARCHAR (50) NOT NULL)"
|
||||
_, err = db.Exec(query1)
|
||||
assert.NoError(t, err)
|
||||
|
||||
data1 := "data1"
|
||||
data2 := "data2"
|
||||
query2 := "INSERT INTO transaction_test_success (data) VALUES ($1)"
|
||||
_, err = tx.Exec(query2, data1)
|
||||
assert.NoError(t, err)
|
||||
_, err = tx.Exec(query2, data2)
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, repository.CommitTransaction(t.Context(), tx))
|
||||
|
||||
exists := false
|
||||
queryTest := `SELECT EXISTS(
|
||||
SELECT 1 FROM transaction_test_success WHERE data = $1
|
||||
)`
|
||||
|
||||
err = db.QueryRow(queryTest, data1).Scan(&exists)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, exists)
|
||||
|
||||
err = db.QueryRow(queryTest, data2).Scan(&exists)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, exists)
|
||||
|
||||
queryCleanup := "DROP TABLE transaction_test_success"
|
||||
_, err = db.Exec(queryCleanup)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestTransactionFlow_Rollback(t *testing.T) {
|
||||
db := newTestDBConnection(t.Context())
|
||||
tx, err := repository.StartTransaction(t.Context(), db)
|
||||
assert.NoError(t, err)
|
||||
query1 := "CREATE TABLE transaction_test_rollback (id SERIAL PRIMARY KEY, data VARCHAR (50) NOT NULL)"
|
||||
_, err = db.Exec(query1)
|
||||
assert.NoError(t, err)
|
||||
|
||||
data1 := "data1"
|
||||
data2 := "data2"
|
||||
query2 := "INSERT INTO transaction_test_rollback (data) VALUES ($1)"
|
||||
_, err = tx.Exec(query2, data1)
|
||||
assert.NoError(t, err)
|
||||
_, err = tx.Exec(query2, data2)
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, repository.RollBackTransaction(t.Context(), tx))
|
||||
|
||||
exists := false
|
||||
queryTest := `SELECT EXISTS(
|
||||
SELECT 1 FROM transaction_test_rollback WHERE data = $1
|
||||
)`
|
||||
|
||||
err = db.QueryRow(queryTest, data1).Scan(&exists)
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, exists)
|
||||
|
||||
err = db.QueryRow(queryTest, data2).Scan(&exists)
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, exists)
|
||||
|
||||
queryCleanup := "DROP TABLE transaction_test_rollback"
|
||||
_, err = db.Exec(queryCleanup)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
Reference in New Issue
Block a user