From af4eba4bf6e8c22ce79e3383afa955c0da8be1f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20Garcia?= <vingarcia00@gmail.com>
Date: Mon, 27 Sep 2021 15:12:54 -0300
Subject: [PATCH] Improve how SetFallbackDatabase works so it only sets nil
 values

---
 mocks.go | 49 +++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 41 insertions(+), 8 deletions(-)

diff --git a/mocks.go b/mocks.go
index f7c7111..caa5ca0 100644
--- a/mocks.go
+++ b/mocks.go
@@ -30,17 +30,50 @@ type Mock struct {
 // and integration tests, this way instead of creating a new server
 // with a real database and another with a mocked one you can start
 // the server once and run both types of tests.
+//
+// Example Usage:
+//
+//	db, err := ksql.New(...)
+//	if err != nil {
+//		t.Fatal(err.Error())
+//	}
+//
+//	mockdb := ksql.Mock{
+//		UpdateFn: func(_ context.Context, _ ksql.Table, record interface{}) error {
+//			return ksql.ErrRecordNotFound
+//		},
+//	}.SetFallbackDatabase(db)
+//
+//	// Passing the address to the service so
+//	// you can change it for each test
+//	myService := myservice.New(..., &mockdb, ...)
 func (m Mock) SetFallbackDatabase(db Provider) Mock {
-	m.InsertFn = db.Insert
-	m.UpdateFn = db.Update
-	m.DeleteFn = db.Delete
+	if m.InsertFn == nil {
+		m.InsertFn = db.Insert
+	}
+	if m.UpdateFn == nil {
+		m.UpdateFn = db.Update
+	}
+	if m.DeleteFn == nil {
+		m.DeleteFn = db.Delete
+	}
 
-	m.QueryFn = db.Query
-	m.QueryOneFn = db.QueryOne
-	m.QueryChunksFn = db.QueryChunks
+	if m.QueryFn == nil {
+		m.QueryFn = db.Query
+	}
+	if m.QueryOneFn == nil {
+		m.QueryOneFn = db.QueryOne
+	}
+	if m.QueryChunksFn == nil {
+		m.QueryChunksFn = db.QueryChunks
+	}
 
-	m.ExecFn = db.Exec
-	m.TransactionFn = db.Transaction
+	if m.ExecFn == nil {
+		m.ExecFn = db.Exec
+	}
+	if m.TransactionFn == nil {
+		m.TransactionFn = db.Transaction
+	}
 
 	return m
 }