All checks were successful
ci/woodpecker/push/build Pipeline was successful
Signed-off-by: Nikolai Rodionov <iam@allanger.xyz>
96 lines
2.6 KiB
Go
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)
|
|
}
|