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 }