166 lines
6.6 KiB
Go
166 lines
6.6 KiB
Go
package rabbitmqamqp
|
|
|
|
import (
|
|
"context"
|
|
"github.com/Azure/go-amqp"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
|
|
"time"
|
|
)
|
|
|
|
var _ = Describe("NewConsumer tests", func() {
|
|
|
|
It("AMQP NewConsumer should fail due to context cancellation", func() {
|
|
qName := generateNameWithDateTime("AMQP NewConsumer should fail due to context cancellation")
|
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
|
Expect(err).To(BeNil())
|
|
|
|
queue, err := connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
|
Name: qName,
|
|
})
|
|
Expect(err).To(BeNil())
|
|
Expect(queue).NotTo(BeNil())
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Millisecond)
|
|
cancel()
|
|
_, err = connection.NewConsumer(ctx, qName, nil)
|
|
Expect(err).NotTo(BeNil())
|
|
Expect(err.Error()).To(ContainSubstring("context canceled"))
|
|
Expect(connection.Management().DeleteQueue(context.Background(), qName)).To(BeNil())
|
|
Expect(connection.Close(context.Background())).To(BeNil())
|
|
})
|
|
|
|
It("AMQP NewConsumer should ack and empty the queue", func() {
|
|
qName := generateNameWithDateTime("AMQP NewConsumer should ack and empty the queue")
|
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
|
Expect(err).To(BeNil())
|
|
queue, err := connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
|
Name: qName,
|
|
})
|
|
Expect(err).To(BeNil())
|
|
Expect(queue).NotTo(BeNil())
|
|
publishMessages(qName, 10)
|
|
consumer, err := connection.NewConsumer(context.Background(), qName, nil)
|
|
Expect(err).To(BeNil())
|
|
Expect(consumer).NotTo(BeNil())
|
|
Expect(consumer).To(BeAssignableToTypeOf(&Consumer{}))
|
|
for i := 0; i < 10; i++ {
|
|
dc, err := consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dc.Message()).NotTo(BeNil())
|
|
Expect(dc.Accept(context.Background())).To(BeNil())
|
|
}
|
|
nMessages, err := connection.Management().PurgeQueue(context.Background(), qName)
|
|
Expect(err).To(BeNil())
|
|
Expect(nMessages).To(Equal(0))
|
|
Expect(consumer.Close(context.Background())).To(BeNil())
|
|
Expect(connection.Management().DeleteQueue(context.Background(), qName)).To(BeNil())
|
|
Expect(connection.Close(context.Background())).To(BeNil())
|
|
})
|
|
|
|
It("AMQP NewConsumer should requeue the message to the queue", func() {
|
|
|
|
qName := generateNameWithDateTime("AMQP NewConsumer should requeue the message to the queue")
|
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
|
Expect(err).To(BeNil())
|
|
queue, err := connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
|
Name: qName,
|
|
})
|
|
Expect(err).To(BeNil())
|
|
Expect(queue).NotTo(BeNil())
|
|
publishMessages(qName, 1)
|
|
consumer, err := connection.NewConsumer(context.Background(), qName, nil)
|
|
Expect(err).To(BeNil())
|
|
Expect(consumer).NotTo(BeNil())
|
|
Expect(consumer).To(BeAssignableToTypeOf(&Consumer{}))
|
|
dc, err := consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dc.Message()).NotTo(BeNil())
|
|
Expect(dc.Requeue(context.Background())).To(BeNil())
|
|
Expect(consumer.Close(context.Background())).To(BeNil())
|
|
Expect(err).To(BeNil())
|
|
nMessages, err := connection.Management().PurgeQueue(context.Background(), qName)
|
|
Expect(err).To(BeNil())
|
|
Expect(nMessages).To(Equal(1))
|
|
Expect(connection.Management().DeleteQueue(context.Background(), qName)).To(BeNil())
|
|
Expect(connection.Close(context.Background())).To(BeNil())
|
|
})
|
|
|
|
It("AMQP NewConsumer should requeue the message to the queue with annotations", func() {
|
|
|
|
qName := generateNameWithDateTime("AMQP NewConsumer should requeue the message to the queue with annotations")
|
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
|
Expect(err).To(BeNil())
|
|
queue, err := connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
|
Name: qName,
|
|
})
|
|
Expect(err).To(BeNil())
|
|
Expect(queue).NotTo(BeNil())
|
|
publishMessages(qName, 1)
|
|
consumer, err := connection.NewConsumer(context.Background(), qName, nil)
|
|
Expect(err).To(BeNil())
|
|
Expect(consumer).NotTo(BeNil())
|
|
Expect(consumer).To(BeAssignableToTypeOf(&Consumer{}))
|
|
dc, err := consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dc.Message()).NotTo(BeNil())
|
|
myAnnotations := amqp.Annotations{
|
|
"x-key1": "value1",
|
|
"x-key2": "value2",
|
|
}
|
|
Expect(dc.RequeueWithAnnotations(context.Background(), myAnnotations)).To(BeNil())
|
|
dcWithAnnotation, err := consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dcWithAnnotation.Message().Annotations["x-key1"]).To(Equal("value1"))
|
|
Expect(dcWithAnnotation.Message().Annotations["x-key2"]).To(Equal("value2"))
|
|
Expect(consumer.Close(context.Background())).To(BeNil())
|
|
Expect(err).To(BeNil())
|
|
nMessages, err := connection.Management().PurgeQueue(context.Background(), qName)
|
|
Expect(err).To(BeNil())
|
|
Expect(nMessages).To(Equal(1))
|
|
Expect(connection.Management().DeleteQueue(context.Background(), qName)).To(BeNil())
|
|
Expect(connection.Close(context.Background())).To(BeNil())
|
|
})
|
|
|
|
It("AMQP NewConsumer should discard the message to the queue with and without annotations", func() {
|
|
// TODO: Implement this test with a dead letter queue to test the discard feature
|
|
qName := generateNameWithDateTime("AMQP NewConsumer should discard the message to the queue with and without annotations")
|
|
connection, err := Dial(context.Background(), "amqp://", nil)
|
|
Expect(err).To(BeNil())
|
|
queue, err := connection.Management().DeclareQueue(context.Background(), &QuorumQueueSpecification{
|
|
Name: qName,
|
|
})
|
|
Expect(err).To(BeNil())
|
|
Expect(queue).NotTo(BeNil())
|
|
publishMessages(qName, 2)
|
|
consumer, err := connection.NewConsumer(context.Background(), qName, nil)
|
|
Expect(err).To(BeNil())
|
|
Expect(consumer).NotTo(BeNil())
|
|
Expect(consumer).To(BeAssignableToTypeOf(&Consumer{}))
|
|
dc, err := consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dc.Message()).NotTo(BeNil())
|
|
myAnnotations := amqp.Annotations{
|
|
"x-key1": "value1",
|
|
"x-key2": "value2",
|
|
}
|
|
Expect(dc.DiscardWithAnnotations(context.Background(), myAnnotations)).To(BeNil())
|
|
dc, err = consumer.Receive(context.Background())
|
|
Expect(err).To(BeNil())
|
|
Expect(dc.Message()).NotTo(BeNil())
|
|
Expect(dc.Discard(context.Background(), &amqp.Error{
|
|
Condition: "my error",
|
|
Description: "my error description",
|
|
Info: nil,
|
|
})).To(BeNil())
|
|
nMessages, err := connection.Management().PurgeQueue(context.Background(), qName)
|
|
Expect(err).To(BeNil())
|
|
Expect(nMessages).To(Equal(0))
|
|
Expect(consumer.Close(context.Background())).To(BeNil())
|
|
Expect(connection.Management().DeleteQueue(context.Background(), qName)).To(BeNil())
|
|
Expect(connection.Close(context.Background())).To(BeNil())
|
|
})
|
|
|
|
})
|