diff --git a/go.mod b/go.mod
index 4332e9160c407b09c0e126934937275447cc7d51..237510fb4030d3988a7a08bfe88ac8588c7b73f6 100644
--- a/go.mod
+++ b/go.mod
@@ -7,10 +7,13 @@ require (
 	git.science.uu.nl/datastrophe/keyvaluestore v0.0.0-20210517170603-34902cd5c90d
 	git.science.uu.nl/datastrophe/query-conversion v0.0.0-20210518093948-06ff65cdf577
 	github.com/arangodb/go-driver v0.0.0-20210518064911-4985e8be3d90
+	github.com/boumenot/gocover-cobertura v1.1.0 // indirect
 	github.com/stretchr/testify v1.7.0
 	github.com/thijsheijden/alice v0.1.18
+	golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
 	golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect
 	golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 // indirect
-	google.golang.org/grpc v1.37.1
+	golang.org/x/tools v0.1.1 // indirect
+	google.golang.org/grpc v1.37.0
 	google.golang.org/protobuf v1.26.0
 )
diff --git a/go.sum b/go.sum
index d3c5b11d676dbebaa6b1c0708682a26b8b75c8eb..eed7e8733b8763579db3e28854895203bca8c535 100644
--- a/go.sum
+++ b/go.sum
@@ -18,6 +18,8 @@ github.com/arangodb/go-driver v0.0.0-20210518064911-4985e8be3d90 h1:NMnMsS32jOF+
 github.com/arangodb/go-driver v0.0.0-20210518064911-4985e8be3d90/go.mod h1:3NUekcRLpgheFIGEwcOvxilEW73MV1queNKW58k7sdc=
 github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e h1:Xg+hGrY2LcQBbxd0ZFdbGSyRKTYMZCfBbw/pMJFOk1g=
 github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e/go.mod h1:mq7Shfa/CaixoDxiyAAc5jZ6CVBAyPaNQCGS7mkj4Ho=
+github.com/boumenot/gocover-cobertura v1.1.0 h1:nqMsp1zONyd3Bz98gscF2CpMupSCY0BQA4nmLhkcoYQ=
+github.com/boumenot/gocover-cobertura v1.1.0/go.mod h1:fz7ly8dslE42VRR5ZWLt2OHGDHjkTiA2oNvKgJEjLT0=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -87,12 +89,15 @@ github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1Sd
 github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/thijsheijden/alice v0.1.18 h1:lHmhzruprpH0FH6XlCg8zDqTZI15Iuuj9VCNvH6a8Wc=
 github.com/thijsheijden/alice v0.1.18/go.mod h1:lYOP30HKhw/7xJa3lLhs+Xsdc5T7MRo7DOb/npzfg9I=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 go.opentelemetry.io/otel v0.19.0 h1:Lenfy7QHRXPZVsw/12CWpxX6d/JkrX8wrx2vO8G80Ng=
 go.opentelemetry.io/otel v0.19.0/go.mod h1:j9bF567N9EfomkSidSfmMwIwIBuP37AMAIzVW85OxSg=
 go.opentelemetry.io/otel/metric v0.19.0 h1:dtZ1Ju44gkJkYvo+3qGqVXmf88tc+a42edOywypengg=
@@ -108,7 +113,13 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -116,6 +127,7 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -131,6 +143,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -144,6 +157,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E=
 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -159,8 +173,12 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200526224456-8b020aee10d2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/internal/usecases/consume/consume_test.go b/internal/usecases/consume/consume_test.go
index 0e750c82a906da96e5102adc50f76157998abe6c..cac617b6e0479c2791f64a9730c4a2d316fa4212 100644
--- a/internal/usecases/consume/consume_test.go
+++ b/internal/usecases/consume/consume_test.go
@@ -3,204 +3,201 @@ package consume
 import (
 	"context"
 	"encoding/json"
-	mockdatabaseinfo "query-service/internal/usecases/databaseinfo/mock"
+	"query-service/internal/entity"
+	"query-service/internal/usecases/databaseinfo/mockdatabaseinfo"
 	"query-service/internal/usecases/produce"
-	mockrequest "query-service/internal/usecases/request/mock"
+	"query-service/internal/usecases/request/mockrequest"
+
 	"testing"
 
 	"git.science.uu.nl/datastrophe/broker"
 	"git.science.uu.nl/datastrophe/keyvaluestore"
-	mockconvertquery "git.science.uu.nl/datastrophe/query-conversion/aql"
-
+	"git.science.uu.nl/datastrophe/query-conversion"
+	"git.science.uu.nl/datastrophe/query-conversion/aql"
 	"github.com/stretchr/testify/assert"
 )
 
-func TestHandleCorrectMessage(t *testing.T) {
-	// Create a mock broker
-	mockBroker := broker.NewMockDriver().(*broker.MockDriver)
-	// Create mock key value store
-	keyValueStore := keyvaluestore.NewMockDriver()
-	// Create new producer service
-	producerService := produce.NewService(mockBroker, keyValueStore)
-	producerService.Start()
-	// Create new convert query service
-	convertQueryService := mockconvertquery.NewMockService()
-	// Create new request sender service
-	requestSenderService := mockrequest.NewService()
-	// Create mock databaseinfo service
-	databaseInfoService := mockdatabaseinfo.NewService()
-	// Create new service
-	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService, databaseInfoService)
-
-	// Create mock session and mock queue
-	mockSession := "mock-session"
-	mockClient := "mock-client"
-	mockQueue := "mock-queue"
-
-	// Set the test-session sessionID queue to mock-queue in key value store
-	keyValueStore.Set(context.Background(), mockSession, mockQueue)
-
-	// Create headers containing a sessionID
-	headers := make(map[string]interface{})
-	headers["sessionID"] = mockSession
-	headers["clientID"] = mockClient
-	mockMessage := broker.Message{
-		Headers: headers,
-		Body:    []byte("test message"),
-	}
-
-	// Assert that there have not been any messages sent yet
-	assert.Empty(t, mockBroker.Messages)
-
-	// Send the mock message
-	service.HandleMessage(&mockMessage)
-
-	// Assert that there now are two messages that have been sent with routing key mock-queue
-	assert.Len(t, mockBroker.Messages[mockQueue], 2)
-
-	// Assert that the first message is of type 'query_translation_result' and has 'Query converted' as value
-	var translationMessage map[string]interface{}
-	json.Unmarshal(mockBroker.Messages[mockQueue][0].Body, &translationMessage)
-	assert.Equal(t, "query_translation_result", translationMessage["type"])
-	assert.Equal(t, "Query converted", translationMessage["values"])
-
-	// Assert that the second message is of type 'query_result' and contains no values
-	var resultMessage map[string]interface{}
-	json.Unmarshal(mockBroker.Messages[mockQueue][1].Body, &resultMessage)
-	assert.Equal(t, "query_result", resultMessage["type"])
-	assert.Equal(t, "test", resultMessage["values"])
-}
-
-// Unit test message received with no session ID
-func TestHandleMessageNoSessionID(t *testing.T) {
-	// Create a mock broker
-	mockBroker := broker.NewMockDriver().(*broker.MockDriver)
-	// Create mock key value store
-	keyValueStore := keyvaluestore.NewMockDriver()
-	// Create new producer service
-	producerService := produce.NewService(mockBroker, keyValueStore)
-	// Create new convert query service
-	convertQueryService := mockconvertquery.NewMockService()
-	// Create new request sender service
-	requestSenderService := mockrequest.NewService()
-	// Create mock databaseinfo service
-	databaseInfoService := mockdatabaseinfo.NewService()
-	// Create new service
-	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService, databaseInfoService)
-
-	// Create headers containing a sessionID
-	headers := make(map[string]interface{})
-	mockMessage := broker.Message{
-		Headers: headers,
-		Body:    []byte("test message"),
-	}
-
-	// Assert that there have not been any messages sent yet
-	assert.Empty(t, mockBroker.Messages)
-
-	// Send the mock message
-	service.HandleMessage(&mockMessage)
-
-	// Assert that there was no message published
-	assert.Empty(t, mockBroker.Messages)
+type testSuite struct {
+	mockBroker           *broker.MockDriver
+	mockKeyValueStore    keyvaluestore.Interface
+	produceService       *produce.Service
+	queryConverter       query.Converter
+	requestSenderService *mockrequest.Service
+	databaseInfoService  *mockdatabaseinfo.Service
+	service              *Service
 }
 
-// Unit test receival of message and not being able to parse it
-func TestFailToConvertQuery(t *testing.T) {
-	// Create a mock broker
-	mockBroker := broker.NewMockDriver().(*broker.MockDriver)
-	// Create mock key value store
-	keyValueStore := keyvaluestore.NewMockDriver()
-	// Create new producer service
-	producerService := produce.NewService(mockBroker, keyValueStore)
-	producerService.Start()
-	// Create new convert query service
-	convertQueryService := mockconvertquery.NewMockService()
-	// Create new request sender service
-	requestSenderService := mockrequest.NewService()
-	// Create mock databaseinfo service
-	databaseInfoService := mockdatabaseinfo.NewService()
-	// Create new service
-	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService, databaseInfoService)
-
-	// Create mock session and mock queue
-	mockSession := "mock-session"
-	mockClient := "mock-client"
-	mockQueue := "mock-queue"
-
-	// Set the test-session sessionID queue to mock-queue in key value store
-	keyValueStore.Set(context.Background(), mockSession, mockQueue)
-
-	// Create headers containing a sessionID
-	headers := make(map[string]interface{})
-	headers["sessionID"] = mockSession
-	headers["clientID"] = mockClient
-	mockMessage := broker.Message{
-		Headers: headers,
-		Body:    []byte("test message"),
-	}
-
-	// Make it so that the conversion service throws an error
-	convertQueryService.ToggleError()
-
-	// Assert that there have not been any messages sent yet
-	assert.Empty(t, mockBroker.Messages)
-
-	// Send the mock message
-	service.HandleMessage(&mockMessage)
-
-	// Assert that there was an error message published
-	var errorMsg map[string]interface{}
-	json.Unmarshal(mockBroker.Messages[mockQueue][0].Body, &errorMsg)
-	assert.Equal(t, "query_translation_error", errorMsg["type"])
+// Reset all stateful things
+func (ts *testSuite) reset() {
+	// Reset broker messages
+	ts.mockBroker.Messages = make(map[string][]broker.Message)
 }
 
-// Test AQL querying error handling
-func TestArangoError(t *testing.T) {
-	// Create a mock broker
+func TestHandleMessages(t *testing.T) {
+	// Create test suite
 	mockBroker := broker.NewMockDriver().(*broker.MockDriver)
-	// Create mock key value store
-	keyValueStore := keyvaluestore.NewMockDriver()
-	// Create new producer service
-	producerService := produce.NewService(mockBroker, keyValueStore)
-	producerService.Start()
-	// Create new convert query service
-	convertQueryService := mockconvertquery.NewMockService()
-	// Create new request sender service
-	requestSenderService := mockrequest.NewService()
-	// Create mock databaseinfo service
-	databaseInfoService := mockdatabaseinfo.NewService()
-	// Create new service
-	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService, databaseInfoService)
-
-	// Create mock session and mock queue
-	mockSession := "mock-session"
-	mockClient := "mock-client"
-	mockQueue := "mock-queue"
-
-	// Set the test-session sessionID queue to mock-queue in key value store
-	keyValueStore.Set(context.Background(), mockSession, mockQueue)
-
-	// Create headers containing a sessionID
-	headers := make(map[string]interface{})
-	headers["sessionID"] = mockSession
-	headers["clientID"] = mockClient
-	mockMessage := broker.Message{
-		Headers: headers,
-		Body:    []byte("test message"),
+	mockKeyValueStore := keyvaluestore.NewMockDriver()
+	ts := testSuite{
+		mockBroker:           mockBroker,
+		mockKeyValueStore:    mockKeyValueStore,
+		produceService:       produce.NewService(mockBroker, mockKeyValueStore),
+		queryConverter:       aql.NewMockService(),
+		requestSenderService: mockrequest.NewService(),
+		databaseInfoService:  mockdatabaseinfo.NewService(),
 	}
-
-	// Make it so that the request sender service throws an error
-	requestSenderService.ToggleError()
-
-	// Assert that there have not been any messages sent yet
-	assert.Empty(t, mockBroker.Messages)
-
-	// Send the mock message
-	service.HandleMessage(&mockMessage)
-
-	// Assert that there was an error message published
-	var errorMsg map[string]interface{}
-	json.Unmarshal(mockBroker.Messages[mockQueue][1].Body, &errorMsg)
-	assert.Equal(t, "query_database_error", errorMsg["type"])
+	ts.service = NewService(mockBroker, ts.produceService, ts.queryConverter, ts.requestSenderService, ts.databaseInfoService)
+
+	// Set routing in the mock keyvaluestore
+	ts.mockKeyValueStore.Set(context.Background(), "mock-session", "mock-queue")
+
+	// Start producer
+	ts.produceService.Start()
+
+	// Run tests using the test suite
+	t.Run("correct message", func(t *testing.T) {
+		// Reset possible state
+		ts.reset()
+
+		// Create a mock message
+		headers := make(map[string]interface{})
+		headers["sessionID"] = "mock-session"
+		headers["clientID"] = "mock-client"
+		mockMessage := broker.Message{
+			Headers: headers,
+			Body: []byte(`{
+				"databaseName": "test",
+				"return": {
+					"entities": [],
+					"relations": []
+				},
+				"entities": [],
+				"relations": [],
+				"limit": 5000
+			}`),
+		}
+
+		// Assert that there have not been any messages sent yet
+		assert.Empty(t, mockBroker.Messages)
+
+		// Send the mock message
+		ts.service.HandleMessage(&mockMessage)
+
+		// Assert that there now are two messages that have been sent with routing key mock-queue
+		assert.Len(t, mockBroker.Messages["mock-queue"], 2)
+
+		// Assert that the first message is of type 'query_translation_result' and has 'Query converted' as value
+		var translationMessage entity.MessageStruct
+		json.Unmarshal(mockBroker.Messages["mock-queue"][0].Body, &translationMessage)
+		assert.Equal(t, "query_translation_result", translationMessage.Type)
+		assert.Equal(t, "Query converted", translationMessage.Value)
+
+		// Assert that the second message is of type 'query_result' and contains no values
+		var resultMessage entity.MessageStruct
+		json.Unmarshal(mockBroker.Messages["mock-queue"][1].Body, &resultMessage)
+		assert.Equal(t, "query_result", resultMessage.Type)
+		assert.Equal(t, "test", resultMessage.Value)
+	})
+
+	t.Run("no session id", func(t *testing.T) {
+		// Reset possible state
+		ts.reset()
+
+		// Create a mock message
+		headers := make(map[string]interface{})
+		headers["clientID"] = "mock-client"
+		mockMessage := broker.Message{
+			Headers: headers,
+			Body: []byte(`{
+				"databaseName": "test",
+				"return": {
+					"entities": [],
+					"relations": []
+				},
+				"entities": [],
+				"relations": [],
+				"limit": 5000
+			}`),
+		}
+
+		// Assert that there have not been any messages sent yet
+		assert.Empty(t, mockBroker.Messages)
+
+		// Send the mock message
+		ts.service.HandleMessage(&mockMessage)
+
+		// Assert that there was no message published
+		assert.Empty(t, mockBroker.Messages)
+	})
+
+	t.Run("failure to unmarshal JSON query", func(t *testing.T) {
+		// Reset possible state
+		ts.reset()
+
+		// Create a mock message
+		headers := make(map[string]interface{})
+		headers["clientID"] = "mock-client"
+		headers["sessionID"] = "mock-session"
+		mockMessage := broker.Message{
+			Headers: headers,
+			Body: []byte(`{
+				"databaseName": "test",
+				"return": {
+					"entities": [],
+					"relations": []
+				},
+				"entities": [],
+				"relations": [],
+				"limit": "test"
+			}`),
+		}
+
+		// Assert that there have not been any messages sent yet
+		assert.Empty(t, mockBroker.Messages)
+
+		// Send the mock message
+		ts.service.HandleMessage(&mockMessage)
+
+		// Assert that there was an error message published
+		var errorMsg entity.MessageStruct
+		json.Unmarshal(mockBroker.Messages["mock-queue"][0].Body, &errorMsg)
+		assert.Equal(t, "query_translation_error", errorMsg.Type)
+	})
+
+	// MARK: test
+	t.Run("database execution error", func(t *testing.T) {
+		// Reset possible state
+		ts.reset()
+
+		// Create a mock message
+		headers := make(map[string]interface{})
+		headers["clientID"] = "mock-client"
+		headers["sessionID"] = "mock-session"
+		mockMessage := broker.Message{
+			Headers: headers,
+			Body: []byte(`{
+				"databaseName": "test",
+				"return": {
+					"entities": [],
+					"relations": []
+				},
+				"entities": [],
+				"relations": [],
+				"limit": 5000
+			}`),
+		}
+
+		// Make it so that the request sender service throws an error
+		ts.requestSenderService.ToggleError()
+
+		// Assert that there have not been any messages sent yet
+		assert.Empty(t, mockBroker.Messages)
+
+		// Send the mock message
+		ts.service.HandleMessage(&mockMessage)
+
+		// Assert that there was an error message published
+		var errorMsg entity.MessageStruct
+		json.Unmarshal(mockBroker.Messages["mock-queue"][1].Body, &errorMsg)
+		assert.Equal(t, "query_database_error", errorMsg.Type)
+	})
 }
diff --git a/internal/usecases/consume/mock/consume.go b/internal/usecases/consume/mock/consume.go
deleted file mode 100644
index 95fb4ff8722a1e85d97a20e8e551b63bdf6b67c1..0000000000000000000000000000000000000000
--- a/internal/usecases/consume/mock/consume.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package mockconsume
-
-// A Service implements the consume usecase interface (mock)
-type Service struct {
-	throwError bool
-}
-
-// NewService creates a new consume service (mock)
-func NewService() *Service {
-	return &Service{
-		throwError: false,
-	}
-}
-
-// Start starts the consume service (mock)
-func (s *Service) Start() {
-
-}
diff --git a/internal/usecases/databaseinfo/mock/mockdatabaseinfo.go b/internal/usecases/databaseinfo/mockdatabaseinfo/mockdatabaseinfo.go
similarity index 100%
rename from internal/usecases/databaseinfo/mock/mockdatabaseinfo.go
rename to internal/usecases/databaseinfo/mockdatabaseinfo/mockdatabaseinfo.go
diff --git a/internal/usecases/request/mock/mockrequest.go b/internal/usecases/request/mockrequest/mockrequest.go
similarity index 100%
rename from internal/usecases/request/mock/mockrequest.go
rename to internal/usecases/request/mockrequest/mockrequest.go