mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-20 06:21:06 +02:00
added Dao.Clone() helper
This commit is contained in:
parent
f12467f2b3
commit
69bf9779d9
@ -74,6 +74,13 @@ func (dao *Dao) NonconcurrentDB() dbx.Builder {
|
|||||||
return dao.nonconcurrentDB
|
return dao.nonconcurrentDB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clone returns a new Dao with the same configuration options as the current one.
|
||||||
|
func (dao *Dao) Clone() *Dao {
|
||||||
|
clone := *dao
|
||||||
|
|
||||||
|
return &clone
|
||||||
|
}
|
||||||
|
|
||||||
// ModelQuery creates a new preconfigured select query with preset
|
// ModelQuery creates a new preconfigured select query with preset
|
||||||
// SELECT, FROM and other common fields based on the provided model.
|
// SELECT, FROM and other common fields based on the provided model.
|
||||||
func (dao *Dao) ModelQuery(m models.Model) *dbx.SelectQuery {
|
func (dao *Dao) ModelQuery(m models.Model) *dbx.SelectQuery {
|
||||||
@ -110,6 +117,8 @@ func (dao *Dao) RunInTransaction(fn func(txDao *Dao) error) error {
|
|||||||
// ---
|
// ---
|
||||||
// create a new dao with the same hooks to avoid semaphore deadlock when nesting
|
// create a new dao with the same hooks to avoid semaphore deadlock when nesting
|
||||||
txDao := New(txOrDB)
|
txDao := New(txOrDB)
|
||||||
|
txDao.MaxLockRetries = dao.MaxLockRetries
|
||||||
|
txDao.ModelQueryTimeout = dao.ModelQueryTimeout
|
||||||
txDao.BeforeCreateFunc = dao.BeforeCreateFunc
|
txDao.BeforeCreateFunc = dao.BeforeCreateFunc
|
||||||
txDao.BeforeUpdateFunc = dao.BeforeUpdateFunc
|
txDao.BeforeUpdateFunc = dao.BeforeUpdateFunc
|
||||||
txDao.BeforeDeleteFunc = dao.BeforeDeleteFunc
|
txDao.BeforeDeleteFunc = dao.BeforeDeleteFunc
|
||||||
|
@ -40,6 +40,86 @@ func TestNewMultiDB(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDaoClone(t *testing.T) {
|
||||||
|
testApp, _ := tests.NewTestApp()
|
||||||
|
defer testApp.Cleanup()
|
||||||
|
|
||||||
|
hookCalls := map[string]int{}
|
||||||
|
|
||||||
|
dao := daos.NewMultiDB(testApp.Dao().ConcurrentDB(), testApp.Dao().NonconcurrentDB())
|
||||||
|
dao.MaxLockRetries = 1
|
||||||
|
dao.ModelQueryTimeout = 2
|
||||||
|
dao.BeforeDeleteFunc = func(eventDao *daos.Dao, m models.Model) error {
|
||||||
|
hookCalls["BeforeDeleteFunc"]++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
dao.BeforeUpdateFunc = func(eventDao *daos.Dao, m models.Model) error {
|
||||||
|
hookCalls["BeforeUpdateFunc"]++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
dao.BeforeCreateFunc = func(eventDao *daos.Dao, m models.Model) error {
|
||||||
|
hookCalls["BeforeCreateFunc"]++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
dao.AfterDeleteFunc = func(eventDao *daos.Dao, m models.Model) {
|
||||||
|
hookCalls["AfterDeleteFunc"]++
|
||||||
|
}
|
||||||
|
dao.AfterUpdateFunc = func(eventDao *daos.Dao, m models.Model) {
|
||||||
|
hookCalls["AfterUpdateFunc"]++
|
||||||
|
}
|
||||||
|
dao.AfterCreateFunc = func(eventDao *daos.Dao, m models.Model) {
|
||||||
|
hookCalls["AfterCreateFunc"]++
|
||||||
|
}
|
||||||
|
|
||||||
|
clone := dao.Clone()
|
||||||
|
clone.MaxLockRetries = 3
|
||||||
|
clone.ModelQueryTimeout = 4
|
||||||
|
clone.AfterCreateFunc = func(eventDao *daos.Dao, m models.Model) {
|
||||||
|
hookCalls["NewAfterCreateFunc"]++
|
||||||
|
}
|
||||||
|
|
||||||
|
if dao.MaxLockRetries == clone.MaxLockRetries {
|
||||||
|
t.Fatal("Expected different MaxLockRetries")
|
||||||
|
}
|
||||||
|
|
||||||
|
if dao.ModelQueryTimeout == clone.ModelQueryTimeout {
|
||||||
|
t.Fatal("Expected different ModelQueryTimeout")
|
||||||
|
}
|
||||||
|
|
||||||
|
// trigger hooks
|
||||||
|
dao.BeforeDeleteFunc(nil, nil)
|
||||||
|
dao.BeforeUpdateFunc(nil, nil)
|
||||||
|
dao.BeforeCreateFunc(nil, nil)
|
||||||
|
dao.AfterDeleteFunc(nil, nil)
|
||||||
|
dao.AfterUpdateFunc(nil, nil)
|
||||||
|
dao.AfterCreateFunc(nil, nil)
|
||||||
|
clone.BeforeDeleteFunc(nil, nil)
|
||||||
|
clone.BeforeUpdateFunc(nil, nil)
|
||||||
|
clone.BeforeCreateFunc(nil, nil)
|
||||||
|
clone.AfterDeleteFunc(nil, nil)
|
||||||
|
clone.AfterUpdateFunc(nil, nil)
|
||||||
|
clone.AfterCreateFunc(nil, nil)
|
||||||
|
|
||||||
|
expectations := []struct {
|
||||||
|
hook string
|
||||||
|
total int
|
||||||
|
}{
|
||||||
|
{"BeforeDeleteFunc", 2},
|
||||||
|
{"BeforeUpdateFunc", 2},
|
||||||
|
{"BeforeCreateFunc", 2},
|
||||||
|
{"AfterDeleteFunc", 2},
|
||||||
|
{"AfterUpdateFunc", 2},
|
||||||
|
{"AfterCreateFunc", 1},
|
||||||
|
{"NewAfterCreateFunc", 1},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, e := range expectations {
|
||||||
|
if hookCalls[e.hook] != e.total {
|
||||||
|
t.Errorf("Expected %s to be caleed %d", e.hook, e.total)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDaoModelQuery(t *testing.T) {
|
func TestDaoModelQuery(t *testing.T) {
|
||||||
testApp, _ := tests.NewTestApp()
|
testApp, _ := tests.NewTestApp()
|
||||||
defer testApp.Cleanup()
|
defer testApp.Cleanup()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user