Files
softplayer-backend/internal/repository/transaction_test.go
Nikolai Rodionov 28235765cd
All checks were successful
ci/woodpecker/push/build Pipeline was successful
Add tests for the transactions
Signed-off-by: Nikolai Rodionov <iam@allanger.xyz>
2026-05-19 11:32:34 +02:00

96 lines
2.6 KiB
Go

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)
}