github.com/triarius/goreleaser@v1.12.5/internal/pipe/blob/blob_test.go (about)

     1  package blob
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/triarius/goreleaser/internal/testlib"
     8  	"github.com/triarius/goreleaser/pkg/config"
     9  	"github.com/triarius/goreleaser/pkg/context"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestDescription(t *testing.T) {
    14  	require.NotEmpty(t, Pipe{}.String())
    15  }
    16  
    17  func TestErrors(t *testing.T) {
    18  	for k, v := range map[string]string{
    19  		"NoSuchBucket":                 "provided bucket does not exist: someurl: NoSuchBucket",
    20  		"ContainerNotFound":            "provided bucket does not exist: someurl: ContainerNotFound",
    21  		"notFound":                     "provided bucket does not exist: someurl: notFound",
    22  		"NoCredentialProviders":        "check credentials and access to bucket: someurl: NoCredentialProviders",
    23  		"InvalidAccessKeyId":           "aws access key id you provided does not exist in our records: InvalidAccessKeyId",
    24  		"AuthenticationFailed":         "azure storage key you provided is not valid: AuthenticationFailed",
    25  		"invalid_grant":                "google app credentials you provided is not valid: invalid_grant",
    26  		"no such host":                 "azure storage account you provided is not valid: no such host",
    27  		"ServiceCode=ResourceNotFound": "missing azure storage key for provided bucket someurl: ServiceCode=ResourceNotFound",
    28  		"other":                        "failed to write to bucket: other",
    29  	} {
    30  		t.Run(k, func(t *testing.T) {
    31  			require.EqualError(t, handleError(fmt.Errorf(k), "someurl"), v)
    32  		})
    33  	}
    34  }
    35  
    36  func TestDefaultsNoConfig(t *testing.T) {
    37  	errorString := "bucket or provider cannot be empty"
    38  	ctx := context.New(config.Project{
    39  		Blobs: []config.Blob{{}},
    40  	})
    41  	require.EqualError(t, Pipe{}.Default(ctx), errorString)
    42  }
    43  
    44  func TestDefaultsNoBucket(t *testing.T) {
    45  	errorString := "bucket or provider cannot be empty"
    46  	ctx := context.New(config.Project{
    47  		Blobs: []config.Blob{
    48  			{
    49  				Provider: "azblob",
    50  			},
    51  		},
    52  	})
    53  	require.EqualError(t, Pipe{}.Default(ctx), errorString)
    54  }
    55  
    56  func TestDefaultsNoProvider(t *testing.T) {
    57  	errorString := "bucket or provider cannot be empty"
    58  	ctx := context.New(config.Project{
    59  		Blobs: []config.Blob{
    60  			{
    61  				Bucket: "goreleaser-bucket",
    62  			},
    63  		},
    64  	})
    65  	require.EqualError(t, Pipe{}.Default(ctx), errorString)
    66  }
    67  
    68  func TestDefaults(t *testing.T) {
    69  	ctx := context.New(config.Project{
    70  		Blobs: []config.Blob{
    71  			{
    72  				Bucket:   "foo",
    73  				Provider: "azblob",
    74  				IDs:      []string{"foo", "bar"},
    75  			},
    76  			{
    77  				Bucket:   "foobar",
    78  				Provider: "gcs",
    79  			},
    80  		},
    81  	})
    82  	require.NoError(t, Pipe{}.Default(ctx))
    83  	require.Equal(t, []config.Blob{
    84  		{
    85  			Bucket:   "foo",
    86  			Provider: "azblob",
    87  			Folder:   "{{ .ProjectName }}/{{ .Tag }}",
    88  			IDs:      []string{"foo", "bar"},
    89  		},
    90  		{
    91  			Bucket:   "foobar",
    92  			Provider: "gcs",
    93  			Folder:   "{{ .ProjectName }}/{{ .Tag }}",
    94  		},
    95  	}, ctx.Config.Blobs)
    96  }
    97  
    98  func TestDefaultsWithProvider(t *testing.T) {
    99  	ctx := context.New(config.Project{
   100  		Blobs: []config.Blob{
   101  			{
   102  				Bucket:   "foo",
   103  				Provider: "azblob",
   104  			},
   105  			{
   106  				Bucket:   "foo",
   107  				Provider: "s3",
   108  			},
   109  			{
   110  				Bucket:   "foo",
   111  				Provider: "gs",
   112  			},
   113  		},
   114  	})
   115  	require.Nil(t, Pipe{}.Default(ctx))
   116  }
   117  
   118  func TestURL(t *testing.T) {
   119  	t.Run("s3 with opts", func(t *testing.T) {
   120  		url, err := urlFor(context.New(config.Project{}), config.Blob{
   121  			Bucket:     "foo",
   122  			Provider:   "s3",
   123  			Region:     "us-west-1",
   124  			Folder:     "foo",
   125  			Endpoint:   "s3.foobar.com",
   126  			DisableSSL: true,
   127  		})
   128  		require.NoError(t, err)
   129  		require.Equal(t, "s3://foo?disableSSL=true&endpoint=s3.foobar.com&region=us-west-1&s3ForcePathStyle=true", url)
   130  	})
   131  
   132  	t.Run("s3 with some opts", func(t *testing.T) {
   133  		url, err := urlFor(context.New(config.Project{}), config.Blob{
   134  			Bucket:     "foo",
   135  			Provider:   "s3",
   136  			Region:     "us-west-1",
   137  			DisableSSL: true,
   138  		})
   139  		require.NoError(t, err)
   140  		require.Equal(t, "s3://foo?disableSSL=true&region=us-west-1", url)
   141  	})
   142  
   143  	t.Run("gs with opts", func(t *testing.T) {
   144  		url, err := urlFor(context.New(config.Project{}), config.Blob{
   145  			Bucket:     "foo",
   146  			Provider:   "gs",
   147  			Region:     "us-west-1",
   148  			Folder:     "foo",
   149  			Endpoint:   "s3.foobar.com",
   150  			DisableSSL: true,
   151  		})
   152  		require.NoError(t, err)
   153  		require.Equal(t, "gs://foo", url)
   154  	})
   155  
   156  	t.Run("s3 no opts", func(t *testing.T) {
   157  		url, err := urlFor(context.New(config.Project{}), config.Blob{
   158  			Bucket:   "foo",
   159  			Provider: "s3",
   160  		})
   161  		require.NoError(t, err)
   162  		require.Equal(t, "s3://foo", url)
   163  	})
   164  
   165  	t.Run("gs no opts", func(t *testing.T) {
   166  		url, err := urlFor(context.New(config.Project{}), config.Blob{
   167  			Bucket:   "foo",
   168  			Provider: "gs",
   169  		})
   170  		require.NoError(t, err)
   171  		require.Equal(t, "gs://foo", url)
   172  	})
   173  
   174  	t.Run("template errors", func(t *testing.T) {
   175  		t.Run("provider", func(t *testing.T) {
   176  			_, err := urlFor(context.New(config.Project{}), config.Blob{
   177  				Provider: "{{ .Nope }}",
   178  			})
   179  			testlib.RequireTemplateError(t, err)
   180  		})
   181  		t.Run("bucket", func(t *testing.T) {
   182  			_, err := urlFor(context.New(config.Project{}), config.Blob{
   183  				Bucket:   "{{ .Nope }}",
   184  				Provider: "gs",
   185  			})
   186  			testlib.RequireTemplateError(t, err)
   187  		})
   188  		t.Run("endpoint", func(t *testing.T) {
   189  			_, err := urlFor(context.New(config.Project{}), config.Blob{
   190  				Bucket:   "foobar",
   191  				Endpoint: "{{.Env.NOPE}}",
   192  				Provider: "s3",
   193  			})
   194  			testlib.RequireTemplateError(t, err)
   195  		})
   196  		t.Run("region", func(t *testing.T) {
   197  			_, err := urlFor(context.New(config.Project{}), config.Blob{
   198  				Bucket:   "foobar",
   199  				Region:   "{{.Env.NOPE}}",
   200  				Provider: "s3",
   201  			})
   202  			testlib.RequireTemplateError(t, err)
   203  		})
   204  	})
   205  }
   206  
   207  func TestSkip(t *testing.T) {
   208  	t.Run("skip", func(t *testing.T) {
   209  		require.True(t, Pipe{}.Skip(context.New(config.Project{})))
   210  	})
   211  
   212  	t.Run("dont skip", func(t *testing.T) {
   213  		ctx := context.New(config.Project{
   214  			Blobs: []config.Blob{{}},
   215  		})
   216  		require.False(t, Pipe{}.Skip(ctx))
   217  	})
   218  }