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