diff --git a/api_test.go b/api_test.go
index fc97ea6..630d993 100644
--- a/api_test.go
+++ b/api_test.go
@@ -24,7 +24,6 @@
 	mathrand "math/rand"
 	"net/http"
 	"net/url"
-	"os"
 	"strconv"
 	"strings"
 	"time"
@@ -539,78 +538,3 @@
 	}
 	return detail
 }
-
-type dummyDbManager struct {
-	unreadyBlobIds   []string
-	readyDeployments []Configuration
-	localFSLocation  string
-	fileResponse     chan string
-	version          string
-	configurations   map[string]*Configuration
-	lsn              string
-	err              error
-}
-
-func (d *dummyDbManager) setDbVersion(version string) {
-	d.version = version
-}
-
-func (d *dummyDbManager) initDb() error {
-	return nil
-}
-
-func (d *dummyDbManager) getUnreadyBlobs() ([]string, error) {
-	return d.unreadyBlobIds, nil
-}
-
-func (d *dummyDbManager) getReadyConfigurations(typeFilter string) ([]Configuration, error) {
-	if typeFilter == "" {
-		return d.readyDeployments, nil
-	}
-	return []Configuration{*(d.configurations[typeFilter])}, nil
-}
-
-func (d *dummyDbManager) getAllConfigurations(typeFilter string) ([]Configuration, error) {
-	if typeFilter == "" {
-		return d.readyDeployments, nil
-	}
-	return []Configuration{*(d.configurations[typeFilter])}, nil
-}
-
-func (d *dummyDbManager) updateLocalFsLocation(blobId, localFsLocation string) error {
-	file, err := os.Open(localFsLocation)
-	if err != nil {
-		return err
-	}
-	buff := make([]byte, 36)
-	_, err = file.Read(buff)
-	if err != nil {
-		return err
-	}
-	go func(buff []byte) {
-		d.fileResponse <- string(buff)
-	}(buff)
-
-	return nil
-}
-
-func (d *dummyDbManager) getLocalFSLocation(string) (string, error) {
-	return d.localFSLocation, nil
-}
-
-func (d *dummyDbManager) getConfigById(id string) (*Configuration, error) {
-	return d.configurations[id], d.err
-}
-func (d *dummyDbManager) getLSN() string {
-	return d.lsn
-}
-
-func (d *dummyDbManager) updateLSN(LSN string) error {
-	d.lsn = LSN
-	return nil
-}
-
-func (d *dummyDbManager) loadLsnFromDb() error {
-
-	return nil
-}
diff --git a/bundle.go b/bundle.go
index ab7e073..c9d7d80 100644
--- a/bundle.go
+++ b/bundle.go
@@ -106,7 +106,6 @@
 	}
 }
 
-//TODO: add tests for this
 func (bm *bundleManager) downloadBlobsWithCallback(blobs []string, callback func()) {
 
 	c := &BunchDownloadRequest{
diff --git a/bundle_test.go b/bundle_test.go
index fc1ec0d..c77114f 100644
--- a/bundle_test.go
+++ b/bundle_test.go
@@ -17,15 +17,11 @@
 import (
 	"net/http"
 
-	"bytes"
-	"encoding/json"
 	"github.com/apid/apid-core/util"
-	"github.com/gorilla/mux"
+
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
-	"io"
 	mathrand "math/rand"
-	"strings"
 	"sync/atomic"
 	"time"
 )
@@ -220,78 +216,3 @@
 	})
 
 })
-
-type dummyApiManager struct {
-	initCalled chan bool
-	notifyChan chan bool
-}
-
-func (a *dummyApiManager) InitAPI() {
-	go func() {
-		a.initCalled <- true
-	}()
-}
-
-func (a *dummyApiManager) notifyNewChange() {
-	a.notifyChan <- true
-}
-
-type dummyBlobServer struct {
-	serverEndpoint string
-	signedEndpoint string
-	signedTimeout  *int32
-	blobTimeout    *int32
-	resetTimeout   bool
-}
-
-func (b *dummyBlobServer) start() {
-	services.API().HandleFunc(b.serverEndpoint, b.returnSigned).Methods("GET")
-	services.API().HandleFunc(b.signedEndpoint, b.returnBlob).Methods("GET")
-}
-
-// send a dummy uri as response
-func (b *dummyBlobServer) returnSigned(w http.ResponseWriter, r *http.Request) {
-	defer GinkgoRecover()
-	if atomic.LoadInt32(b.signedTimeout) == int32(1) {
-		if b.resetTimeout {
-			atomic.StoreInt32(b.signedTimeout, 0)
-		}
-		time.Sleep(time.Second)
-	}
-	vars := mux.Vars(r)
-	blobId := vars["blobId"]
-
-	uriString := strings.Replace(bundleTestUrl+b.signedEndpoint, "{blobId}", blobId, 1)
-	log.Debug("dummyBlobServer returnSigned: " + uriString)
-
-	res := blobServerResponse{
-		Id:                       blobId,
-		Kind:                     "Blob",
-		Self:                     r.RequestURI,
-		SignedUrl:                uriString,
-		SignedUrlExpiryTimestamp: time.Now().Add(3 * time.Hour).Format(time.RFC3339),
-	}
-
-	resBytes, err := json.Marshal(res)
-	Expect(err).Should(Succeed())
-	_, err = io.Copy(w, bytes.NewReader(resBytes))
-	Expect(err).Should(Succeed())
-	w.Header().Set("Content-Type", headerSteam)
-}
-
-// send blobId back as response
-func (b *dummyBlobServer) returnBlob(w http.ResponseWriter, r *http.Request) {
-	defer GinkgoRecover()
-	if atomic.LoadInt32(b.blobTimeout) == int32(1) {
-		if b.resetTimeout {
-			atomic.StoreInt32(b.blobTimeout, 0)
-		}
-		time.Sleep(time.Second)
-	}
-	vars := mux.Vars(r)
-	blobId := vars["blobId"]
-	log.Debug("dummyBlobServer returnBlob id=" + blobId)
-	_, err := io.Copy(w, bytes.NewReader([]byte(blobId)))
-	Expect(err).Should(Succeed())
-	w.Header().Set("Content-Type", headerSteam)
-}
diff --git a/data.go b/data.go
index 869c90b..9734130 100644
--- a/data.go
+++ b/data.go
@@ -53,7 +53,6 @@
 	setDbVersion(string)
 	initDb() error
 	getUnreadyBlobs() ([]string, error)
-	getReadyConfigurations(typeFilter string) ([]Configuration, error)
 	getAllConfigurations(typeFilter string) ([]Configuration, error)
 	updateLocalFsLocation(string, string) error
 	getLocalFSLocation(string) (string, error)
diff --git a/data_test.go b/data_test.go
index 2cfded0..e8114c3 100644
--- a/data_test.go
+++ b/data_test.go
@@ -38,6 +38,8 @@
 		"gcs:SHA-512:8fcc902465ccb32ceff25fa9f6fb28e3b314dbc2874c0f8add02f4e29c9e2798d344c51807aa1af56035cf09d39c800cf605d627ba65723f26d8b9c83c82d2f2": true,
 		"gcs:SHA-512:0c648779da035bfe0ac21f6268049aa0ae74d9d6411dadefaec33991e55c2d66c807e06f7ef84e0947f7c7d63b8c9e97cf0684cbef9e0a86b947d73c74ae7455": true,
 	}
+
+	allConfigs map[string]bool
 )
 
 var _ = Describe("data", func() {
@@ -54,6 +56,14 @@
 		initTestDb(testDbMan.getDb())
 		err := testDbMan.initDb()
 		Expect(err).Should(Succeed())
+		allConfigs = map[string]bool{
+			"1dc4895e-6494-4b59-979f-5f4c89c073b4": true,
+			"319963ff-217e-4ecc-8d6e-c3665e962d1e": true,
+			"3af44bb7-0a74-4283-860c-3561e6c19132": true,
+			"d5ffd9db-4795-43eb-b645-d2a0b6c8ac6a": true,
+			"84ac8d68-b3d1-4bcc-ad0d-c6a0ed67e16c": true,
+			"3ecd351c-1173-40bf-b830-c194e5ef9038": true,
+		}
 		time.Sleep(100 * time.Millisecond)
 	})
 
@@ -145,9 +155,20 @@
 			confs, err := testDbMan.getAllConfigurations("")
 			Expect(err).Should(Succeed())
 			Expect(len(confs)).Should(Equal(6))
+			for _, conf := range confs {
+				Expect(allConfigs[conf.ID]).Should(BeTrue())
+				allConfigs[conf.ID] = false
+			}
 		})
 
-		It("should get empty slice if no configurations are ready", func() {
+		It("should get empty slice if no configurations", func() {
+			trancateTestMetadataTable(testDbMan.getDb())
+			confs, err := testDbMan.getReadyConfigurations("")
+			Expect(err).Should(Succeed())
+			Expect(len(confs)).Should(BeZero())
+		})
+
+		XIt("should get empty slice if no configurations are ready", func() {
 			confs, err := testDbMan.getReadyConfigurations("")
 			Expect(err).Should(Succeed())
 			Expect(len(confs)).Should(BeZero())
@@ -208,7 +229,7 @@
 			Expect(err).ShouldNot(Succeed())
 		})
 
-		It("should successfully get all ready configurations", func() {
+		XIt("should successfully get all ready configurations", func() {
 
 			err := testDbMan.updateLocalFsLocation(readyBlobId, testBlobLocalFsPrefix+readyBlobId)
 			Expect(err).Should(Succeed())
@@ -226,24 +247,22 @@
 			}
 		})
 
-		It("should get ready configurations by type filter", func() {
+		It("should get all configurations by type filter", func() {
 
 			err := testDbMan.updateLocalFsLocation(readyBlobId, testBlobLocalFsPrefix+readyBlobId)
 			Expect(err).Should(Succeed())
 			err = testDbMan.updateLocalFsLocation(readyResourceId, testBlobLocalFsPrefix+readyResourceId)
 			Expect(err).Should(Succeed())
 
-			confs, err := testDbMan.getReadyConfigurations("ORGANIZATION")
+			confs, err := testDbMan.getAllConfigurations("ORGANIZATION")
 			Expect(err).Should(Succeed())
-			Expect(len(confs)).Should(Equal(1))
-			Expect(confs[0].ID).Should(Equal("319963ff-217e-4ecc-8d6e-c3665e962d1e"))
+			Expect(len(confs)).Should(Equal(2))
 
-			confs, err = testDbMan.getReadyConfigurations("ENVIRONMENT")
+			confs, err = testDbMan.getAllConfigurations("ENVIRONMENT")
 			Expect(err).Should(Succeed())
-			Expect(len(confs)).Should(Equal(1))
-			Expect(confs[0].ID).Should(Equal("1dc4895e-6494-4b59-979f-5f4c89c073b4"))
+			Expect(len(confs)).Should(Equal(4))
 
-			confs, err = testDbMan.getReadyConfigurations("INVALID-TYPE")
+			confs, err = testDbMan.getAllConfigurations("INVALID-TYPE")
 			Expect(err).Should(Succeed())
 			Expect(len(confs)).Should(Equal(0))
 		})
@@ -419,3 +438,14 @@
 	Expect(err).Should(Succeed())
 	Expect(tx.Commit()).Should(Succeed())
 }
+
+func trancateTestMetadataTable(db apid.DB) {
+	tx, err := db.Begin()
+	Expect(err).Should(Succeed())
+	defer tx.Rollback()
+	_, err = tx.Exec(`
+		DELETE FROM metadata_runtime_entity_metadata;
+	`)
+	Expect(err).Should(Succeed())
+	Expect(tx.Commit()).Should(Succeed())
+}
diff --git a/listener_test.go b/listener_test.go
index 000a6e9..d08934e 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -293,38 +293,6 @@
 	})
 })
 
-type dummyBundleManager struct {
-	blobChan chan string
-}
-
-func (bm *dummyBundleManager) initializeBundleDownloading() {
-
-}
-
-func (bm *dummyBundleManager) downloadBlobsWithCallback(blobs []string, callback func()) {
-	go func() {
-		for _, id := range blobs {
-			bm.blobChan <- id
-		}
-	}()
-	go callback()
-}
-
-func (bm *dummyBundleManager) makeDownloadRequest(blobId string, bunchRequest *BunchDownloadRequest) *DownloadRequest {
-	return &DownloadRequest{
-		blobId:       blobId,
-		bunchRequest: bunchRequest,
-	}
-}
-
-func (bm *dummyBundleManager) deleteBlobs(blobIds []string) {
-
-}
-
-func (bm *dummyBundleManager) Close() {
-
-}
-
 func rowFromDeployment(dep *Configuration) common.Row {
 	row := common.Row{}
 	row["id"] = &common.ColumnVal{Value: dep.ID}
diff --git a/mock_test.go b/mock_test.go
new file mode 100644
index 0000000..b272eaf
--- /dev/null
+++ b/mock_test.go
@@ -0,0 +1,190 @@
+package apiGatewayConfDeploy
+
+import (
+	"bytes"
+	"encoding/json"
+	"github.com/gorilla/mux"
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"io"
+	"net/http"
+	"os"
+	"strings"
+	"sync/atomic"
+	"time"
+)
+
+type dummyDbManager struct {
+	unreadyBlobIds   []string
+	readyDeployments []Configuration
+	localFSLocation  string
+	fileResponse     chan string
+	version          string
+	configurations   map[string]*Configuration
+	lsn              string
+	err              error
+}
+
+func (d *dummyDbManager) setDbVersion(version string) {
+	d.version = version
+}
+
+func (d *dummyDbManager) initDb() error {
+	return nil
+}
+
+func (d *dummyDbManager) getUnreadyBlobs() ([]string, error) {
+	return d.unreadyBlobIds, nil
+}
+
+func (d *dummyDbManager) getAllConfigurations(typeFilter string) ([]Configuration, error) {
+	if typeFilter == "" {
+		return d.readyDeployments, nil
+	}
+	return []Configuration{*(d.configurations[typeFilter])}, nil
+}
+
+func (d *dummyDbManager) updateLocalFsLocation(blobId, localFsLocation string) error {
+	file, err := os.Open(localFsLocation)
+	if err != nil {
+		return err
+	}
+	buff := make([]byte, 36)
+	_, err = file.Read(buff)
+	if err != nil {
+		return err
+	}
+	go func(buff []byte) {
+		d.fileResponse <- string(buff)
+	}(buff)
+
+	return nil
+}
+
+func (d *dummyDbManager) getLocalFSLocation(string) (string, error) {
+	return d.localFSLocation, nil
+}
+
+func (d *dummyDbManager) getConfigById(id string) (*Configuration, error) {
+	return d.configurations[id], d.err
+}
+func (d *dummyDbManager) getLSN() string {
+	return d.lsn
+}
+
+func (d *dummyDbManager) updateLSN(LSN string) error {
+	d.lsn = LSN
+	return nil
+}
+
+func (d *dummyDbManager) loadLsnFromDb() error {
+
+	return nil
+}
+
+type dummyApiManager struct {
+	initCalled chan bool
+	notifyChan chan bool
+}
+
+func (a *dummyApiManager) InitAPI() {
+	go func() {
+		a.initCalled <- true
+	}()
+}
+
+func (a *dummyApiManager) notifyNewChange() {
+	a.notifyChan <- true
+}
+
+type dummyBundleManager struct {
+	blobChan chan string
+}
+
+func (bm *dummyBundleManager) initializeBundleDownloading() {
+
+}
+
+func (bm *dummyBundleManager) downloadBlobsWithCallback(blobs []string, callback func()) {
+	go func() {
+		for _, id := range blobs {
+			bm.blobChan <- id
+		}
+	}()
+	go callback()
+}
+
+func (bm *dummyBundleManager) makeDownloadRequest(blobId string, bunchRequest *BunchDownloadRequest) *DownloadRequest {
+	return &DownloadRequest{
+		blobId:       blobId,
+		bunchRequest: bunchRequest,
+	}
+}
+
+func (bm *dummyBundleManager) deleteBlobs(blobIds []string) {
+
+}
+
+func (bm *dummyBundleManager) Close() {
+
+}
+
+type dummyBlobServer struct {
+	serverEndpoint string
+	signedEndpoint string
+	signedTimeout  *int32
+	blobTimeout    *int32
+	resetTimeout   bool
+}
+
+func (b *dummyBlobServer) start() {
+	services.API().HandleFunc(b.serverEndpoint, b.returnSigned).Methods("GET")
+	services.API().HandleFunc(b.signedEndpoint, b.returnBlob).Methods("GET")
+}
+
+// send a dummy uri as response
+func (b *dummyBlobServer) returnSigned(w http.ResponseWriter, r *http.Request) {
+	defer GinkgoRecover()
+	if atomic.LoadInt32(b.signedTimeout) == int32(1) {
+		if b.resetTimeout {
+			atomic.StoreInt32(b.signedTimeout, 0)
+		}
+		time.Sleep(time.Second)
+	}
+	vars := mux.Vars(r)
+	blobId := vars["blobId"]
+
+	uriString := strings.Replace(bundleTestUrl+b.signedEndpoint, "{blobId}", blobId, 1)
+	log.Debug("dummyBlobServer returnSigned: " + uriString)
+
+	res := blobServerResponse{
+		Id:                       blobId,
+		Kind:                     "Blob",
+		Self:                     r.RequestURI,
+		SignedUrl:                uriString,
+		SignedUrlExpiryTimestamp: time.Now().Add(3 * time.Hour).Format(time.RFC3339),
+	}
+
+	resBytes, err := json.Marshal(res)
+	Expect(err).Should(Succeed())
+	_, err = io.Copy(w, bytes.NewReader(resBytes))
+	Expect(err).Should(Succeed())
+	w.Header().Set("Content-Type", headerSteam)
+}
+
+// send blobId back as response
+func (b *dummyBlobServer) returnBlob(w http.ResponseWriter, r *http.Request) {
+	defer GinkgoRecover()
+	if atomic.LoadInt32(b.blobTimeout) == int32(1) {
+		if b.resetTimeout {
+			atomic.StoreInt32(b.blobTimeout, 0)
+		}
+		time.Sleep(time.Second)
+	}
+	vars := mux.Vars(r)
+	blobId := vars["blobId"]
+	log.Debug("dummyBlobServer returnBlob id=" + blobId)
+	_, err := io.Copy(w, bytes.NewReader([]byte(blobId)))
+	Expect(err).Should(Succeed())
+	w.Header().Set("Content-Type", headerSteam)
+}
