func makeAppWithRoute(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" domain := models.DomainFields{} domain.Name = "example.com" route := models.RouteSummary{Host: "foo", Domain: domain} secondRoute := models.RouteSummary{Host: appName, Domain: domain} packgeUpdatedAt, _ := time.Parse("2006-01-02T15:04:05Z07:00", "2012-10-24T19:54:00Z") application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 application.Stack = &models.Stack{ Name: "fake_stack", Guid: "123-123-123", } application.Routes = []models.RouteSummary{route, secondRoute} application.PackageUpdatedAt = &packgeUpdatedAt return application }
func makeAppWithOptions(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" application.Command = "run main.go" application.BuildpackUrl = "go-buildpack" domain := models.DomainFields{} domain.Name = "example.com" route := models.RouteSummary{Host: "foo", Domain: domain} secondRoute := models.RouteSummary{Host: appName, Domain: domain} packgeUpdatedAt, _ := time.Parse("2006-01-02T15:04:05Z07:00", "2012-10-24T19:54:00Z") application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 application.HealthCheckTimeout = 100 application.Routes = []models.RouteSummary{route, secondRoute} application.PackageUpdatedAt = &packgeUpdatedAt envMap := make(map[string]interface{}) envMap["foo"] = "bar" application.EnvironmentVars = envMap application.Services = append(application.Services, models.ServicePlanSummary{ Guid: "", Name: "server1", }) return application }
func makeAppWithoutOptions(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" packgeUpdatedAt, _ := time.Parse("2006-01-02T15:04:05Z07:00", "2012-10-24T19:54:00Z") application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 application.PackageUpdatedAt = &packgeUpdatedAt return application }
func makeAppWithRoute(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" domain := models.DomainFields{} domain.Name = "example.com" route := models.RouteSummary{Host: "foo", Domain: domain} secondRoute := models.RouteSummary{Host: appName, Domain: domain} application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 application.Routes = []models.RouteSummary{route, secondRoute} return application }
func makeAppWithRoute(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" application.BuildpackUrl = "http://123.com" application.Command = "command1" application.Diego = false application.DetectedStartCommand = "detected_command" application.DiskQuota = 100 application.EnvironmentVars = map[string]interface{}{"test": 123} application.RunningInstances = 2 application.HealthCheckTimeout = 100 application.SpaceGuid = "guids_in_spaaace" application.PackageState = "STAGED" application.StagingFailedReason = "no reason" application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 t := time.Date(2009, time.November, 10, 15, 0, 0, 0, time.UTC) application.PackageUpdatedAt = &t services := models.ServicePlanSummary{ Guid: "s1-guid", Name: "s1-service", } application.Services = []models.ServicePlanSummary{services} domain := models.DomainFields{Guid: "domain1-guid", Name: "example.com", OwningOrganizationGuid: "org-123", Shared: true} route := models.RouteSummary{Host: "foo", Guid: "foo-guid", Domain: domain} secondRoute := models.RouteSummary{Host: appName, Domain: domain} application.Stack = &models.Stack{ Name: "fake_stack", Guid: "123-123-123", } application.Routes = []models.RouteSummary{route, secondRoute} return application }
func makeAppWithMultipleEnvVars(appName string) models.Application { application := models.Application{} application.Name = appName application.Guid = "app-guid" packgeUpdatedAt, _ := time.Parse("2006-01-02T15:04:05Z07:00", "2012-10-24T19:54:00Z") application.State = "started" application.InstanceCount = 2 application.RunningInstances = 2 application.Memory = 256 application.PackageUpdatedAt = &packgeUpdatedAt envMap := make(map[string]interface{}) envMap["foo"] = bool(true) envMap["abc"] = "abc" envMap["xyz"] = bool(false) envMap["bar"] = float64(10) application.EnvironmentVars = envMap return application }
configRepo = testconfig.NewRepository() appInstancesRepo = &testAppInstanaces.FakeAppInstancesRepository{} appRepo = &testApplication.FakeApplicationRepository{} displayApp = &appCmdFakes.FakeAppDisplayer{} //save original command dependency and restore later OriginalAppCommand = command_registry.Commands.FindCommand("app") defaultInstanceErrorCodes = []string{"", ""} defaultAppForStart = models.Application{} defaultAppForStart.Name = "my-app" defaultAppForStart.Guid = "my-app-guid" defaultAppForStart.InstanceCount = 2 defaultAppForStart.PackageState = "STAGED" domain := models.DomainFields{} domain.Name = "example.com" route := models.RouteSummary{} route.Host = "my-app" route.Domain = domain defaultAppForStart.Routes = []models.RouteSummary{route} instance1 := models.AppInstanceFields{} instance1.State = models.InstanceStarting
}) }) Describe("ssh", func() { var ( currentApp models.Application ) BeforeEach(func() { requirementsFactory.LoginSuccess = true requirementsFactory.TargetedSpaceSuccess = true currentApp = models.Application{} currentApp.Name = "my-app" currentApp.State = "started" currentApp.Guid = "my-app-guid" currentApp.EnableSsh = true currentApp.Diego = true requirementsFactory.Application = currentApp }) Describe("Error getting required info to run ssh", func() { var ( testServer *httptest.Server handler *testnet.TestHandler ) AfterEach(func() { testServer.Close() })
It("fails with usage when the app cannot be found", func() { appRepo.ReadReturns.Error = errors.NewModelNotFoundError("app", "hocus-pocus") runCommand("hocus-pocus") Expect(ui.Outputs).To(ContainSubstrings( []string{"FAILED"}, []string{"not found"}, )) }) Context("when the app is found", func() { BeforeEach(func() { app = models.Application{} app.Name = "my-app" app.Guid = "the-app-guid" appRepo.ReadReturns.App = app }) It("sends a restage request", func() { runCommand("my-app") Expect(appRepo.CreateRestageRequestArgs.AppGuid).To(Equal("the-app-guid")) Expect(ui.Outputs).To(ContainSubstrings( []string{"Restaging app", "my-app", "my-org", "my-space", "my-user"}, )) }) It("resets app's PackageState", func() { runCommand("my-app") Expect(stagingWatcher.watched.PackageState).ToNot(Equal("STAGED"))
callPush("non-existant-app") Expect(ui.Outputs).To(ContainSubstrings([]string{"FAILED"})) Expect(len(appRepo.CreateAppParams)).To(Equal(0)) }) }) }) }) Describe("re-pushing an existing app", func() { var existingApp models.Application BeforeEach(func() { existingApp = models.Application{} existingApp.Name = "existing-app" existingApp.Guid = "existing-app-guid" existingApp.Command = "unicorn -c config/unicorn.rb -D" existingApp.EnvironmentVars = map[string]string{ "crazy": "pants", "FOO": "NotYoBaz", "foo": "manchu", } appRepo.ReadReturns.App = existingApp appRepo.UpdateAppResult = existingApp }) It("resets the app's buildpack when the -b flag is provided as 'default'", func() { callPush("-b", "default", "existing-app") Expect(*appRepo.UpdateParams.BuildpackUrl).To(Equal("")) })
Describe("InteractiveSession", func() { var opts *options.SSHOptions var sessionError error var interactiveSessionInvoker func(secureShell sshCmd.SecureShell) BeforeEach(func() { sshEndpoint = "ssh.example.com:22" opts = &options.SSHOptions{ AppName: "app-name", Index: 2, } currentApp.State = "STARTED" currentApp.Diego = true currentApp.Guid = "app-guid" token = "bearer token" interactiveSessionInvoker = func(secureShell sshCmd.SecureShell) { sessionError = secureShell.InteractiveSession() } }) JustBeforeEach(func() { connectErr := secureShell.Connect(opts) Expect(connectErr).NotTo(HaveOccurred()) interactiveSessionInvoker(secureShell) }) It("dials the correct endpoint as the correct user", func() { Expect(fakeSecureDialer.DialCallCount()).To(Equal(1))
It("fails requirements when not logged in", func() { cmd := NewBindService(&testterm.FakeUI{}, testconfig.NewRepository(), &testapi.FakeServiceBindingRepo{}) Expect(testcmd.RunCommand(cmd, []string{"service", "app"}, requirementsFactory)).To(BeFalse()) }) Context("when logged in", func() { BeforeEach(func() { requirementsFactory.LoginSuccess = true }) It("binds a service instance to an app", func() { app := models.Application{} app.Name = "my-app" app.Guid = "my-app-guid" serviceInstance := models.ServiceInstance{} serviceInstance.Name = "my-service" serviceInstance.Guid = "my-service-guid" requirementsFactory.Application = app requirementsFactory.ServiceInstance = serviceInstance serviceBindingRepo := &testapi.FakeServiceBindingRepo{} ui := callBindService([]string{"my-app", "my-service"}, requirementsFactory, serviceBindingRepo) Expect(requirementsFactory.ApplicationName).To(Equal("my-app")) Expect(requirementsFactory.ServiceInstanceName).To(Equal("my-service")) Expect(ui.Outputs).To(ContainSubstrings( []string{"Binding service", "my-service", "my-app", "my-org", "my-space", "my-user"}, []string{"OK"}, []string{"TIP"},
var _ = Describe("delete app command", func() { var ( cmd *DeleteApp ui *testterm.FakeUI app models.Application configRepo configuration.ReadWriter appRepo *testapi.FakeApplicationRepository routeRepo *testapi.FakeRouteRepository requirementsFactory *testreq.FakeReqFactory ) BeforeEach(func() { app = models.Application{} app.Name = "app-to-delete" app.Guid = "app-to-delete-guid" ui = &testterm.FakeUI{} appRepo = &testapi.FakeApplicationRepository{} routeRepo = &testapi.FakeRouteRepository{} requirementsFactory = &testreq.FakeReqFactory{} configRepo = testconfig.NewRepositoryWithDefaults() cmd = NewDeleteApp(ui, configRepo, appRepo, routeRepo) }) runCommand := func(args ...string) { testcmd.RunCommand(cmd, args, requirementsFactory) } It("fails requirements when not logged in", func() {
}) It("should output whatever greg sez", func() { runCommand("my-app") Expect(ui.Outputs).To(ContainSubstrings( []string{"last uploaded", "unknown"}, )) }) }) }) Describe("when the app is not running", func() { BeforeEach(func() { application := models.Application{} application.Name = "my-app" application.Guid = "my-app-guid" application.State = "stopped" application.InstanceCount = 2 application.RunningInstances = 0 application.Memory = 256 now := time.Now() application.PackageUpdatedAt = &now appSummaryRepo.GetSummarySummary = application requirementsFactory.Application = application updateCommandDependency(false) }) It("displays nice output when the app is stopped", func() { appSummaryRepo.GetSummaryErrorCode = errors.APP_STOPPED
}) Describe("creating applications", func() { It("makes the right request", func() { ts, handler, repo := createAppRepo([]testnet.TestRequest{createApplicationRequest}) defer ts.Close() params := defaultAppParams() createdApp, apiErr := repo.Create(params) Expect(handler).To(HaveAllRequestsCalled()) Expect(apiErr).NotTo(HaveOccurred()) app := models.Application{} app.Name = "my-cool-app" app.Guid = "my-cool-app-guid" Expect(createdApp).To(Equal(app)) }) It("omits fields that are not set", func() { request := testapi.NewCloudControllerTestRequest(testnet.TestRequest{ Method: "POST", Path: "/v2/apps", Matcher: testnet.RequestBodyMatcher(`{"name":"my-cool-app","instances":3,"memory":2048,"disk_quota":512,"space_guid":"some-space-guid"}`), Response: testnet.TestResponse{Status: http.StatusCreated, Body: createApplicationResponse}, }) ts, handler, repo := createAppRepo([]testnet.TestRequest{request}) defer ts.Close() params := defaultAppParams()
appRepo := &testapi.FakeApplicationRepository{} cmd := NewStop(new(testterm.FakeUI), testconfig.NewRepository(), appRepo) testcmd.RunCommand(cmd, []string{"some-app-name"}, requirementsFactory) Expect(testcmd.CommandDidPassRequirements).To(BeFalse()) }) Context("when logged in", func() { BeforeEach(func() { requirementsFactory.LoginSuccess = true }) It("fails with usage when the app name is not given", func() { app := models.Application{} app.Name = "my-app" app.Guid = "my-app-guid" appRepo := &testapi.FakeApplicationRepository{} appRepo.ReadReturns.App = app ui := callStop([]string{}, requirementsFactory, appRepo) Expect(ui.FailedWithUsage).To(BeTrue()) }) It("stops the app with the given name", func() { app := models.Application{} app.Name = "my-app" app.Guid = "my-app-guid" appRepo := &testapi.FakeApplicationRepository{} appRepo.ReadReturns.App = app args := []string{"my-app"} requirementsFactory.Application = app
cmd = &route.MapRoute{} cmd.SetDependency(deps, false) flagContext = flags.NewFlagContext(cmd.MetaData().Flags) factory = &fakerequirements.FakeFactory{} loginRequirement = &passingRequirement{Name: "login-requirement"} factory.NewLoginRequirementReturns(loginRequirement) applicationRequirement = &fakerequirements.FakeApplicationRequirement{} factory.NewApplicationRequirementReturns(applicationRequirement) fakeApplication := models.Application{} fakeApplication.Guid = "fake-app-guid" applicationRequirement.GetApplicationReturns(fakeApplication) domainRequirement = &fakerequirements.FakeDomainRequirement{} factory.NewDomainRequirementReturns(domainRequirement) fakeDomain = models.DomainFields{ Guid: "fake-domain-guid", Name: "fake-domain-name", } domainRequirement.GetDomainReturns(fakeDomain) minAPIVersionRequirement = &passingRequirement{Name: "min-api-version-requirement"} factory.NewMinAPIVersionRequirementReturns(minAPIVersionRequirement) })
models.RouteSummary{ Host: "app1", Domain: models.DomainFields{ Name: "example.com", }, }} app2Routes := []models.RouteSummary{ models.RouteSummary{ Host: "app2", Domain: models.DomainFields{Name: "cfapps.io"}, }} app := models.Application{} app.Name = "Application-1" app.Guid = "Application-1-guid" app.State = "started" app.RunningInstances = 1 app.InstanceCount = 1 app.Memory = 512 app.DiskQuota = 1024 app.Routes = app1Routes app2 := models.Application{} app2.Name = "Application-2" app2.Guid = "Application-2-guid" app2.State = "started" app2.RunningInstances = 1 app2.InstanceCount = 2 app2.Memory = 256 app2.DiskQuota = 1024
It("fails with usage when called without an app name", func() { passed := runCommand() Expect(ui.FailedWithUsage).To(BeTrue()) Expect(passed).To(BeFalse()) }) It("lists events given an app name", func() { earlierTimestamp, err := time.Parse(TIMESTAMP_FORMAT, "1999-12-31T23:59:11.00-0000") Expect(err).NotTo(HaveOccurred()) timestamp, err := time.Parse(TIMESTAMP_FORMAT, "2000-01-01T00:01:11.00-0000") Expect(err).NotTo(HaveOccurred()) app := models.Application{} app.Name = "my-app" app.Guid = "my-app-guid" requirementsFactory.Application = app eventsRepo.RecentEventsReturns([]models.EventFields{ { Guid: "event-guid-1", Name: "app crashed", Timestamp: earlierTimestamp, Description: "reason: app instance exited, exit_status: 78", ActorName: "George Clooney", }, { Guid: "event-guid-2", Name: "app crashed", Timestamp: timestamp, Description: "reason: app instance was stopped, exit_status: 77",
}) // yes, we're aware that the args here should probably be provided in a different order // erg: app-name -p some/path some-extra-arg // but the test infrastructure for parsing args and flags is sorely lacking It("fails when provided too many args", func() { Expect(callPush("-p", "path", "too-much", "app-name")).To(BeFalse()) }) }) Describe("when pushing a new app", func() { BeforeEach(func() { appRepo.ReadReturns(models.Application{}, errors.NewModelNotFoundError("App", "the-app")) appRepo.CreateStub = func(params models.AppParams) (models.Application, error) { a := models.Application{} a.Guid = *params.Name + "-guid" a.Name = *params.Name a.State = "stopped" return a, nil } zipper.ZipReturns(nil) zipper.GetZipSizeReturns(9001, nil) actor.GatherFilesReturns(nil, true, nil) actor.UploadAppReturns(nil) }) Context("when the default route for the app already exists", func() { BeforeEach(func() { route := models.Route{}
BeforeEach(func() { appName = "fake-app-name" ui = &testterm.FakeUI{} appRepo = &testApplication.FakeApplicationRepository{} req = requirements.NewDEAApplicationRequirement(appName, ui, appRepo) }) Describe("GetApplication", func() { It("returns an empty application", func() { Expect(req.GetApplication()).To(Equal(models.Application{})) }) Context("when the requirement has been executed", func() { BeforeEach(func() { app := models.Application{} app.Guid = "fake-app-guid" appRepo.ReadReturns(app, nil) req.Execute() }) It("returns the application", func() { Expect(req.GetApplication().Guid).To(Equal("fake-app-guid")) }) }) }) Describe("Execute", func() { Context("when the returned application is a Diego application", func() { BeforeEach(func() { app := models.Application{}
flagContext = flags.NewFlagContext(cmd.MetaData().Flags) factory = &fakerequirements.FakeFactory{} loginRequirement = &passingRequirement{Name: "login-requirement"} factory.NewLoginRequirementReturns(loginRequirement) targetedSpaceRequirement = &passingRequirement{} factory.NewTargetedSpaceRequirementReturns(targetedSpaceRequirement) deaApplicationRequirement = &fakerequirements.FakeDEAApplicationRequirement{} factory.NewDEAApplicationRequirementReturns(deaApplicationRequirement) app := models.Application{} app.InstanceCount = 1 app.Guid = "app-guid" app.Name = "app-name" deaApplicationRequirement.GetApplicationReturns(app) }) Describe("Requirements", func() { Context("when not provided one or two args", func() { BeforeEach(func() { flagContext.Parse("app-name", "the-path", "extra-arg") }) It("fails with usage", func() { Expect(func() { cmd.Requirements(factory, flagContext) }).To(Panic()) Expect(ui.Outputs).To(ContainSubstrings( []string{"FAILED"}, []string{"Incorrect Usage. Requires an argument"},