1package cmd_test
2
3import (
4	"errors"
5
6	. "github.com/onsi/ginkgo"
7	. "github.com/onsi/gomega"
8
9	. "github.com/cloudfoundry/bosh-cli/cmd"
10	fakecmd "github.com/cloudfoundry/bosh-cli/cmd/cmdfakes"
11	cmdconf "github.com/cloudfoundry/bosh-cli/cmd/config"
12	fakecmdconf "github.com/cloudfoundry/bosh-cli/cmd/config/configfakes"
13	boshdir "github.com/cloudfoundry/bosh-cli/director"
14	fakedir "github.com/cloudfoundry/bosh-cli/director/directorfakes"
15	fakeui "github.com/cloudfoundry/bosh-cli/ui/fakes"
16	boshtbl "github.com/cloudfoundry/bosh-cli/ui/table"
17)
18
19var _ = Describe("AliasEnvCmd", func() {
20	var (
21		sessions map[*fakecmdconf.FakeConfig2]*fakecmd.FakeSession
22		config   *fakecmdconf.FakeConfig2
23		ui       *fakeui.FakeUI
24		command  AliasEnvCmd
25	)
26
27	BeforeEach(func() {
28		sessions = map[*fakecmdconf.FakeConfig2]*fakecmd.FakeSession{}
29
30		sessionFactory := func(config cmdconf.Config) Session {
31			typedConfig, ok := config.(*fakecmdconf.FakeConfig2)
32			if !ok {
33				panic("Expected to find FakeConfig2")
34			}
35
36			for c, sess := range sessions {
37				if c.Existing == typedConfig.Existing {
38					return sess
39				}
40			}
41
42			panic("Expected to find fake session")
43		}
44
45		config = &fakecmdconf.FakeConfig2{
46			Existing: fakecmdconf.ConfigContents{
47				EnvironmentURL:    "curr-environment-url",
48				EnvironmentCACert: "curr-ca-cert",
49			},
50		}
51
52		ui = &fakeui.FakeUI{}
53
54		command = NewAliasEnvCmd(sessionFactory, config, ui)
55	})
56
57	Describe("Run", func() {
58		var (
59			opts            AliasEnvOpts
60			updatedSession  *fakecmd.FakeSession
61			updatedConfig   *fakecmdconf.FakeConfig2
62			updatedDirector *fakedir.FakeDirector
63		)
64
65		BeforeEach(func() {
66			opts = AliasEnvOpts{}
67
68			opts.URL = "environment-url"
69			opts.Args.Alias = "environment-alias"
70			opts.CACert = CACertArg{Content: "environment-ca-cert"}
71
72			updatedConfig = &fakecmdconf.FakeConfig2{
73				Existing: fakecmdconf.ConfigContents{
74					EnvironmentURL:    "environment-url",
75					EnvironmentAlias:  "environment-alias",
76					EnvironmentCACert: "environment-ca-cert",
77				},
78			}
79
80			updatedDirector = &fakedir.FakeDirector{}
81
82			updatedSession = &fakecmd.FakeSession{}
83			updatedSession.DirectorReturns(updatedDirector, nil)
84			updatedSession.EnvironmentReturns("environment-url")
85
86			sessions[updatedConfig] = updatedSession
87		})
88
89		act := func() error { return command.Run(opts) }
90
91		It("returns error if aliasing fails", func() {
92			config.AliasEnvironmentErr = errors.New("fake-err")
93
94			err := act()
95			Expect(err).To(HaveOccurred())
96			Expect(err.Error()).To(ContainSubstring("fake-err"))
97
98			Expect(config.Saved.Called).To(BeFalse())
99		})
100
101		It("saves environment and shows director info if director is reachable", func() {
102			info := boshdir.Info{
103				Name:    "director-name",
104				UUID:    "director-uuid",
105				Version: "director-version",
106			}
107			updatedDirector.InfoReturns(info, nil)
108
109			err := act()
110			Expect(err).ToNot(HaveOccurred())
111
112			Expect(config.Saved.Called).To(BeTrue())
113			Expect(config.Saved.EnvironmentURL).To(Equal("environment-url"))
114			Expect(config.Saved.EnvironmentAlias).To(Equal("environment-alias"))
115			Expect(config.Saved.EnvironmentCACert).To(Equal("environment-ca-cert"))
116
117			Expect(ui.Table).To(Equal(boshtbl.Table{
118				Header: []boshtbl.Header{
119					boshtbl.NewHeader("Name"),
120					boshtbl.NewHeader("UUID"),
121					boshtbl.NewHeader("Version"),
122					boshtbl.NewHeader("User"),
123				},
124				Rows: [][]boshtbl.Value{
125					{
126						boshtbl.NewValueString("director-name"),
127						boshtbl.NewValueString("director-uuid"),
128						boshtbl.NewValueString("director-version"),
129						boshtbl.NewValueString("(not logged in)"),
130					},
131				},
132				Transpose: true,
133			}))
134		})
135
136		It("returns an error and does not save environment if director is not reachable", func() {
137			updatedDirector.InfoReturns(boshdir.Info{}, errors.New("fake-err"))
138
139			err := act()
140			Expect(err).To(HaveOccurred())
141			Expect(err.Error()).To(ContainSubstring("fake-err"))
142
143			Expect(config.Saved.Called).To(BeFalse())
144		})
145	})
146})
147