From 69bf9779d9f783cd6bdfe0e660dc0d21c699f617 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Sat, 1 Apr 2023 11:45:08 +0300 Subject: [PATCH] added Dao.Clone() helper --- daos/base.go | 9 ++++++ daos/base_test.go | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/daos/base.go b/daos/base.go index 68bbe3dc..f690e3cf 100644 --- a/daos/base.go +++ b/daos/base.go @@ -74,6 +74,13 @@ func (dao *Dao) NonconcurrentDB() dbx.Builder { 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 // SELECT, FROM and other common fields based on the provided model. 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 txDao := New(txOrDB) + txDao.MaxLockRetries = dao.MaxLockRetries + txDao.ModelQueryTimeout = dao.ModelQueryTimeout txDao.BeforeCreateFunc = dao.BeforeCreateFunc txDao.BeforeUpdateFunc = dao.BeforeUpdateFunc txDao.BeforeDeleteFunc = dao.BeforeDeleteFunc diff --git a/daos/base_test.go b/daos/base_test.go index 45994a84..459e8391 100644 --- a/daos/base_test.go +++ b/daos/base_test.go @@ -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) { testApp, _ := tests.NewTestApp() defer testApp.Cleanup()