package produce

import (
	"query-service/internal/adapters/brokeradapter"
	mockbrokerdriver "query-service/internal/drivers/brokerdriver/mock"
	mockkeyvaluedriver "query-service/internal/drivers/keyvaluedriver/mock"
	"testing"

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

// Make sure a correct message gets published
func TestPublishCorrectMessage(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 service and start it
	service := NewService(mockBroker, keyValueStore)
	service.Start()

	// 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

	// Assert that there have not been any messages sent yet
	assert.Empty(t, mockBroker.Messages)

	// Publish the message
	mockMessage := []byte("Test message")
	service.PublishMessage(&mockMessage, &mockSession)

	// Assert that there is now 1 message
	assert.Len(t, mockBroker.Messages[mockQueue], 1)

	// Assert that this message contains the mockMessage
	assert.Equal(t, mockBroker.Messages[mockQueue][0].Body, mockMessage)
}

// Test publishing message without setting routing in key value store
func TestPublishMessageNoRouting(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 service and start it
	service := NewService(mockBroker, keyValueStore)
	service.Start()

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

	// Create headers containing a sessionID
	headers := make(map[string]interface{})
	headers["sessionID"] = mockSession

	// Assert that there have not been any messages sent yet
	assert.Empty(t, mockBroker.Messages)

	// Publish the message
	mockMessage := []byte("Test message")
	service.PublishMessage(&mockMessage, &mockSession)

	// Assert that there are still 0 messages
	assert.Empty(t, mockBroker.Messages)
}