github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/actor/pluginaction/plugin_repository_test.go (about)

     1  package pluginaction_test
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	. "code.cloudfoundry.org/cli/actor/pluginaction"
     9  	"code.cloudfoundry.org/cli/actor/pluginaction/pluginactionfakes"
    10  	"code.cloudfoundry.org/cli/api/plugin"
    11  	"code.cloudfoundry.org/cli/util/configv3"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Plugin Repository Actions", func() {
    17  	var (
    18  		actor            *Actor
    19  		fakeConfig       *pluginactionfakes.FakeConfig
    20  		fakePluginClient *pluginactionfakes.FakePluginClient
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		fakeConfig = new(pluginactionfakes.FakeConfig)
    25  		fakePluginClient = new(pluginactionfakes.FakePluginClient)
    26  		actor = NewActor(fakeConfig, fakePluginClient)
    27  	})
    28  
    29  	Describe("AddPluginRepository", func() {
    30  		var err error
    31  
    32  		JustBeforeEach(func() {
    33  			err = actor.AddPluginRepository("some-repo", "some-URL")
    34  		})
    35  
    36  		When("passed a url without a scheme", func() {
    37  			It("prepends https://", func() {
    38  				_ = actor.AddPluginRepository("some-repo2", "some-URL")
    39  				url := fakePluginClient.GetPluginRepositoryArgsForCall(1)
    40  				Expect(strings.HasPrefix(url, "https://")).To(BeTrue())
    41  			})
    42  		})
    43  
    44  		When("passed a schemeless IP address with a port", func() {
    45  			It("prepends https://", func() {
    46  				_ = actor.AddPluginRepository("some-repo2", "127.0.0.1:5000")
    47  				url := fakePluginClient.GetPluginRepositoryArgsForCall(1)
    48  				Expect(strings.HasPrefix(url, "https://")).To(BeTrue())
    49  			})
    50  		})
    51  
    52  		When("the repository name is taken", func() {
    53  			BeforeEach(func() {
    54  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
    55  					{
    56  						Name: "repo-1",
    57  						URL:  "https://URL-1",
    58  					},
    59  					{
    60  						Name: "some-repo",
    61  						URL:  "https://www.com",
    62  					},
    63  				})
    64  			})
    65  
    66  			It("returns the RepositoryNameTakenError", func() {
    67  				Expect(err).To(MatchError(actionerror.RepositoryNameTakenError{Name: "some-repo"}))
    68  			})
    69  		})
    70  
    71  		When("the repository name and URL are already taken in the same repo", func() {
    72  			BeforeEach(func() {
    73  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
    74  					{
    75  						Name: "some-repo",
    76  						URL:  "https://some-URL",
    77  					},
    78  				})
    79  			})
    80  
    81  			It("returns a RepositoryAlreadyExistsError", func() {
    82  				Expect(err).To(MatchError(actionerror.RepositoryAlreadyExistsError{Name: "some-repo", URL: "https://some-URL"}))
    83  
    84  				Expect(fakePluginClient.GetPluginRepositoryCallCount()).To(Equal(0))
    85  				Expect(fakeConfig.AddPluginRepositoryCallCount()).To(Equal(0))
    86  			})
    87  		})
    88  
    89  		When("the repository name is the same except for case sensitivity", func() {
    90  			BeforeEach(func() {
    91  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
    92  					{
    93  						Name: "sOmE-rEpO",
    94  						URL:  "https://some-URL",
    95  					},
    96  				})
    97  			})
    98  
    99  			It("returns a RepositoryAlreadyExistsError", func() {
   100  				Expect(err).To(MatchError(actionerror.RepositoryAlreadyExistsError{Name: "sOmE-rEpO", URL: "https://some-URL"}))
   101  
   102  				Expect(fakePluginClient.GetPluginRepositoryCallCount()).To(Equal(0))
   103  				Expect(fakeConfig.AddPluginRepositoryCallCount()).To(Equal(0))
   104  			})
   105  		})
   106  
   107  		When("the repository name is the same and repository URL is the same except for trailing slash", func() {
   108  			BeforeEach(func() {
   109  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
   110  					{
   111  						Name: "some-repo",
   112  						URL:  "https://some-URL",
   113  					},
   114  				})
   115  			})
   116  
   117  			It("returns a RepositoryAlreadyExistsError", func() {
   118  				err = actor.AddPluginRepository("some-repo", "some-URL/")
   119  				Expect(err).To(MatchError(actionerror.RepositoryAlreadyExistsError{Name: "some-repo", URL: "https://some-URL"}))
   120  
   121  				Expect(fakePluginClient.GetPluginRepositoryCallCount()).To(Equal(0))
   122  				Expect(fakeConfig.AddPluginRepositoryCallCount()).To(Equal(0))
   123  			})
   124  		})
   125  
   126  		When("the repository URL is taken", func() {
   127  			BeforeEach(func() {
   128  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
   129  					{
   130  						Name: "repo-1",
   131  						URL:  "https://URL-1",
   132  					},
   133  					{
   134  						Name: "repo-2",
   135  						URL:  "https://some-URL",
   136  					},
   137  				})
   138  			})
   139  
   140  			It("adds the repo to the config and returns nil", func() {
   141  				Expect(err).ToNot(HaveOccurred())
   142  
   143  				Expect(fakePluginClient.GetPluginRepositoryCallCount()).To(Equal(1))
   144  				Expect(fakePluginClient.GetPluginRepositoryArgsForCall(0)).To(Equal("https://some-URL"))
   145  
   146  				Expect(fakeConfig.AddPluginRepositoryCallCount()).To(Equal(1))
   147  				repoName, repoURL := fakeConfig.AddPluginRepositoryArgsForCall(0)
   148  				Expect(repoName).To(Equal("some-repo"))
   149  				Expect(repoURL).To(Equal("https://some-URL"))
   150  			})
   151  		})
   152  
   153  		When("getting the repository errors", func() {
   154  			BeforeEach(func() {
   155  				fakePluginClient.GetPluginRepositoryReturns(plugin.PluginRepository{}, errors.New("generic-error"))
   156  			})
   157  
   158  			It("returns an AddPluginRepositoryError", func() {
   159  				Expect(err).To(MatchError(actionerror.AddPluginRepositoryError{
   160  					Name:    "some-repo",
   161  					URL:     "https://some-URL",
   162  					Message: "generic-error",
   163  				}))
   164  			})
   165  		})
   166  
   167  		When("no errors occur", func() {
   168  			BeforeEach(func() {
   169  				fakePluginClient.GetPluginRepositoryReturns(plugin.PluginRepository{}, nil)
   170  			})
   171  
   172  			It("adds the repo to the config and returns nil", func() {
   173  				Expect(err).ToNot(HaveOccurred())
   174  
   175  				Expect(fakePluginClient.GetPluginRepositoryCallCount()).To(Equal(1))
   176  				Expect(fakePluginClient.GetPluginRepositoryArgsForCall(0)).To(Equal("https://some-URL"))
   177  
   178  				Expect(fakeConfig.AddPluginRepositoryCallCount()).To(Equal(1))
   179  				repoName, repoURL := fakeConfig.AddPluginRepositoryArgsForCall(0)
   180  				Expect(repoName).To(Equal("some-repo"))
   181  				Expect(repoURL).To(Equal("https://some-URL"))
   182  			})
   183  		})
   184  	})
   185  
   186  	Describe("GetPluginRepository", func() {
   187  		When("the repository is registered", func() {
   188  			BeforeEach(func() {
   189  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
   190  					{Name: "some-REPO", URL: "some-url"},
   191  				})
   192  			})
   193  
   194  			It("returns the repository case-insensitively", func() {
   195  				pluginRepo, err := actor.GetPluginRepository("sOmE-rEpO")
   196  				Expect(err).ToNot(HaveOccurred())
   197  				Expect(pluginRepo).To(Equal(configv3.PluginRepository{Name: "some-REPO", URL: "some-url"}))
   198  			})
   199  		})
   200  
   201  		When("the repository is not registered", func() {
   202  			It("returns a RepositoryNotRegisteredError", func() {
   203  				_, err := actor.GetPluginRepository("some-rEPO")
   204  				Expect(err).To(MatchError(actionerror.RepositoryNotRegisteredError{Name: "some-rEPO"}))
   205  			})
   206  		})
   207  	})
   208  
   209  	Describe("IsPluginRepositoryRegistered", func() {
   210  		When("the repository is registered", func() {
   211  			BeforeEach(func() {
   212  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{
   213  					{Name: "some-repo"},
   214  				})
   215  			})
   216  
   217  			It("returns true", func() {
   218  				Expect(actor.IsPluginRepositoryRegistered("some-repo")).To(BeTrue())
   219  			})
   220  		})
   221  
   222  		When("the repository is not registered", func() {
   223  			BeforeEach(func() {
   224  				fakeConfig.PluginRepositoriesReturns([]configv3.PluginRepository{})
   225  			})
   226  
   227  			It("returns true", func() {
   228  				Expect(actor.IsPluginRepositoryRegistered("some-repo")).To(BeFalse())
   229  			})
   230  		})
   231  	})
   232  })