func MakeCliApp( diegoVersion string, latticeVersion string, ltcConfigRoot string, exitHandler exit_handler.ExitHandler, config *config.Config, logger lager.Logger, receptorClientCreator receptor_client.Creator, targetVerifier target_verifier.TargetVerifier, cliStdout io.Writer, ) *cli.App { config.Load() app := cli.NewApp() app.Name = AppName app.Author = latticeCliAuthor app.Version = defaultVersion(diegoVersion, latticeVersion) app.Usage = LtcUsage app.Email = "*****@*****.**" ui := terminal.NewUI(os.Stdin, cliStdout, password_reader.NewPasswordReader(exitHandler)) app.Writer = ui app.Before = func(context *cli.Context) error { args := context.Args() command := app.Command(args.First()) if command == nil { return nil } if _, ok := nonTargetVerifiedCommandNames[command.Name]; ok || len(args) == 0 { return nil } if receptorUp, authorized, err := targetVerifier.VerifyTarget(config.Receptor()); !receptorUp { ui.SayLine(fmt.Sprintf("Error connecting to the receptor. Make sure your lattice target is set, and that lattice is up and running.\n\tUnderlying error: %s", err.Error())) return err } else if !authorized { ui.SayLine("Could not authenticate with the receptor. Please run ltc target with the correct credentials.") return errors.New("Could not authenticate with the receptor.") } return nil } app.Action = defaultAction app.CommandNotFound = func(c *cli.Context, command string) { ui.SayLine(fmt.Sprintf(unknownCommand, command)) exitHandler.Exit(1) } app.Commands = cliCommands(ltcConfigRoot, exitHandler, config, logger, receptorClientCreator, targetVerifier, ui) return app }
}) It("errors when port exceeds 65536", func() { commandFinishChan := test_helpers.AsyncExecuteCommandWithArgs(targetBlobCommand, []string{"192.168.11.11:70000"}) Eventually(commandFinishChan).Should(BeClosed()) Expect(outputBuffer).To(test_helpers.SayLine("Error setting blob target: malformed port")) Expect(fakeExitHandler.ExitCalledWith).To(Equal([]int{exit_codes.InvalidSyntax})) Expect(fakeTargetVerifier.VerifyBlobTargetCallCount()).To(BeZero()) }) }) Context("scenarios that should not save the config", func() { verifyConfigNotSaved := func(failMessage string) { Expect(outputBuffer).NotTo(test_helpers.Say("Blob Location Set")) Expect(outputBuffer).To(test_helpers.Say(failMessage)) config.Load() blobTarget := config.BlobTarget() Expect(blobTarget.TargetHost).To(Equal("original-host")) Expect(blobTarget.TargetPort).To(Equal(uint16(8989))) Expect(blobTarget.AccessKey).To(Equal("original-key")) Expect(blobTarget.SecretKey).To(Equal("original-secret")) Expect(blobTarget.BucketName).To(Equal("original-bucket")) Expect(fakeExitHandler.ExitCalledWith).To(Equal([]int{exit_codes.BadTarget})) } BeforeEach(func() { config.SetBlobTarget("original-host", 8989, "original-key", "original-secret", "original-bucket") config.Save() }) It("does not save the config when there is an error connecting to the target", func() {
It("returns errors from the persistor", func() { testPersister.err = errors.New("Error") err := testConfig.Save() Expect(err).To(MatchError("Error")) }) }) Describe("Load", func() { It("loads the target, username, and password from the persister", func() { testPersister.target = "mysavedapi.com" testPersister.username = "******" testPersister.password = "******" Expect(testConfig.Load()).To(Succeed()) Expect(testPersister.target).To(Equal("mysavedapi.com")) Expect(testConfig.Receptor()).To(Equal("http://*****:*****@receptor.mysavedapi.com")) }) It("returns errors from loading the config", func() { testPersister.err = errors.New("Error") err := testConfig.Load() Expect(err).To(MatchError("Error")) }) }) Describe("TargetBlob", func() { It("sets the blob target", func() {
It("returns errors from the persistor", func() { testConfig = config.New(&fakePersister{err: errors.New("Error")}) err := testConfig.Save() Expect(err).To(MatchError("Error")) }) }) Describe("Load", func() { It("loads the target, username, and password from the persister", func() { fakePersister := &fakePersister{target: "mysavedapi.com", username: "******", password: "******"} testConfig = config.New(fakePersister) testConfig.Load() Expect(fakePersister.target).To(Equal("mysavedapi.com")) Expect(testConfig.Receptor()).To(Equal("http://*****:*****@receptor.mysavedapi.com")) }) It("returns errors from loading the config", func() { testConfig = config.New(&fakePersister{err: errors.New("Error")}) err := testConfig.Load() Expect(err).To(MatchError("Error")) }) }) Describe("TargetBlob", func() {