@@ -10,26 +10,31 @@ import (
10
10
"github.com/aws/aws-sdk-go/aws"
11
11
"github.com/aws/aws-sdk-go/service/sqs"
12
12
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
13
+ "github.com/stretchr/testify/assert"
13
14
"github.com/stretchr/testify/mock"
14
15
)
15
16
16
17
type mockedSqsClient struct {
17
18
Config * aws.Config
18
19
Response sqs.ReceiveMessageOutput
19
20
sqsiface.SQSAPI
21
+ mock.Mock
20
22
}
21
23
22
24
func (c * mockedSqsClient ) GetQueueUrl (urlInput * sqs.GetQueueUrlInput ) (* sqs.GetQueueUrlOutput , error ) {
23
- url := fmt .Sprintf ("https://sqs.%v.amazonaws.com/123456789/%v" , c .Config .Region , urlInput .QueueName )
25
+ url := fmt .Sprintf ("https://sqs.%v.amazonaws.com/123456789/%v" , * c .Config .Region , * urlInput .QueueName )
24
26
25
27
return & sqs.GetQueueUrlOutput {QueueUrl : & url }, nil
26
28
}
27
29
28
- func (c * mockedSqsClient ) ReceiveMessage (* sqs.ReceiveMessageInput ) (* sqs.ReceiveMessageOutput , error ) {
30
+ func (c * mockedSqsClient ) ReceiveMessage (input * sqs.ReceiveMessageInput ) (* sqs.ReceiveMessageOutput , error ) {
31
+ c .Called (input )
32
+
29
33
return & c .Response , nil
30
34
}
31
35
32
- func (c * mockedSqsClient ) DeleteMessage (* sqs.DeleteMessageInput ) (* sqs.DeleteMessageOutput , error ) {
36
+ func (c * mockedSqsClient ) DeleteMessage (input * sqs.DeleteMessageInput ) (* sqs.DeleteMessageOutput , error ) {
37
+ c .Called (input )
33
38
c .Response = sqs.ReceiveMessageOutput {}
34
39
35
40
return & sqs.DeleteMessageOutput {}, nil
@@ -39,15 +44,15 @@ type mockedHandler struct {
39
44
mock.Mock
40
45
}
41
46
47
+ func (mh * mockedHandler ) HandleMessage (foo string , qux string ) {
48
+ mh .Called (foo , qux )
49
+ }
50
+
42
51
type sqsEvent struct {
43
52
Foo string `json:"foo"`
44
53
Qux string `json:"qux"`
45
54
}
46
55
47
- func (mh * mockedHandler ) HandleMessage (foo string , qux string ) {
48
- mh .Called (foo , qux )
49
- }
50
-
51
56
func TestStart (t * testing.T ) {
52
57
region := "eu-west-1"
53
58
awsConfig := & aws.Config {Region : & region }
@@ -69,10 +74,19 @@ func TestStart(t *testing.T) {
69
74
return
70
75
})
71
76
72
- t .Run ("when worker successfully receives a message" , func (t * testing.T ) {
77
+ t .Run ("the worker has correct configuration" , func (t * testing.T ) {
78
+ assert .Equal (t , worker .Config .QueueName , "my-sqs-queue" , "QueueName has been set properly" )
79
+ assert .Equal (t , worker .Config .QueueURL , "https://sqs.eu-west-1.amazonaws.com/123456789/my-sqs-queue" , "QueueURL has been set properly" )
80
+ assert .Equal (t , worker .Config .MaxNumberOfMessage , int64 (10 ), "MaxNumberOfMessage has been set properly" )
81
+ assert .Equal (t , worker .Config .WaitTimeSecond , int64 (20 ), "WaitTimeSecond has been set properly" )
82
+ })
83
+
84
+ t .Run ("the worker successfully processes a message" , func (t * testing.T ) {
85
+ setupClientSpies (client )
73
86
handler .On ("HandleMessage" , "bar" , "baz" ).Return ().Once ()
74
87
worker .Start (ctx , handlerFunc )
75
88
89
+ client .AssertExpectations (t )
76
90
handler .AssertExpectations (t )
77
91
})
78
92
}
@@ -83,11 +97,29 @@ func contextAndCancel() (context.Context, context.CancelFunc) {
83
97
return context .WithDeadline (context .Background (), delay )
84
98
}
85
99
86
- func setupMockedSqsClient (awsConfig * aws.Config ) sqsiface. SQSAPI {
100
+ func setupMockedSqsClient (awsConfig * aws.Config ) * mockedSqsClient {
87
101
sqsMessage := & sqs.Message {Body : aws .String (`{ "foo": "bar", "qux": "baz" }` )}
88
102
sqsResponse := sqs.ReceiveMessageOutput {
89
103
Messages : []* sqs.Message {sqsMessage },
90
104
}
91
105
92
106
return & mockedSqsClient {Response : sqsResponse , Config : awsConfig }
93
107
}
108
+
109
+ func setupClientSpies (client * mockedSqsClient ) {
110
+ url := aws .String ("https://sqs.eu-west-1.amazonaws.com/123456789/my-sqs-queue" )
111
+ receiveInput := & sqs.ReceiveMessageInput {
112
+ QueueUrl : url ,
113
+ MaxNumberOfMessages : aws .Int64 (10 ),
114
+ AttributeNames : []* string {
115
+ aws .String ("All" ),
116
+ },
117
+ WaitTimeSeconds : aws .Int64 (10 ),
118
+ }
119
+ client .On ("ReceiveMessage" , receiveInput ).Return ()
120
+
121
+ deleteInput := & sqs.DeleteMessageInput {
122
+ QueueUrl : url ,
123
+ }
124
+ client .On ("DeleteMessage" , deleteInput ).Return ()
125
+ }
0 commit comments