github.com/x-helm/helm@v3.0.0-beta.3+incompatible/pkg/plugin/installer/vcs_installer_test.go (about) 1 /* 2 Copyright The Helm Authors. 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 */ 15 16 package installer // import "helm.sh/helm/pkg/plugin/installer" 17 18 import ( 19 "fmt" 20 "os" 21 "path/filepath" 22 "testing" 23 24 "github.com/Masterminds/vcs" 25 26 "helm.sh/helm/internal/test/ensure" 27 "helm.sh/helm/pkg/helmpath" 28 ) 29 30 var _ Installer = new(VCSInstaller) 31 32 type testRepo struct { 33 local, remote, current string 34 tags, branches []string 35 err error 36 vcs.Repo 37 } 38 39 func (r *testRepo) LocalPath() string { return r.local } 40 func (r *testRepo) Remote() string { return r.remote } 41 func (r *testRepo) Update() error { return r.err } 42 func (r *testRepo) Get() error { return r.err } 43 func (r *testRepo) IsReference(string) bool { return false } 44 func (r *testRepo) Tags() ([]string, error) { return r.tags, r.err } 45 func (r *testRepo) Branches() ([]string, error) { return r.branches, r.err } 46 func (r *testRepo) UpdateVersion(version string) error { 47 r.current = version 48 return r.err 49 } 50 51 func TestVCSInstaller(t *testing.T) { 52 defer ensure.HelmHome(t)() 53 54 if err := os.MkdirAll(helmpath.DataPath("plugins"), 0755); err != nil { 55 t.Fatalf("Could not create %s: %s", helmpath.DataPath("plugins"), err) 56 } 57 58 source := "https://github.com/adamreese/helm-env" 59 testRepoPath, _ := filepath.Abs("../testdata/plugdir/echo") 60 repo := &testRepo{ 61 local: testRepoPath, 62 tags: []string{"0.1.0", "0.1.1"}, 63 } 64 65 i, err := NewForSource(source, "~0.1.0") 66 if err != nil { 67 t.Fatalf("unexpected error: %s", err) 68 } 69 70 // ensure a VCSInstaller was returned 71 vcsInstaller, ok := i.(*VCSInstaller) 72 if !ok { 73 t.Fatal("expected a VCSInstaller") 74 } 75 76 // set the testRepo in the VCSInstaller 77 vcsInstaller.Repo = repo 78 79 if err := Install(i); err != nil { 80 t.Fatal(err) 81 } 82 if repo.current != "0.1.1" { 83 t.Errorf("expected version '0.1.1', got %q", repo.current) 84 } 85 if i.Path() != helmpath.DataPath("plugins", "helm-env") { 86 t.Errorf("expected path '$XDG_CONFIG_HOME/helm/plugins/helm-env', got %q", i.Path()) 87 } 88 89 // Install again to test plugin exists error 90 if err := Install(i); err == nil { 91 t.Error("expected error for plugin exists, got none") 92 } else if err.Error() != "plugin already exists" { 93 t.Errorf("expected error for plugin exists, got (%v)", err) 94 } 95 96 // Testing FindSource method, expect error because plugin code is not a cloned repository 97 if _, err := FindSource(i.Path()); err == nil { 98 t.Error("expected error for inability to find plugin source, got none") 99 } else if err.Error() != "cannot get information about plugin source" { 100 t.Errorf("expected error for inability to find plugin source, got (%v)", err) 101 } 102 } 103 104 func TestVCSInstallerNonExistentVersion(t *testing.T) { 105 defer ensure.HelmHome(t)() 106 107 source := "https://github.com/adamreese/helm-env" 108 version := "0.2.0" 109 110 i, err := NewForSource(source, version) 111 if err != nil { 112 t.Fatalf("unexpected error: %s", err) 113 } 114 115 // ensure a VCSInstaller was returned 116 _, ok := i.(*VCSInstaller) 117 if !ok { 118 t.Fatal("expected a VCSInstaller") 119 } 120 121 if err := Install(i); err == nil { 122 t.Error("expected error for version does not exists, got none") 123 } else if err.Error() != fmt.Sprintf("requested version %q does not exist for plugin %q", version, source) { 124 t.Errorf("expected error for version does not exists, got (%v)", err) 125 } 126 } 127 func TestVCSInstallerUpdate(t *testing.T) { 128 defer ensure.HelmHome(t)() 129 130 source := "https://github.com/adamreese/helm-env" 131 132 i, err := NewForSource(source, "") 133 if err != nil { 134 t.Fatalf("unexpected error: %s", err) 135 } 136 137 // ensure a VCSInstaller was returned 138 _, ok := i.(*VCSInstaller) 139 if !ok { 140 t.Fatal("expected a VCSInstaller") 141 } 142 143 if err := Update(i); err == nil { 144 t.Fatal("expected error for plugin does not exist, got none") 145 } else if err.Error() != "plugin does not exist" { 146 t.Fatalf("expected error for plugin does not exist, got (%v)", err) 147 } 148 149 // Install plugin before update 150 if err := Install(i); err != nil { 151 t.Fatal(err) 152 } 153 154 // Test FindSource method for positive result 155 pluginInfo, err := FindSource(i.Path()) 156 if err != nil { 157 t.Fatal(err) 158 } 159 160 repoRemote := pluginInfo.(*VCSInstaller).Repo.Remote() 161 if repoRemote != source { 162 t.Fatalf("invalid source found, expected %q got %q", source, repoRemote) 163 } 164 165 // Update plugin 166 if err := Update(i); err != nil { 167 t.Fatal(err) 168 } 169 170 // Test update failure 171 os.Remove(filepath.Join(i.Path(), "plugin.yaml")) 172 // Testing update for error 173 if err := Update(i); err == nil { 174 t.Error("expected error for plugin modified, got none") 175 } else if err.Error() != "plugin repo was modified" { 176 t.Errorf("expected error for plugin modified, got (%v)", err) 177 } 178 179 }