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…
	
		Reference in New Issue