WIP: Transaction implementation

This commit is contained in:
2026-05-24 00:04:43 +02:00
parent e98dbe3338
commit 4da3bf231b
6 changed files with 419 additions and 131 deletions
+165 -30
View File
@@ -36,13 +36,14 @@ func TestSelectEmpty(t *testing.T) {
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
if err != nil {
log.LogError("Select failure. %s", err)
t.Fail()
return
}
res := selectExec.Results()
if len(res) > 0 {
log.LogError("Expected empty result.")
t.Fail()
@@ -50,6 +51,108 @@ func TestSelectEmpty(t *testing.T) {
}
}
func TestInsert(t *testing.T) {
// GIVEN
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
defer cleanUp("test.db", conn)
orm := simpleorm.NewORM(Test{}, TestWithFk{}, TestWithFkAndFkId{},
TestWithCompositePk{}, TestWithCompositeFk{})
exec.ExecuteDDL(conn, orm)
testObj := Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
insertExec, err := exec.NewInsert(orm, testObj)
if err != nil {
log.LogError("TestInsertAndSelectSingle setup failed: %s", err)
t.Fail()
return
}
// WHEN
insertErr := insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndSelectSingle insert failed: %s", err)
t.Fail()
return
}
insertRes := insertExec.Results()
// THEN
if insertErr != nil {
log.LogError("TestInsertAndSelectSingle failure. %s", err)
t.Fail()
return
}
if len(insertRes) != 1 {
log.LogError("TestInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(insertRes))
t.Fail()
return
}
singleRes := insertRes[0]
if singleRes.ID != 1 || singleRes.Int64Field != 54 || singleRes.IntField != 12 || singleRes.StringField != "asdf" {
log.LogError("TestInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, singleRes)
t.Fail()
}
}
func TestInsertMultiple(t *testing.T) {
// GIVEN
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
defer cleanUp("test.db", conn)
orm := simpleorm.NewORM(Test{}, TestWithFk{}, TestWithFkAndFkId{},
TestWithCompositePk{}, TestWithCompositeFk{})
exec.ExecuteDDL(conn, orm)
testObj := Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
testObjSecond := Test{Int64Field: 12, IntField: 54, StringField: "fdsa"}
insertExec, err := exec.NewInsert[Test](orm, testObj, testObjSecond)
if err != nil {
log.LogError("TestInsertAndSelectSingle setup failed: %s", err)
t.Fail()
return
}
// WHEN
insertErr := insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndSelectSingle insert failed: %s", err)
t.Fail()
return
}
insertRes := insertExec.Results()
// THEN
if insertErr != nil {
log.LogError("TestInsertAndSelectSingle failure. %s", err)
t.Fail()
return
}
if len(insertRes) != 2 {
log.LogError("TestInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(insertRes))
t.Fail()
return
}
entity := insertRes[0]
if entity.ID != 1 || entity.Int64Field != 54 || entity.IntField != 12 || entity.StringField != "asdf" {
log.LogError("TestInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, entity)
t.Fail()
}
entity = insertRes[1]
if entity.ID != 2 || entity.Int64Field != 12 || entity.IntField != 54 || entity.StringField != "fdsa" {
log.LogError("TestInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObjSecond, entity)
t.Fail()
}
}
func TestInsertAndSelectSingle(t *testing.T) {
// GIVEN
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
@@ -76,28 +179,43 @@ func TestInsertAndSelectSingle(t *testing.T) {
}
// WHEN
_, err = insertExec.Execute(conn)
if err != nil {
insertErr := insertExec.Execute(conn)
selectErr := selectExec.Execute(conn)
// THEN
if insertErr != nil {
log.LogError("TestInsertAndSelectSingle insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
// THEN
if err != nil {
if selectErr != nil {
log.LogError("TestInsertAndSelectSingle failure. %s", err)
t.Fail()
return
}
if len(res) != 1 {
log.LogError("TestInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(res))
insertRes := insertExec.Results()
if len(insertRes) != 1 {
log.LogError("TestInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(insertRes))
t.Fail()
return
}
singleRes := res[0]
selectRes := selectExec.Results()
if len(selectRes) != 1 {
log.LogError("TestInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(selectRes))
t.Fail()
return
}
singleRes := insertRes[0]
if singleRes.ID != 1 || singleRes.Int64Field != 54 || singleRes.IntField != 12 || singleRes.StringField != "asdf" {
log.LogError("TestInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, singleRes)
t.Fail()
}
singleRes = selectRes[0]
if singleRes.ID != 1 || singleRes.Int64Field != 54 || singleRes.IntField != 12 || singleRes.StringField != "asdf" {
log.LogError("TestInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, singleRes)
t.Fail()
@@ -131,14 +249,14 @@ func TestInsertSelectWithCompositePk(t *testing.T) {
}
// WHEN
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertSelectWithCompositePk insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
// THEN
if err != nil {
@@ -146,6 +264,8 @@ func TestInsertSelectWithCompositePk(t *testing.T) {
t.Fail()
return
}
res := selectExec.Results()
if len(res) != 1 {
log.LogError("TestInsertSelectWithCompositePk test failed. Expected: 1, Actual: %s", len(res))
t.Fail()
@@ -196,21 +316,21 @@ func TestInsertMultipleAndSelectWithParam(t *testing.T) {
// WHEN
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertMultipleAndSelectWithParam first insert failed: %s", err)
t.Fail()
return
}
_, err = insertSecond.Execute(conn)
err = insertSecond.Execute(conn)
if err != nil {
log.LogError("TestInsertMultipleAndSelectWithParam second insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
// THEN
if err != nil {
@@ -218,6 +338,8 @@ func TestInsertMultipleAndSelectWithParam(t *testing.T) {
t.Fail()
return
}
res := selectExec.Results()
if len(res) != 1 {
log.LogError(" TestInsertMultipleAndSelectWithParam test failed. Expected: 1, Actual: %s", len(res))
t.Fail()
@@ -259,20 +381,21 @@ func TestInsertAndUpdate(t *testing.T) {
// WHEN
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndUpdate insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndUpdate re-select failed: %s", err)
t.Fail()
return
}
res := selectExec.Results()
testObj = res[0]
testObj.IntField = 42069
@@ -285,8 +408,8 @@ func TestInsertAndUpdate(t *testing.T) {
return
}
_, err = updateExec.Execute(conn)
res, selectErr := selectExec.Execute(conn)
err = updateExec.Execute(conn)
selectErr := selectExec.Execute(conn)
// THEN
if err != nil {
@@ -301,6 +424,7 @@ func TestInsertAndUpdate(t *testing.T) {
return
}
res = selectExec.Results()
if len(res) != 1 {
log.LogError("TestInsertAndUpdate test failed. Expected: 1, Actual: %s", len(res))
t.Fail()
@@ -333,7 +457,7 @@ func TestInsertAndDelete(t *testing.T) {
return
}
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndDelete setup failed: %s", err)
t.Fail()
@@ -347,18 +471,17 @@ func TestInsertAndDelete(t *testing.T) {
return
}
selectRes, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
if err != nil {
log.LogError("TestInsertAndDelete setup failed. %s", err)
t.Fail()
return
}
deleteExec, err := exec.NewDelete(orm, selectRes)
deleteExec, err := exec.NewDelete(orm, selectExec.Results())
// WHEN
_, err = deleteExec.Execute(conn)
err = deleteExec.Execute(conn)
// THEN
if err != nil {
@@ -367,7 +490,15 @@ func TestInsertAndDelete(t *testing.T) {
return
}
selectRes, err = selectExec.Execute(conn)
err = selectExec.Execute(conn)
// THEN
if err != nil {
log.LogError("TestInsertAndDelete delete failure. %s", err)
t.Fail()
return
}
selectRes := selectExec.Results()
if len(selectRes) != 0 {
log.LogError("TestInsertAndDelete test failed. Expected: 0, Actual: %s", len(selectRes))
t.Fail()
@@ -401,14 +532,14 @@ func TestBoolInsertAndSelectSingle(t *testing.T) {
}
// WHEN
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestBoolInsertAndSelectSingle insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
// THEN
if err != nil {
@@ -416,6 +547,8 @@ func TestBoolInsertAndSelectSingle(t *testing.T) {
t.Fail()
return
}
res := selectExec.Results()
if len(res) != 1 {
log.LogError("TestBoolInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(res))
t.Fail()
@@ -456,14 +589,14 @@ func TestTimeInsertAndSelectSingle(t *testing.T) {
}
// WHEN
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestTimeInsertAndSelectSingle insert failed: %s", err)
t.Fail()
return
}
res, err := selectExec.Execute(conn)
err = selectExec.Execute(conn)
// THEN
if err != nil {
@@ -471,6 +604,8 @@ func TestTimeInsertAndSelectSingle(t *testing.T) {
t.Fail()
return
}
res := selectExec.Results()
if len(res) != 1 {
log.LogError("TestTimeInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(res))
t.Fail()
+15 -16
View File
@@ -32,7 +32,7 @@ func TestRepoSelectAll(t *testing.T) {
t.Fail()
return
}
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
repo := repository.NewRepository[Test](conn, orm)
// WHEN
@@ -58,7 +58,7 @@ func TestRepoSelectByPk(t *testing.T) {
t.Fail()
return
}
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
repo := repository.NewRepository[Test](conn, orm)
// WHEN
@@ -84,7 +84,7 @@ func TestRepoSelectByCompundPk(t *testing.T) {
t.Fail()
return
}
_, err = insertExec.Execute(conn)
err = insertExec.Execute(conn)
repo := repository.NewRepository[TestWithCompositePk](conn, orm)
// WHEN
@@ -103,18 +103,19 @@ func TestRepoSave(t *testing.T) {
orm, conn := repoTestSetup()
defer cleanUp("test.db", conn)
testObj := Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
testObj := &Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
repo := repository.NewRepository[Test](conn, orm)
// WHEN
repo.Save(testObj)
err := repo.Save(testObj)
// THEN
res := repo.SelectByPk(1)
if res == nil {
log.LogError("TestRepoSave test failed. Result is nil!")
if err != nil {
log.LogError("TestRepoSave failed: %s", err)
}
if testObj.ID == 0 {
log.LogError("TestRepoSave failed! testObj.ID is 0!")
t.Fail()
return
}
}
@@ -123,23 +124,21 @@ func TestRepoDelete(t *testing.T) {
orm, conn := repoTestSetup()
defer cleanUp("test.db", conn)
testObj := Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
testObj := &Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
repo := repository.NewRepository[Test](conn, orm)
repo.Save(testObj)
res := repo.SelectByPk(1)
if res == nil {
err := repo.Save(testObj)
if err != nil {
log.LogError("TestRepoDelete setup failed! Test data not saved!")
t.Fail()
return
}
// WHEN
repo.Delete(*res)
repo.Delete(testObj)
// THEN
res = repo.SelectByPk(1)
res := repo.SelectByPk(testObj.ID)
if res != nil {
log.LogError("TestRepoDelete test failed. Result is not nil!")
t.Fail()