432 lines
9.8 KiB
Go
432 lines
9.8 KiB
Go
package simpleorm_test
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
simpleorm "git.gdulai.com/gdulai/simpleorm"
|
|
"git.gdulai.com/gdulai/simpleorm/exec"
|
|
log "gitlab.com/gdulai/simpleloglvl"
|
|
)
|
|
|
|
func cleanUp(dbFile string, conn *simpleorm.DBConnection) {
|
|
conn.Close()
|
|
os.Remove(dbFile)
|
|
}
|
|
|
|
func TestSelectEmpty(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)
|
|
|
|
// WHEN
|
|
selectExec, err := exec.CreateSelect[Test](orm, "")
|
|
|
|
// THEN
|
|
|
|
if err != nil {
|
|
log.LogError("Failed to create select. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
|
|
if err != nil {
|
|
log.LogError("Select failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
if len(res) > 0 {
|
|
log.LogError("Expected empty result.")
|
|
t.Fail()
|
|
return
|
|
}
|
|
}
|
|
|
|
func TestInsertAndSelectSingle(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
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[Test](orm, "")
|
|
if err != nil {
|
|
log.LogError("TestInsertAndSelectSingle setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
// WHEN
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertAndSelectSingle insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != 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))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
singleRes := res[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 TestInsertMultipleAndSelectWithParam(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(orm, testObj)
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
insertSecond, err := exec.NewInsert(orm, testObjSecond)
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[Test](orm, "string_field = ?", "fdsa")
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
// WHEN
|
|
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam first insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
_, err = insertSecond.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam second insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
if len(res) != 1 {
|
|
log.LogError(" TestInsertMultipleAndSelectWithParam test failed. Expected: 1, Actual: %s", len(res))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
singleRes := res[0]
|
|
if singleRes.ID != 2 || singleRes.Int64Field != 12 || singleRes.IntField != 54 || singleRes.StringField != "fdsa" {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam invalid result. Expected: %s, Actual: %s", testObjSecond, singleRes)
|
|
t.Fail()
|
|
return
|
|
}
|
|
}
|
|
|
|
func TestInsertAndUpdate(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("TestInsertAndUpdate setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[Test](orm, "string_field = ?", "asdf")
|
|
if err != nil {
|
|
log.LogError("TestInsertMultipleAndSelectWithParam setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
// WHEN
|
|
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertAndUpdate insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertAndUpdate re-select failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
testObj = res[0]
|
|
|
|
testObj.IntField = 42069
|
|
testObj.Int64Field = 69420
|
|
|
|
updateExec, err := exec.NewUpdate(orm, testObj)
|
|
if err != nil {
|
|
log.LogError("TestInsertAndUpdate setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
_, err = updateExec.Execute(conn)
|
|
res, selectErr := selectExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != nil {
|
|
log.LogError("TestInsertAndUpdate update failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
if selectErr != nil {
|
|
log.LogError("TestInsertAndUpdate select failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
if len(res) != 1 {
|
|
log.LogError("TestInsertAndUpdate test failed. Expected: 1, Actual: %s", len(res))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
singleRes := res[0]
|
|
if singleRes.ID != 1 || singleRes.Int64Field != 69420 || singleRes.IntField != 42069 || singleRes.StringField != "asdf" {
|
|
log.LogError("TestInsertAndUpdate invalid result. Expected: %s, Actual: %s", testObj, singleRes)
|
|
t.Fail()
|
|
}
|
|
|
|
}
|
|
|
|
func TestInsertAndDelete(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("TestInsertAndDelete setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestInsertAndDelete setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[Test](orm, "")
|
|
if err != nil {
|
|
log.LogError("TestInsertAndDelete setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectRes, err := selectExec.Execute(conn)
|
|
|
|
if err != nil {
|
|
log.LogError("TestInsertAndDelete setup failed. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
deleteExec, err := exec.NewDelete(orm, selectRes)
|
|
|
|
// WHEN
|
|
_, err = deleteExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != nil {
|
|
log.LogError("TestInsertAndDelete delete failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectRes, err = selectExec.Execute(conn)
|
|
if len(selectRes) != 0 {
|
|
log.LogError("TestInsertAndDelete test failed. Expected: 0, Actual: %s", len(selectRes))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func TestBoolInsertAndSelectSingle(t *testing.T) {
|
|
// GIVEN
|
|
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
|
|
defer cleanUp("test.db", conn)
|
|
orm := simpleorm.NewORM(TestWithBool{})
|
|
|
|
exec.ExecuteDDL(conn, orm)
|
|
|
|
testObj := TestWithBool{BoolField: true}
|
|
|
|
insertExec, err := exec.NewInsert(orm, testObj)
|
|
if err != nil {
|
|
log.LogError("TestBoolInsertAndSelectSingle setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[TestWithBool](orm, "")
|
|
if err != nil {
|
|
log.LogError("TestBoolInsertAndSelectSingle setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
// WHEN
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestBoolInsertAndSelectSingle insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != nil {
|
|
log.LogError("TestBoolInsertAndSelectSingle failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
if len(res) != 1 {
|
|
log.LogError("TestBoolInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(res))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
singleRes := res[0]
|
|
if singleRes.ID != 1 || !singleRes.BoolField {
|
|
log.LogError("TestBoolInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, singleRes)
|
|
t.Fail()
|
|
}
|
|
|
|
}
|
|
|
|
func TestTimeInsertAndSelectSingle(t *testing.T) {
|
|
// GIVEN
|
|
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
|
|
defer cleanUp("test.db", conn)
|
|
orm := simpleorm.NewORM(TestWithTime{})
|
|
|
|
exec.ExecuteDDL(conn, orm)
|
|
|
|
now := time.Now().UnixMilli()
|
|
testObj := TestWithTime{TimeField: now}
|
|
|
|
insertExec, err := exec.NewInsert(orm, testObj)
|
|
if err != nil {
|
|
log.LogError("TestTimeInsertAndSelectSingle setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
selectExec, err := exec.CreateSelect[TestWithTime](orm, "")
|
|
if err != nil {
|
|
log.LogError("TestTimeInsertAndSelectSingle setup failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
// WHEN
|
|
_, err = insertExec.Execute(conn)
|
|
if err != nil {
|
|
log.LogError("TestTimeInsertAndSelectSingle insert failed: %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
res, err := selectExec.Execute(conn)
|
|
|
|
// THEN
|
|
if err != nil {
|
|
log.LogError("TestTimeInsertAndSelectSingle failure. %s", err)
|
|
t.Fail()
|
|
return
|
|
}
|
|
if len(res) != 1 {
|
|
log.LogError("TestTimeInsertAndSelectSingle test failed. Expected: 1, Actual: %s", len(res))
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
singleRes := res[0]
|
|
if singleRes.ID != 1 || singleRes.TimeField != now {
|
|
log.LogError("TestTimeInsertAndSelectSingle invalid result. Expected: %s, Actual: %s", testObj, singleRes)
|
|
t.Fail()
|
|
}
|
|
|
|
}
|