Skip to content
Snippets Groups Projects
consume_test.go 7.64 KiB
package consume

import (
	"encoding/json"
	"query-service/internal/adapters/brokeradapter"
	mockbrokerdriver "query-service/internal/drivers/brokerdriver/mock"
	mockkeyvaluedriver "query-service/internal/drivers/keyvaluedriver/mock"
	mockconvertquery "query-service/internal/usecases/convertquery/mock"
	"query-service/internal/usecases/produce"
	mockrequest "query-service/internal/usecases/request/mock"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestStart(t *testing.T) {
	// // Create broker adapter
	// brokerAdapter := brokeradapter.CreateGateway()
	// // Create a mock broker
	// mockBroker := mockbrokerdriver.CreateBroker(brokerAdapter)
	// // Create mock key value store
	// keyValueStore := mockkeyvaluedriver.CreateKeyValueStore()
	// // Create new producer service
	// producerService := produce.NewService(mockBroker, keyValueStore)
	// // Create new convert query service
	// convertQueryService := convertquery.NewService()
	// // Create new request sender service
	// requestSenderService := request.NewService()
	// // Create new service
	// service := NewService(mockBroker, producerService, convertQueryService, requestSenderService)
}

func TestHandleCorrectMessage(t *testing.T) {
	// Create broker adapter
	brokerAdapter := brokeradapter.CreateGateway()
	// Create a mock broker
	mockBroker := mockbrokerdriver.CreateBroker(brokerAdapter)
	// Create mock key value store
	keyValueStore := mockkeyvaluedriver.CreateKeyValueStore()
	// Create new producer service
	producerService := produce.NewService(mockBroker, keyValueStore)
	producerService.Start()
	// Create new convert query service
	convertQueryService := mockconvertquery.NewService()
	// Create new request sender service
	requestSenderService := mockrequest.NewService()
	// Create new service
	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService)

	// Create mock session and mock queue
	mockSession := "mock-session"
	mockQueue := "mock-queue"

	// Set the test-session sessionID queue to mock-queue in key value store
	keyValueStore.Set(&mockSession, &mockQueue)

	// Create headers containing a sessionID
	headers := make(map[string]interface{})
	headers["sessionID"] = mockSession
	mockMessage := brokeradapter.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.Empty(t, resultMessage["values"])
}

// Unit test message received with no session ID
func TestHandleMessageNoSessionID(t *testing.T) {
	// Create broker adapter
	brokerAdapter := brokeradapter.CreateGateway()
	// Create a mock broker
	mockBroker := mockbrokerdriver.CreateBroker(brokerAdapter)
	// Create mock key value store
	keyValueStore := mockkeyvaluedriver.CreateKeyValueStore()
	// Create new producer service
	producerService := produce.NewService(mockBroker, keyValueStore)
	// Create new convert query service
	convertQueryService := mockconvertquery.NewService()
	// Create new request sender service
	requestSenderService := mockrequest.NewService()
	// Create new service
	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService)

	// Create headers containing a sessionID
	headers := make(map[string]interface{})
	mockMessage := brokeradapter.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)
}

// Unit test receival of message and not being able to parse it
func TestFailToConvertQuery(t *testing.T) {
	// Create broker adapter
	brokerAdapter := brokeradapter.CreateGateway()
	// Create a mock broker
	mockBroker := mockbrokerdriver.CreateBroker(brokerAdapter)
	// Create mock key value store
	keyValueStore := mockkeyvaluedriver.CreateKeyValueStore()
	// Create new producer service
	producerService := produce.NewService(mockBroker, keyValueStore)
	producerService.Start()
	// Create new convert query service
	convertQueryService := mockconvertquery.NewService()
	// Create new request sender service
	requestSenderService := mockrequest.NewService()
	// Create new service
	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService)

	// Create mock session and mock queue
	mockSession := "mock-session"
	mockQueue := "mock-queue"

	// Set the test-session sessionID queue to mock-queue in key value store
	keyValueStore.Set(&mockSession, &mockQueue)

	// Create headers containing a sessionID
	headers := make(map[string]interface{})
	headers["sessionID"] = mockSession
	mockMessage := brokeradapter.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"])
}

// Test AQL querying error handling
func TestArangoError(t *testing.T) {
	// Create broker adapter
	brokerAdapter := brokeradapter.CreateGateway()
	// Create a mock broker
	mockBroker := mockbrokerdriver.CreateBroker(brokerAdapter)
	// Create mock key value store
	keyValueStore := mockkeyvaluedriver.CreateKeyValueStore()
	// Create new producer service
	producerService := produce.NewService(mockBroker, keyValueStore)
	producerService.Start()
	// Create new convert query service
	convertQueryService := mockconvertquery.NewService()
	// Create new request sender service
	requestSenderService := mockrequest.NewService()
	// Create new service
	service := NewService(mockBroker, producerService, convertQueryService, requestSenderService)

	// Create mock session and mock queue
	mockSession := "mock-session"
	mockQueue := "mock-queue"

	// Set the test-session sessionID queue to mock-queue in key value store
	keyValueStore.Set(&mockSession, &mockQueue)

	// Create headers containing a sessionID
	headers := make(map[string]interface{})
	headers["sessionID"] = mockSession
	mockMessage := brokeradapter.Message{
		Headers: headers,
		Body:    []byte("test message"),
	}

	// 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"])
}