github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/test/docker/rabbitmq/rabbitmq.dockertest.go (about)

     1  package rabbitmq
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/ory/dockertest"
     8  	"github.com/sirupsen/logrus"
     9  	// "github.com/streadway/amqp"
    10  	amqp "github.com/rabbitmq/amqp091-go"
    11  )
    12  
    13  var resource *dockertest.Resource
    14  
    15  func GenerateInstance(pool *dockertest.Pool) *dockertest.Resource {
    16  	var err error
    17  
    18  	// Set up options for RabbitMQ container
    19  	options := &dockertest.RunOptions{
    20  		Repository: "rabbitmq",
    21  		Tag:        "3-management",
    22  		Env: []string{
    23  			"RABBITMQ_DEFAULT_USER=user",
    24  			"RABBITMQ_DEFAULT_PASS=password",
    25  		},
    26  	}
    27  
    28  	// Run RabbitMQ container
    29  	resource, err = pool.RunWithOptions(options)
    30  	if err != nil {
    31  		logrus.Fatalf("Could not start RabbitMQ container: %s", err)
    32  	}
    33  
    34  	time.Sleep(10 * time.Second)
    35  
    36  	// Wait for RabbitMQ to be ready
    37  	// if err := pool.Retry(func() error {
    38  	// 	conn, err := amqp.Dial(fmt.Sprintf(
    39  	// 		"amqp://user:password@%s:%s/",
    40  	// 		resource.GetBoundIP("5672/tcp"),
    41  	// 		resource.GetPort("5672/tcp"),
    42  	// 	))
    43  	// 	if err != nil {
    44  	// 		return err
    45  	// 	}
    46  	// 	defer conn.Close()
    47  	// 	return nil
    48  	// }); err != nil {
    49  	// 	logrus.Fatalf("Could not connect to RabbitMQ: %s", err)
    50  	// }
    51  	if err := pool.Retry(func() error {
    52  		conn, err := amqp.Dial(fmt.Sprintf(
    53  			"amqp://user:password@%s:%s/",
    54  			host,
    55  			port,
    56  		))
    57  		if err != nil {
    58  			return err
    59  		}
    60  		defer conn.Close()
    61  		return nil
    62  	}); err != nil {
    63  		logrus.Fatalf("Could not connect to RabbitMQ: %s", err)
    64  	}
    65  
    66  	// At this point, RabbitMQ should be running and ready to use.
    67  
    68  	// You can use the streadway/amqp library to interact with RabbitMQ.
    69  	// For example, you can declare a queue and publish a message:
    70  	// conn, err := amqp.Dial(fmt.Sprintf(
    71  	// 	"amqp://user:password@%s:%s/",
    72  	// 	host,
    73  	// 	port,
    74  	// ))
    75  	// if err != nil {
    76  	// 	logrus.Fatalf("Could not connect to RabbitMQ: %s", err)
    77  	// }
    78  
    79  	// ch, err := conn.Channel()
    80  	// if err != nil {
    81  	// 	logrus.Fatalf("Could not open a channel: %s", err)
    82  	// }
    83  
    84  	return resource
    85  }
    86  
    87  func GetConnection(pool *dockertest.Pool) (*amqp.Connection, *dockertest.Resource) {
    88  	if resource == nil {
    89  		resource = GenerateInstance(pool)
    90  	}
    91  
    92  	conn, err := amqp.Dial(fmt.Sprintf(
    93  		"amqp://user:password@%s:%s/",
    94  		host,
    95  		port,
    96  	))
    97  	if err != nil {
    98  		logrus.Fatalf("Could not connect to RabbitMQ: %s", err)
    99  	}
   100  
   101  	return conn, resource
   102  }