github.com/etecs-ru/gnomock@v0.13.2/preset/rabbitmq/preset_test.go (about)

     1  package rabbitmq_test
     2  
     3  import (
     4  	"context"
     5  	"crypto/tls"
     6  	"fmt"
     7  	"net/http"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/etecs-ru/gnomock"
    12  	"github.com/etecs-ru/gnomock/preset/rabbitmq"
    13  	"github.com/streadway/amqp"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestPreset(t *testing.T) {
    18  	t.Parallel()
    19  
    20  	messages := []rabbitmq.Message{
    21  		{
    22  			Queue:       "events",
    23  			ContentType: "text/plain",
    24  			StringBody:  "order: 1",
    25  		},
    26  		{
    27  			Queue:       "alerts",
    28  			ContentType: "text/plain",
    29  			StringBody:  "CPU: 92",
    30  		},
    31  	}
    32  
    33  	byteMessages := []rabbitmq.Message{
    34  		{
    35  			Queue:       "events",
    36  			ContentType: "text/binary", // non-existent format for test
    37  			Body:        []byte{54, 23, 12, 76, 54},
    38  		},
    39  		{
    40  			Queue:       "alerts",
    41  			ContentType: "text/binary", // non-existent format for test
    42  			Body:        []byte{75, 12, 8, 42, 12},
    43  		},
    44  	}
    45  
    46  	// gnomock setup
    47  	p := rabbitmq.Preset(
    48  		rabbitmq.WithUser("gnomock", "strong-password"),
    49  		rabbitmq.WithMessages(messages...),
    50  		rabbitmq.WithMessages(byteMessages...),
    51  		rabbitmq.WithMessagesFile("./testdata/messages.json"),
    52  		rabbitmq.WithVersion("3.8.9-alpine"),
    53  	)
    54  
    55  	container, err := gnomock.Start(p)
    56  	require.NoError(t, err)
    57  
    58  	defer func() { require.NoError(t, gnomock.Stop(container)) }()
    59  
    60  	// actual test code
    61  	uri := fmt.Sprintf(
    62  		"amqp://%s:%s@%s",
    63  		"gnomock", "strong-password",
    64  		container.DefaultAddress(),
    65  	)
    66  	conn, err := amqp.Dial(uri)
    67  	require.NoError(t, err)
    68  
    69  	defer func() { require.NoError(t, conn.Close()) }()
    70  
    71  	ch, err := conn.Channel()
    72  	require.NoError(t, err)
    73  
    74  	defer func() { require.NoError(t, ch.Close()) }()
    75  
    76  	q, err := ch.QueueDeclare(
    77  		"gnomock",
    78  		false, // Durable
    79  		false, // Delete when unused
    80  		false, // Exclusive
    81  		false, // No-wait
    82  		nil,   // Arguments
    83  	)
    84  	require.NoError(t, err)
    85  
    86  	msgBody := []byte("hello from Gnomock!")
    87  	err = ch.Publish(
    88  		"",     // exchange
    89  		q.Name, // routing key
    90  		false,  // mandatory
    91  		false,  // immediate
    92  		amqp.Publishing{
    93  			ContentType: "text/plain",
    94  			Body:        msgBody,
    95  		},
    96  	)
    97  	require.NoError(t, err)
    98  
    99  	msgs, err := ch.Consume(
   100  		q.Name, // queue
   101  		"",     // consumer
   102  		true,   // auto-ack
   103  		false,  // exclusive
   104  		false,  // no-local
   105  		false,  // no-wait
   106  		nil,    // args
   107  	)
   108  	require.NoError(t, err)
   109  
   110  	m := <-msgs
   111  	require.Equal(t, msgBody, m.Body)
   112  
   113  	// ===================================
   114  	// Test for string and binary messages
   115  	// ===================================
   116  	msgs, err = ch.Consume("events", "", true, false, false, false, nil)
   117  	require.NoError(t, err)
   118  
   119  	m, ok := <-msgs
   120  	require.Equal(t, true, ok)
   121  	require.Equal(t, []byte(messages[0].StringBody), m.Body)
   122  
   123  	m, ok = <-msgs
   124  	require.Equal(t, true, ok)
   125  	require.Equal(t, byteMessages[0].Body, m.Body)
   126  
   127  	msgs, err = ch.Consume("alerts", "", true, false, false, false, nil)
   128  	require.NoError(t, err)
   129  
   130  	m, ok = <-msgs
   131  	require.Equal(t, true, ok)
   132  	require.Equal(t, []byte(messages[1].StringBody), m.Body)
   133  
   134  	m, ok = <-msgs
   135  	require.Equal(t, true, ok)
   136  	require.Equal(t, byteMessages[1].Body, m.Body)
   137  }
   138  
   139  func TestPreset_withManagement(t *testing.T) {
   140  	t.Parallel()
   141  
   142  	// gnomock setup
   143  	p := rabbitmq.Preset(
   144  		rabbitmq.WithUser("gnomock", "strong-password"),
   145  		rabbitmq.WithVersion("3.8.9-management-alpine"),
   146  	)
   147  
   148  	container, err := gnomock.Start(p)
   149  	require.NoError(t, err)
   150  
   151  	defer func() { require.NoError(t, gnomock.Stop(container)) }()
   152  
   153  	addr := container.Address(rabbitmq.ManagementPort)
   154  	url := fmt.Sprintf("http://%s/api/overview", addr)
   155  
   156  	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
   157  	defer cancel()
   158  
   159  	client := &http.Client{
   160  		Transport: &http.Transport{
   161  			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
   162  		},
   163  	}
   164  
   165  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
   166  	require.NoError(t, err)
   167  
   168  	resp, err := client.Do(req)
   169  	require.NoError(t, err)
   170  
   171  	defer require.NoError(t, resp.Body.Close())
   172  
   173  	require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
   174  }
   175  
   176  func TestPreset_withDefaults(t *testing.T) {
   177  	t.Parallel()
   178  
   179  	p := rabbitmq.Preset()
   180  	container, err := gnomock.Start(p)
   181  	require.NoError(t, err)
   182  
   183  	defer func() { require.NoError(t, gnomock.Stop(container)) }()
   184  
   185  	uri := fmt.Sprintf(
   186  		"amqp://%s:%s@%s",
   187  		"guest", "guest",
   188  		container.DefaultAddress(),
   189  	)
   190  	conn, err := amqp.Dial(uri)
   191  	require.NoError(t, err)
   192  
   193  	defer func() { require.NoError(t, conn.Close()) }()
   194  
   195  	ch, err := conn.Channel()
   196  	require.NoError(t, err)
   197  	require.NoError(t, ch.Close())
   198  }