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 }