get.porter.sh/porter@v1.3.0/pkg/cnab/extensions_test.go (about)

     1  package cnab
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	depsv1ext "get.porter.sh/porter/pkg/cnab/extensions/dependencies/v1"
     8  	"github.com/cnabio/cnab-go/bundle"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestProcessRequiredExtensions(t *testing.T) {
    14  	t.Parallel()
    15  
    16  	t.Run("supported", func(t *testing.T) {
    17  		t.Parallel()
    18  
    19  		bun := ReadTestBundle(t, "testdata/bundle.json")
    20  		exts, err := bun.ProcessRequiredExtensions()
    21  		require.NoError(t, err, "could not process required extensions")
    22  
    23  		expected := ProcessedExtensions{
    24  			"sh.porter.file-parameters": nil,
    25  			"io.cnab.dependencies": depsv1ext.Dependencies{
    26  				Requires: map[string]depsv1ext.Dependency{
    27  					"storage": {
    28  						Bundle: "somecloud/blob-storage",
    29  					},
    30  					"mysql": {
    31  						Bundle: "somecloud/mysql",
    32  						Version: &depsv1ext.DependencyVersion{
    33  							AllowPrereleases: true,
    34  							Ranges:           []string{"5.7.x"},
    35  						},
    36  					},
    37  				},
    38  			},
    39  			"io.cnab.parameter-sources": ParameterSources{
    40  				"tfstate": ParameterSource{
    41  					Priority: []string{ParameterSourceTypeOutput},
    42  					Sources: ParameterSourceMap{
    43  						ParameterSourceTypeOutput: OutputParameterSource{"tfstate"},
    44  					},
    45  				},
    46  				"mysql_connstr": ParameterSource{
    47  					Priority: []string{ParameterSourceTypeDependencyOutput},
    48  					Sources: ParameterSourceMap{
    49  						ParameterSourceTypeDependencyOutput: DependencyOutputParameterSource{
    50  							Dependency: "mysql",
    51  							OutputName: "connstr",
    52  						},
    53  					},
    54  				},
    55  			},
    56  		}
    57  		require.Equal(t, expected, exts)
    58  	})
    59  
    60  	t.Run("supported unprocessable", func(t *testing.T) {
    61  		t.Parallel()
    62  
    63  		bun := ReadTestBundle(t, "testdata/bundle-supported-unprocessable.json")
    64  		_, err := bun.ProcessRequiredExtensions()
    65  		require.EqualError(t, err, "unable to process extension: io.cnab.docker: no custom extension configuration found")
    66  	})
    67  
    68  	t.Run("unsupported", func(t *testing.T) {
    69  		t.Parallel()
    70  
    71  		bun := ReadTestBundle(t, "testdata/bundle-unsupported-required.json")
    72  		_, err := bun.ProcessRequiredExtensions()
    73  		require.EqualError(t, err, "unsupported required extension: donuts")
    74  	})
    75  }
    76  
    77  func TestGetSupportedExtension(t *testing.T) {
    78  	t.Parallel()
    79  
    80  	for _, supported := range SupportedExtensions {
    81  		supportedExtension := supported
    82  		t.Run(fmt.Sprintf("%s - shorthand", supportedExtension.Shorthand), func(t *testing.T) {
    83  			t.Parallel()
    84  
    85  			ext, err := GetSupportedExtension(supportedExtension.Shorthand)
    86  			require.NoError(t, err)
    87  			require.Equal(t, supportedExtension.Key, ext.Key)
    88  		})
    89  
    90  		t.Run(fmt.Sprintf("%s - key", supported.Key), func(t *testing.T) {
    91  			t.Parallel()
    92  
    93  			ext, err := GetSupportedExtension(supportedExtension.Key)
    94  			require.NoError(t, err)
    95  			require.Equal(t, supportedExtension.Key, ext.Key)
    96  		})
    97  	}
    98  
    99  	t.Run("unsupported", func(t *testing.T) {
   100  		t.Parallel()
   101  
   102  		_, err := GetSupportedExtension("donuts")
   103  		require.EqualError(t, err, "unsupported required extension: donuts")
   104  	})
   105  }
   106  
   107  func TestSupportsExtension(t *testing.T) {
   108  	t.Run("key present", func(t *testing.T) {
   109  		b := NewBundle(bundle.Bundle{RequiredExtensions: []string{"io.test.thing"}})
   110  		assert.True(t, b.SupportsExtension("io.test.thing"))
   111  	})
   112  
   113  	t.Run("key missing", func(t *testing.T) {
   114  		// We need to match against the full key, not just shorthand
   115  		b := NewBundle(bundle.Bundle{RequiredExtensions: []string{"thing"}})
   116  		assert.False(t, b.SupportsExtension("io.test.thing"))
   117  	})
   118  }