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

     1  package localstack_test
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/aws/credentials"
    11  	"github.com/aws/aws-sdk-go/aws/session"
    12  	"github.com/aws/aws-sdk-go/service/s3"
    13  	"github.com/aws/aws-sdk-go/service/sns"
    14  	"github.com/aws/aws-sdk-go/service/sqs"
    15  	"github.com/etecs-ru/gnomock"
    16  	"github.com/etecs-ru/gnomock/preset/localstack"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func TestPreset_s3(t *testing.T) {
    21  	t.Parallel()
    22  
    23  	p := localstack.Preset(
    24  		localstack.WithServices(localstack.S3),
    25  	)
    26  	c, err := gnomock.Start(p)
    27  
    28  	defer func() { require.NoError(t, gnomock.Stop(c)) }()
    29  
    30  	require.NoError(t, err)
    31  
    32  	s3Endpoint := fmt.Sprintf("http://%s/", c.Address(localstack.APIPort))
    33  	config := &aws.Config{
    34  		Region:           aws.String("us-east-1"),
    35  		Endpoint:         aws.String(s3Endpoint),
    36  		S3ForcePathStyle: aws.Bool(true),
    37  		Credentials:      credentials.NewStaticCredentials("a", "b", "c"),
    38  	}
    39  	sess, err := session.NewSession(config)
    40  	require.NoError(t, err)
    41  
    42  	svc := s3.New(sess)
    43  
    44  	_, err = svc.CreateBucket(&s3.CreateBucketInput{
    45  		Bucket: aws.String("foo"),
    46  	})
    47  	require.NoError(t, err)
    48  
    49  	out, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
    50  		Bucket: aws.String("foo"),
    51  	})
    52  	require.NoError(t, err)
    53  	require.Empty(t, out.Contents)
    54  
    55  	_, err = svc.PutObject(&s3.PutObjectInput{
    56  		Body:   bytes.NewReader([]byte("this is a file")),
    57  		Key:    aws.String("file"),
    58  		Bucket: aws.String("foo"),
    59  	})
    60  	require.NoError(t, err)
    61  
    62  	out, err = svc.ListObjectsV2(&s3.ListObjectsV2Input{
    63  		Bucket: aws.String("foo"),
    64  	})
    65  	require.NoError(t, err)
    66  	require.Equal(t, 1, len(out.Contents))
    67  }
    68  
    69  func TestPreset_wrongS3Path(t *testing.T) {
    70  	t.Parallel()
    71  
    72  	p := localstack.Preset(
    73  		localstack.WithServices(localstack.S3),
    74  		localstack.WithS3Files("./invalid"),
    75  	)
    76  	c, err := gnomock.Start(p)
    77  	require.Error(t, err)
    78  	require.Contains(t, err.Error(), "can't read s3 initial files")
    79  	require.NoError(t, gnomock.Stop(c))
    80  }
    81  
    82  func TestPreset_sqs_sns(t *testing.T) {
    83  	t.Parallel()
    84  
    85  	p := localstack.Preset(
    86  		localstack.WithServices(localstack.SNS, localstack.SQS),
    87  		localstack.WithVersion("0.11.0"),
    88  	)
    89  	c, err := gnomock.Start(p)
    90  
    91  	defer func() { require.NoError(t, gnomock.Stop(c)) }()
    92  
    93  	require.NoError(t, err)
    94  
    95  	endpoint := fmt.Sprintf("http://%s", c.Address(localstack.APIPort))
    96  
    97  	sess, err := session.NewSession(&aws.Config{
    98  		Region:      aws.String("us-east-1"),
    99  		Endpoint:    aws.String(endpoint),
   100  		Credentials: credentials.NewStaticCredentials("a", "b", "c"),
   101  	})
   102  	require.NoError(t, err)
   103  
   104  	sqsService := sqs.New(sess)
   105  	snsService := sns.New(sess)
   106  
   107  	_, err = sqsService.CreateQueue(&sqs.CreateQueueInput{
   108  		QueueName: aws.String("my_queue"),
   109  	})
   110  	require.NoError(t, err)
   111  
   112  	_, err = snsService.CreateTopic(&sns.CreateTopicInput{
   113  		Name: aws.String("my_topic"),
   114  	})
   115  	require.NoError(t, err)
   116  
   117  	queues, err := sqsService.ListQueues(&sqs.ListQueuesInput{})
   118  	require.NoError(t, err)
   119  	require.Equal(t, 1, len(queues.QueueUrls))
   120  
   121  	queueURL := queues.QueueUrls[0]
   122  
   123  	topics, err := snsService.ListTopics(&sns.ListTopicsInput{})
   124  	require.NoError(t, err)
   125  	require.Equal(t, 1, len(topics.Topics))
   126  
   127  	topic := topics.Topics[0]
   128  
   129  	_, err = snsService.Subscribe(&sns.SubscribeInput{
   130  		Protocol: aws.String("sqs"),
   131  		Endpoint: queueURL,
   132  		TopicArn: topic.TopicArn,
   133  	})
   134  	require.NoError(t, err)
   135  
   136  	_, err = snsService.Publish(&sns.PublishInput{
   137  		TopicArn: topic.TopicArn,
   138  		Message:  aws.String("foobar"),
   139  	})
   140  	require.NoError(t, err)
   141  
   142  	messages, err := sqsService.ReceiveMessage(&sqs.ReceiveMessageInput{
   143  		QueueUrl: queueURL,
   144  	})
   145  	require.NoError(t, err)
   146  	require.Equal(t, 1, len(messages.Messages))
   147  
   148  	var msg map[string]string
   149  
   150  	err = json.Unmarshal([]byte(*messages.Messages[0].Body), &msg)
   151  	require.NoError(t, err)
   152  	require.Equal(t, "foobar", msg["Message"])
   153  }