BeforeEach(func() {
		ui = &testterm.FakeUI{}
		requirementsFactory = &testreq.FakeReqFactory{}
		config = testconfig.NewRepositoryWithDefaults()
	})

	var callRemovePluginRepo = func(args ...string) bool {
		cmd := NewRemovePluginRepo(ui, config)
		return testcmd.RunCommand(cmd, args, requirementsFactory)
	}

	Context("When repo name is valid", func() {
		BeforeEach(func() {
			config.SetPluginRepo(models.PluginRepo{
				Name: "repo1",
				Url:  "http://someserver1.com:1234",
			})

			config.SetPluginRepo(models.PluginRepo{
				Name: "repo2",
				Url:  "http://server2.org:8080",
			})
		})

		It("deletes the repo from the config", func() {
			callRemovePluginRepo("repo1")
			Ω(len(config.PluginRepos())).To(Equal(1))
			Ω(config.PluginRepos()[0].Name).To(Equal("repo2"))
			Ω(config.PluginRepos()[0].Url).To(Equal("http://server2.org:8080"))
		})
	})
		AfterEach(func() {
			testServer.Close()
		})

		It("saves the repo url into config", func() {
			callAddPluginRepo([]string{"repo", testServer.URL})

			Ω(config.PluginRepos()[0].Name).To(Equal("repo"))
			Ω(config.PluginRepos()[0].Url).To(Equal(testServer.URL))
		})
	})

	Context("repo name already existing", func() {
		BeforeEach(func() {
			config.SetPluginRepo(models.PluginRepo{Name: "repo", Url: "http://repo.com"})
		})

		It("informs user of the already existing repo", func() {

			callAddPluginRepo([]string{"repo", "http://repo2.com"})

			Ω(ui.Outputs).To(ContainSubstrings(
				[]string{"Plugin repo named \"repo\"", " already exists"},
			))
		})
	})

	Context("repo address already existing", func() {
		BeforeEach(func() {
			config.SetPluginRepo(models.PluginRepo{Name: "repo1", Url: "http://repo.com"})
	Describe("Locating binary file", func() {

		Describe("install from plugin repository when '-r' provided", func() {
			Context("gets metadata of the plugin from repo", func() {
				Context("when repo is not found in config", func() {
					It("informs user repo is not found", func() {
						runCommand("plugin1", "-r", "repo1")
						Ω(ui.Outputs).To(ContainSubstrings([]string{"Looking up 'plugin1' from repository 'repo1'"}))
						Ω(ui.Outputs).To(ContainSubstrings([]string{"repo1 not found"}))
					})
				})

				Context("when repo is found in config", func() {
					Context("when repo endpoint returns an error", func() {
						It("informs user about the error", func() {
							config.SetPluginRepo(models.PluginRepo{Name: "repo1", Url: ""})
							fakePluginRepo.GetPluginsReturns(nil, []string{"repo error1"})
							runCommand("plugin1", "-r", "repo1")

							Ω(ui.Outputs).To(ContainSubstrings([]string{"Error getting plugin metadata from repo"}))
							Ω(ui.Outputs).To(ContainSubstrings([]string{"repo error1"}))
						})
					})

					Context("when plugin metadata is available and desired plugin is not found", func() {
						It("informs user about the error", func() {
							config.SetPluginRepo(models.PluginRepo{Name: "repo1", Url: ""})
							fakePluginRepo.GetPluginsReturns(nil, nil)
							runCommand("plugin1", "-r", "repo1")

							Ω(ui.Outputs).To(ContainSubstrings([]string{"plugin1 is not available in repo 'repo1'"}))
	)

	BeforeEach(func() {
		ui = &testterm.FakeUI{}
		requirementsFactory = &testreq.FakeReqFactory{}
		config = testconfig.NewRepositoryWithDefaults()
	})

	var callListPluginRepos = func(args ...string) bool {
		cmd := NewListPluginRepos(ui, config)
		return testcmd.RunCommand(cmd, args, requirementsFactory)
	}

	It("lists all added plugin repo in a table", func() {
		config.SetPluginRepo(models.PluginRepo{
			Name: "repo1",
			Url:  "http://url1.com",
		})
		config.SetPluginRepo(models.PluginRepo{
			Name: "repo2",
			Url:  "http://url2.com",
		})

		callListPluginRepos()

		Ω(ui.Outputs).To(ContainSubstrings(
			[]string{"repo1", "http://url1.com"},
			[]string{"repo2", "http://url2.com"},
		))
	})

})