Merged in feature/docinit (pull request #43)
Move queue to config * movequeue * passtests
This commit is contained in:
+1
-1
@@ -3,7 +3,7 @@ with-expecter: true
|
|||||||
outpkg: "{{.PackageName}}mock"
|
outpkg: "{{.PackageName}}mock"
|
||||||
dir: "mocks/{{.PackageName}}"
|
dir: "mocks/{{.PackageName}}"
|
||||||
packages:
|
packages:
|
||||||
queryorchestration/internal/server/queue:
|
queryorchestration/internal/serviceconfig/queue:
|
||||||
interfaces:
|
interfaces:
|
||||||
SQSClient:
|
SQSClient:
|
||||||
queryorchestration/internal/server/runner:
|
queryorchestration/internal/server/runner:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"queryorchestration/internal/document"
|
"queryorchestration/internal/document"
|
||||||
documentclean "queryorchestration/internal/document/clean"
|
documentclean "queryorchestration/internal/document/clean"
|
||||||
"queryorchestration/internal/job"
|
"queryorchestration/internal/job"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
@@ -79,12 +79,13 @@ func (s *Service) informCreate(ctx context.Context, id uuid.UUID, j *job.Job) er
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err := queue.Send(ctx, &queue.Config{
|
err := s.cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
Client: s.cfg.GetQueueClient(),
|
QueueURL: s.cfg.GetDocumentCleanURL(),
|
||||||
URL: s.cfg.GetDocumentCleanURL(),
|
Body: documentclean.Create{
|
||||||
}, documentclean.Create{
|
ID: id,
|
||||||
ID: id,
|
},
|
||||||
}, map[string]types.MessageAttributeValue{})
|
Attributes: map[string]types.MessageAttributeValue{},
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package objectstorage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Get(ctx context.Context) {
|
||||||
|
}
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package queue
|
|
||||||
|
|
||||||
type Config struct {
|
|
||||||
URL string
|
|
||||||
Client SQSClient
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package queue
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Delete(ctx context.Context, config *Config, msg *types.Message) error {
|
|
||||||
_, err := config.Client.DeleteMessage(ctx, &sqs.DeleteMessageInput{
|
|
||||||
QueueUrl: aws.String(config.URL),
|
|
||||||
ReceiptHandle: msg.ReceiptHandle,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package queue
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Receive(ctx context.Context, config *Config, attributes []string) (*sqs.ReceiveMessageOutput, error) {
|
|
||||||
return config.Client.ReceiveMessage(ctx, &sqs.ReceiveMessageInput{
|
|
||||||
QueueUrl: &config.URL,
|
|
||||||
MaxNumberOfMessages: 1,
|
|
||||||
WaitTimeSeconds: 2,
|
|
||||||
VisibilityTimeout: 2,
|
|
||||||
MessageAttributeNames: attributes,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package queue
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Send(ctx context.Context, config *Config, body interface{}, attributes map[string]types.MessageAttributeValue) error {
|
|
||||||
jsonBytes, err := json.Marshal(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
strBody := string(jsonBytes)
|
|
||||||
|
|
||||||
_, err = config.Client.SendMessage(ctx, &sqs.SendMessageInput{
|
|
||||||
MessageAttributes: attributes,
|
|
||||||
QueueUrl: aws.String(config.URL),
|
|
||||||
MessageBody: aws.String(strBody),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -73,9 +73,7 @@ func New(ctx context.Context, cfg ListenerConfig) (*Server, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &Server{
|
return &Server{
|
||||||
controller: cfg.GetController(),
|
cfg: cfg,
|
||||||
queueURL: cfg.GetQueueURL(),
|
cleanup: cleanup,
|
||||||
client: cfg.GetQueueClient(),
|
|
||||||
cleanup: cleanup,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,12 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
controller Controller
|
cleanup func() error
|
||||||
queueURL string
|
cfg ListenerConfig
|
||||||
client queue.SQSClient
|
|
||||||
cleanup func() error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Server) Listen(ctx context.Context) {
|
func (c *Server) Listen(ctx context.Context) {
|
||||||
@@ -63,11 +61,9 @@ func (c *Server) Listen(ctx context.Context) {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
func (c *Server) pollMessage(ctx context.Context) error {
|
func (c *Server) pollMessage(ctx context.Context) error {
|
||||||
cfg := &queue.Config{
|
result, err := c.cfg.ReceiveFromQueue(ctx, &queue.ReceiveParams{
|
||||||
URL: c.queueURL,
|
QueueURL: c.cfg.GetQueueURL(),
|
||||||
Client: c.client,
|
})
|
||||||
}
|
|
||||||
result, err := queue.Receive(ctx, cfg, []string{})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("message fetch fail: %v", err)
|
return fmt.Errorf("message fetch fail: %v", err)
|
||||||
}
|
}
|
||||||
@@ -78,12 +74,15 @@ func (c *Server) pollMessage(ctx context.Context) error {
|
|||||||
// simple case.
|
// simple case.
|
||||||
// if process takes too long to complete then we need to use a thread pool.
|
// if process takes too long to complete then we need to use a thread pool.
|
||||||
go func() {
|
go func() {
|
||||||
err := c.controller.Process(ctx, &message)
|
err := c.cfg.GetController().Process(ctx, &message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("message process fail", "err", err)
|
slog.Error("message process fail", "err", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = queue.Delete(ctx, cfg, &message)
|
err = c.cfg.DeleteFromQueue(ctx, &queue.DeleteParams{
|
||||||
|
QueueURL: c.cfg.GetQueueURL(),
|
||||||
|
ReceiptHandle: message.ReceiptHandle,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("message delete fail", "err", err)
|
slog.Error("message delete fail", "err", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package runner
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/server/queue"
|
|
||||||
queuemock "queryorchestration/mocks/queue"
|
queuemock "queryorchestration/mocks/queue"
|
||||||
runnermock "queryorchestration/mocks/runner"
|
runnermock "queryorchestration/mocks/runner"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -17,12 +16,13 @@ import (
|
|||||||
func TestPollMessages(t *testing.T) {
|
func TestPollMessages(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
controller := runnermock.NewMockController(t)
|
|
||||||
mockSQS := queuemock.NewMockSQSClient(t)
|
mockSQS := queuemock.NewMockSQSClient(t)
|
||||||
cfg := &queue.Config{
|
cfg := &BaseConfig{}
|
||||||
URL: "/i/am/here",
|
cfg.QueueClient = mockSQS
|
||||||
Client: mockSQS,
|
cfg.ControllerFunc = func() Controller {
|
||||||
|
return runnermock.NewMockController(t)
|
||||||
}
|
}
|
||||||
|
cfg.QueueURL = "/i/am/here"
|
||||||
|
|
||||||
res := sqs.ReceiveMessageOutput{Messages: []types.Message{}}
|
res := sqs.ReceiveMessageOutput{Messages: []types.Message{}}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ func TestPollMessages(t *testing.T) {
|
|||||||
ReceiveMessage(
|
ReceiveMessage(
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
||||||
return *in.QueueUrl == cfg.URL
|
return *in.QueueUrl == cfg.QueueURL
|
||||||
}),
|
}),
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
).
|
).
|
||||||
@@ -40,10 +40,8 @@ func TestPollMessages(t *testing.T) {
|
|||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
scfg := &Server{
|
scfg := &Server{
|
||||||
controller: controller,
|
cfg: cfg,
|
||||||
queueURL: cfg.URL,
|
cleanup: func() error { return nil },
|
||||||
client: cfg.Client,
|
|
||||||
cleanup: func() error { return nil },
|
|
||||||
}
|
}
|
||||||
scfg.Listen(ctx)
|
scfg.Listen(ctx)
|
||||||
}
|
}
|
||||||
@@ -51,26 +49,29 @@ func TestPollMessages(t *testing.T) {
|
|||||||
func TestPollMessage(t *testing.T) {
|
func TestPollMessage(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
controller := runnermock.NewMockController(t)
|
|
||||||
mockSQS := queuemock.NewMockSQSClient(t)
|
mockSQS := queuemock.NewMockSQSClient(t)
|
||||||
|
cfg := &BaseConfig{}
|
||||||
|
cfg.QueueClient = mockSQS
|
||||||
|
cfg.ControllerFunc = func() Controller {
|
||||||
|
return runnermock.NewMockController(t)
|
||||||
|
}
|
||||||
|
cfg.QueueURL = "/i/am/here"
|
||||||
|
|
||||||
cfg := &Server{
|
ser := &Server{
|
||||||
controller: controller,
|
cfg: cfg,
|
||||||
queueURL: "/i/am/here",
|
cleanup: func() error { return nil },
|
||||||
client: mockSQS,
|
|
||||||
cleanup: func() error { return nil },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mockSQS.EXPECT().
|
mockSQS.EXPECT().
|
||||||
ReceiveMessage(
|
ReceiveMessage(
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
||||||
return *in.QueueUrl == cfg.queueURL
|
return *in.QueueUrl == cfg.QueueURL
|
||||||
}),
|
}),
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
).
|
).
|
||||||
Return(&sqs.ReceiveMessageOutput{}, nil)
|
Return(&sqs.ReceiveMessageOutput{}, nil)
|
||||||
|
|
||||||
err := cfg.pollMessage(ctx)
|
err := ser.pollMessage(ctx)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package queue
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"queryorchestration/internal/server/queue"
|
|
||||||
"queryorchestration/internal/serviceconfig/aws"
|
"queryorchestration/internal/serviceconfig/aws"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/config"
|
"github.com/aws/aws-sdk-go-v2/config"
|
||||||
@@ -15,17 +14,20 @@ type QueueConfig struct {
|
|||||||
aws.AWSConfig
|
aws.AWSConfig
|
||||||
EnableOtel bool `env:"ENABLE_OTEL" envDefault:"false"`
|
EnableOtel bool `env:"ENABLE_OTEL" envDefault:"false"`
|
||||||
AWSEndpointUrlSQS string `env:"AWS_ENDPOINT_URL_SQS"`
|
AWSEndpointUrlSQS string `env:"AWS_ENDPOINT_URL_SQS"`
|
||||||
QueueClient queue.SQSClient
|
QueueClient SQSClient
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigProvider interface {
|
type ConfigProvider interface {
|
||||||
aws.ConfigProvider
|
aws.ConfigProvider
|
||||||
SetQueueClient(context.Context) error
|
SetQueueClient(context.Context) error
|
||||||
GetQueueClient() queue.SQSClient
|
GetQueueClient() SQSClient
|
||||||
PingQueueByURL(context.Context, string) error
|
PingQueueByURL(context.Context, string) error
|
||||||
|
SendToQueue(context.Context, *SendParams) error
|
||||||
|
ReceiveFromQueue(context.Context, *ReceiveParams) (*sqs.ReceiveMessageOutput, error)
|
||||||
|
DeleteFromQueue(context.Context, *DeleteParams) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QueueConfig) GetQueueClient() queue.SQSClient {
|
func (c *QueueConfig) GetQueueClient() SQSClient {
|
||||||
return c.QueueClient
|
return c.QueueClient
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package queue
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteParams struct {
|
||||||
|
QueueURL string
|
||||||
|
ReceiptHandle *string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QueueConfig) DeleteFromQueue(ctx context.Context, params *DeleteParams) error {
|
||||||
|
_, err := c.QueueClient.DeleteMessage(ctx, &sqs.DeleteMessageInput{
|
||||||
|
QueueUrl: aws.String(params.QueueURL),
|
||||||
|
ReceiptHandle: params.ReceiptHandle,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -2,12 +2,11 @@ package queue_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
queuemock "queryorchestration/mocks/queue"
|
queuemock "queryorchestration/mocks/queue"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
@@ -15,26 +14,24 @@ import (
|
|||||||
func TestDelete(t *testing.T) {
|
func TestDelete(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
mockSQS := queuemock.NewMockSQSClient(t)
|
mockSQS := queuemock.NewMockSQSClient(t)
|
||||||
cfg := &queue.Config{
|
cfg := queue.QueueConfig{}
|
||||||
URL: "/i/am/here",
|
cfg.QueueClient = mockSQS
|
||||||
Client: mockSQS,
|
|
||||||
}
|
|
||||||
handle := "iamahandler"
|
handle := "iamahandler"
|
||||||
|
params := &queue.DeleteParams{
|
||||||
|
ReceiptHandle: &handle,
|
||||||
|
QueueURL: "/i/am/here",
|
||||||
|
}
|
||||||
|
|
||||||
mockSQS.EXPECT().
|
mockSQS.EXPECT().
|
||||||
DeleteMessage(
|
DeleteMessage(
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(in *sqs.DeleteMessageInput) bool {
|
mock.MatchedBy(func(in *sqs.DeleteMessageInput) bool {
|
||||||
return *in.QueueUrl == cfg.URL && *in.ReceiptHandle == handle
|
return *in.QueueUrl == params.QueueURL && *in.ReceiptHandle == handle
|
||||||
}),
|
}),
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
).
|
).
|
||||||
Return(&sqs.DeleteMessageOutput{}, nil)
|
Return(&sqs.DeleteMessageOutput{}, nil)
|
||||||
|
|
||||||
message := &types.Message{
|
err := cfg.DeleteFromQueue(ctx, params)
|
||||||
ReceiptHandle: &handle,
|
|
||||||
}
|
|
||||||
|
|
||||||
err := queue.Delete(ctx, cfg, message)
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package queue
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ReceiveParams struct {
|
||||||
|
QueueURL string
|
||||||
|
Attributes []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QueueConfig) ReceiveFromQueue(ctx context.Context, params *ReceiveParams) (*sqs.ReceiveMessageOutput, error) {
|
||||||
|
return c.QueueClient.ReceiveMessage(ctx, &sqs.ReceiveMessageInput{
|
||||||
|
QueueUrl: ¶ms.QueueURL,
|
||||||
|
MaxNumberOfMessages: 1,
|
||||||
|
WaitTimeSeconds: 2,
|
||||||
|
VisibilityTimeout: 2,
|
||||||
|
MessageAttributeNames: params.Attributes,
|
||||||
|
})
|
||||||
|
}
|
||||||
+7
-6
@@ -2,7 +2,7 @@ package queue_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
queuemock "queryorchestration/mocks/queue"
|
queuemock "queryorchestration/mocks/queue"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -15,9 +15,10 @@ import (
|
|||||||
func TestReceive(t *testing.T) {
|
func TestReceive(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
mockSQS := queuemock.NewMockSQSClient(t)
|
mockSQS := queuemock.NewMockSQSClient(t)
|
||||||
cfg := &queue.Config{
|
cfg := queue.QueueConfig{}
|
||||||
URL: "/i/am/here",
|
cfg.QueueClient = mockSQS
|
||||||
Client: mockSQS,
|
params := &queue.ReceiveParams{
|
||||||
|
QueueURL: "/i/am/here",
|
||||||
}
|
}
|
||||||
|
|
||||||
res := sqs.ReceiveMessageOutput{Messages: []types.Message{}}
|
res := sqs.ReceiveMessageOutput{Messages: []types.Message{}}
|
||||||
@@ -26,13 +27,13 @@ func TestReceive(t *testing.T) {
|
|||||||
ReceiveMessage(
|
ReceiveMessage(
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
mock.MatchedBy(func(in *sqs.ReceiveMessageInput) bool {
|
||||||
return *in.QueueUrl == cfg.URL
|
return *in.QueueUrl == params.QueueURL
|
||||||
}),
|
}),
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
).
|
).
|
||||||
Return(&res, nil)
|
Return(&res, nil)
|
||||||
|
|
||||||
ares, err := queue.Receive(ctx, cfg, []string{})
|
ares, err := cfg.ReceiveFromQueue(ctx, params)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualExportedValues(t, res, *ares)
|
assert.EqualExportedValues(t, res, *ares)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package queue
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SendParams struct {
|
||||||
|
QueueURL string
|
||||||
|
Body interface{}
|
||||||
|
Attributes map[string]types.MessageAttributeValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QueueConfig) SendToQueue(ctx context.Context, params *SendParams) error {
|
||||||
|
jsonBytes, err := json.Marshal(params.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
strBody := string(jsonBytes)
|
||||||
|
|
||||||
|
_, err = c.QueueClient.SendMessage(ctx, &sqs.SendMessageInput{
|
||||||
|
MessageAttributes: params.Attributes,
|
||||||
|
QueueUrl: aws.String(params.QueueURL),
|
||||||
|
MessageBody: aws.String(strBody),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -2,12 +2,11 @@ package queue_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
queuemock "queryorchestration/mocks/queue"
|
queuemock "queryorchestration/mocks/queue"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
@@ -15,24 +14,23 @@ import (
|
|||||||
func TestSend(t *testing.T) {
|
func TestSend(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
mockSQS := queuemock.NewMockSQSClient(t)
|
mockSQS := queuemock.NewMockSQSClient(t)
|
||||||
cfg := &queue.Config{
|
cfg := queue.QueueConfig{}
|
||||||
URL: "/i/am/here",
|
cfg.QueueClient = mockSQS
|
||||||
Client: mockSQS,
|
params := &queue.SendParams{
|
||||||
|
QueueURL: "/i/am/here",
|
||||||
|
Body: struct{}{},
|
||||||
}
|
}
|
||||||
|
|
||||||
mockSQS.EXPECT().
|
mockSQS.EXPECT().
|
||||||
SendMessage(
|
SendMessage(
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
mock.MatchedBy(func(in *sqs.SendMessageInput) bool {
|
mock.MatchedBy(func(in *sqs.SendMessageInput) bool {
|
||||||
return *in.QueueUrl == cfg.URL && *in.MessageBody == "{}"
|
return *in.QueueUrl == params.QueueURL && *in.MessageBody == "{}"
|
||||||
}),
|
}),
|
||||||
mock.Anything,
|
mock.Anything,
|
||||||
).
|
).
|
||||||
Return(&sqs.SendMessageOutput{}, nil)
|
Return(&sqs.SendMessageOutput{}, nil)
|
||||||
|
|
||||||
body := struct{}{}
|
err := cfg.SendToQueue(ctx, params)
|
||||||
attrs := map[string]types.MessageAttributeValue{}
|
|
||||||
|
|
||||||
err := queue.Send(ctx, cfg, body, attrs)
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
+12
-7
@@ -3,8 +3,8 @@ package test
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"queryorchestration/internal/server/queue"
|
|
||||||
"queryorchestration/internal/serviceconfig"
|
"queryorchestration/internal/serviceconfig"
|
||||||
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -131,10 +131,10 @@ func CreateQueue(t *testing.T, ctx context.Context, cfg *serviceconfig.BaseConfi
|
|||||||
return *queueM.QueueUrl
|
return *queueM.QueueUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertMessageWait(t *testing.T, ctx context.Context, cfg *queue.Config, attrs []string) types.Message {
|
func AssertMessageWait(t *testing.T, ctx context.Context, cfg serviceconfig.ConfigProvider, params *queue.ReceiveParams) types.Message {
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
result, err := queue.Receive(ctx, cfg, attrs)
|
result, err := cfg.ReceiveFromQueue(ctx, params)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, result.Messages)
|
assert.NotNil(t, result.Messages)
|
||||||
assert.Len(t, result.Messages, 1)
|
assert.Len(t, result.Messages, 1)
|
||||||
@@ -143,14 +143,19 @@ func AssertMessageWait(t *testing.T, ctx context.Context, cfg *queue.Config, att
|
|||||||
return result.Messages[0]
|
return result.Messages[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertMessageBodyWait(t *testing.T, ctx context.Context, cfg *queue.Config, body string) {
|
func AssertMessageBodyWait(t *testing.T, ctx context.Context, cfg serviceconfig.ConfigProvider, url string, body string) {
|
||||||
message := AssertMessageWait(t, ctx, cfg, []string{})
|
message := AssertMessageWait(t, ctx, cfg, &queue.ReceiveParams{
|
||||||
|
QueueURL: url,
|
||||||
|
})
|
||||||
|
|
||||||
assert.Equal(t, body, *message.Body)
|
assert.Equal(t, body, *message.Body)
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertMessageAttrWait(t *testing.T, ctx context.Context, cfg *queue.Config, name string, value string) {
|
func AssertMessageAttrWait(t *testing.T, ctx context.Context, cfg serviceconfig.ConfigProvider, url string, name string, value string) {
|
||||||
message := AssertMessageWait(t, ctx, cfg, []string{name})
|
message := AssertMessageWait(t, ctx, cfg, &queue.ReceiveParams{
|
||||||
|
QueueURL: url,
|
||||||
|
Attributes: []string{name},
|
||||||
|
})
|
||||||
|
|
||||||
assert.NotNil(t, message.MessageAttributes[name])
|
assert.NotNil(t, message.MessageAttributes[name])
|
||||||
assert.Equal(t, value, *(message.MessageAttributes[name]).StringValue)
|
assert.Equal(t, value, *(message.MessageAttributes[name]).StringValue)
|
||||||
|
|||||||
+22
-25
@@ -2,7 +2,7 @@ package test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
@@ -73,15 +73,15 @@ func TestAssertMessageWait(t *testing.T) {
|
|||||||
defer cleanup()
|
defer cleanup()
|
||||||
url := CreateQueue(t, ctx, cfg, "myname")
|
url := CreateQueue(t, ctx, cfg, "myname")
|
||||||
|
|
||||||
qucfg := &queue.Config{
|
err := cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
URL: url,
|
QueueURL: url,
|
||||||
Client: cfg.QueueClient,
|
Body: "body",
|
||||||
}
|
})
|
||||||
|
|
||||||
err := queue.Send(ctx, qucfg, "body", map[string]types.MessageAttributeValue{})
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
msg := AssertMessageWait(t, ctx, qucfg, []string{})
|
msg := AssertMessageWait(t, ctx, cfg, &queue.ReceiveParams{
|
||||||
|
QueueURL: url,
|
||||||
|
})
|
||||||
assert.NotNil(t, msg)
|
assert.NotNil(t, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,15 +99,13 @@ func TestAssertMessageBodyWait(t *testing.T) {
|
|||||||
defer cleanup()
|
defer cleanup()
|
||||||
url := CreateQueue(t, ctx, cfg, "myname")
|
url := CreateQueue(t, ctx, cfg, "myname")
|
||||||
|
|
||||||
qucfg := &queue.Config{
|
err := cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
URL: url,
|
QueueURL: url,
|
||||||
Client: cfg.QueueClient,
|
Body: "body",
|
||||||
}
|
})
|
||||||
|
|
||||||
err := queue.Send(ctx, qucfg, "body", map[string]types.MessageAttributeValue{})
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
AssertMessageBodyWait(t, ctx, qucfg, "\"body\"")
|
AssertMessageBodyWait(t, ctx, cfg, url, "\"body\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAssertMessageAttrWait(t *testing.T) {
|
func TestAssertMessageAttrWait(t *testing.T) {
|
||||||
@@ -124,21 +122,20 @@ func TestAssertMessageAttrWait(t *testing.T) {
|
|||||||
defer cleanup()
|
defer cleanup()
|
||||||
url := CreateQueue(t, ctx, cfg, "myname")
|
url := CreateQueue(t, ctx, cfg, "myname")
|
||||||
|
|
||||||
qucfg := &queue.Config{
|
|
||||||
URL: url,
|
|
||||||
Client: cfg.QueueClient,
|
|
||||||
}
|
|
||||||
|
|
||||||
name := "name"
|
name := "name"
|
||||||
value := "value"
|
value := "value"
|
||||||
|
|
||||||
err := queue.Send(ctx, qucfg, "body", map[string]types.MessageAttributeValue{
|
err := cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
name: {
|
QueueURL: url,
|
||||||
DataType: aws.String("String"),
|
Body: "body",
|
||||||
StringValue: aws.String(value),
|
Attributes: map[string]types.MessageAttributeValue{
|
||||||
|
name: {
|
||||||
|
DataType: aws.String("String"),
|
||||||
|
StringValue: aws.String(value),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
AssertMessageAttrWait(t, ctx, qucfg, name, value)
|
AssertMessageAttrWait(t, ctx, cfg, url, name, value)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,11 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
documentinit "queryorchestration/internal/document/init"
|
documentinit "queryorchestration/internal/document/init"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
"queryorchestration/internal/test"
|
"queryorchestration/internal/test"
|
||||||
queryservice "queryorchestration/pkg/queryService"
|
queryservice "queryorchestration/pkg/queryService"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -76,16 +75,13 @@ func TestDocInitRunner(t *testing.T) {
|
|||||||
Location: "/I/am/here", // TODO
|
Location: "/I/am/here", // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
qcfg := &queue.Config{
|
err = cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
URL: net.Runners[test.DocInitRunner].URI,
|
QueueURL: net.Runners[test.DocInitRunner].URI,
|
||||||
Client: cfg.QueueClient,
|
Body: document,
|
||||||
}
|
})
|
||||||
|
|
||||||
err = queue.Send(ctx, qcfg, document, map[string]types.MessageAttributeValue{})
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
_ = test.AssertMessageWait(t, ctx, &queue.Config{
|
_ = test.AssertMessageWait(t, ctx, cfg, &queue.ReceiveParams{
|
||||||
URL: doccleanurl,
|
QueueURL: doccleanurl,
|
||||||
Client: cfg.GetQueueClient(),
|
})
|
||||||
}, []string{})
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,10 @@ package integration_test
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"queryorchestration/internal/query"
|
"queryorchestration/internal/query"
|
||||||
"queryorchestration/internal/server/queue"
|
"queryorchestration/internal/serviceconfig/queue"
|
||||||
"queryorchestration/internal/test"
|
"queryorchestration/internal/test"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
@@ -29,12 +28,11 @@ func TestQueryRunner(t *testing.T) {
|
|||||||
CleanVersion: int32(1),
|
CleanVersion: int32(1),
|
||||||
TextVersion: int32(1),
|
TextVersion: int32(1),
|
||||||
}
|
}
|
||||||
qcfg := &queue.Config{
|
|
||||||
URL: c.URI,
|
|
||||||
Client: cfg.QueueClient,
|
|
||||||
}
|
|
||||||
|
|
||||||
err := queue.Send(ctx, qcfg, document, map[string]types.MessageAttributeValue{})
|
err := cfg.SendToQueue(ctx, &queue.SendParams{
|
||||||
|
QueueURL: c.URI,
|
||||||
|
Body: document,
|
||||||
|
})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
// TODO - check document output
|
// TODO - check document output
|
||||||
|
|||||||
Reference in New Issue
Block a user