func (repo cloudControllerSecurityGroupRepo) Read(name string) (models.SecurityGroup, error) { path := fmt.Sprintf("/v2/security_groups?q=%s", url.QueryEscape("name:"+name)) group := models.SecurityGroup{} foundGroup := false err := repo.gateway.ListPaginatedResources( repo.config.APIEndpoint(), path, resources.SecurityGroupResource{}, func(resource interface{}) bool { if asgr, ok := resource.(resources.SecurityGroupResource); ok { group = asgr.ToModel() foundGroup = true } return false }, ) if err != nil { return group, err } if !foundGroup { return group, errors.NewModelNotFoundError("security group", name) } err = repo.gateway.ListPaginatedResources( repo.config.APIEndpoint(), group.SpaceURL+"?inline-relations-depth=1", resources.SpaceResource{}, func(resource interface{}) bool { if asgr, ok := resource.(resources.SpaceResource); ok { group.Spaces = append(group.Spaces, asgr.ToModel()) return true } return false }, ) return group, err }
requirementsFactory.NewLoginRequirementReturns(requirements.Failing{Message: "not logged in"}) Expect(runCommand("name")).To(BeFalse()) }) It("fails with usage when a name is not provided", func() { runCommand() Expect(ui.Outputs()).To(ContainSubstrings( []string{"Incorrect Usage", "Requires", "argument"}, )) }) }) Context("when the user is logged in and provides the name of a group", func() { BeforeEach(func() { requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) group := models.SecurityGroup{} group.GUID = "being-a-guid" group.Name = "security-group-name" fakeSecurityGroupRepo.ReadReturns(group, nil) }) JustBeforeEach(func() { runCommand("security-group-name") }) It("Describes what it is doing to the user", func() { Expect(ui.Outputs()).To(ContainSubstrings( []string{"Binding", "security-group-name", "as", "my-user"}, []string{"OK"}, []string{"TIP: Changes will not apply to existing running applications until they are restarted."}, ))
It("fails and tells the user", func() { runCommand("sec group", "org-name", "space-name") name, orgGUID := fakeSpaceRepo.FindByNameInOrgArgsForCall(0) Expect(name).To(Equal("space-name")) Expect(orgGUID).To(Equal("org-guid")) Expect(ui.Outputs()).To(ContainSubstrings( []string{"FAILED"}, []string{"Space", "space-name", "not found"}, )) }) }) Context("everything is hunky dory", func() { var securityGroup models.SecurityGroup var org models.Organization BeforeEach(func() { org = models.Organization{} org.Name = "org-name" org.GUID = "org-guid" fakeOrgRepo.FindByNameReturns(org, nil) space := models.Space{} space.Name = "space-name" space.GUID = "space-guid" fakeSpaceRepo.FindByNameInOrgReturns(space, nil) securityGroup = models.SecurityGroup{} securityGroup.Name = "security-group"
It("fails with usage when a name is not provided", func() { runCommand() Expect(ui.Outputs()).To(ContainSubstrings( []string{"Incorrect Usage", "Requires", "argument"}, )) }) }) Context("when the user is logged in and provides the name of a group", func() { BeforeEach(func() { requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) }) Context("security group exists", func() { BeforeEach(func() { group := models.SecurityGroup{} group.GUID = "just-pretend-this-is-a-guid" group.Name = "a-security-group-name" fakeSecurityGroupRepo.ReadReturns(group, nil) }) JustBeforeEach(func() { runCommand("a-security-group-name") }) It("unbinds the group from the default staging group set", func() { Expect(ui.Outputs()).To(ContainSubstrings( []string{"Unbinding", "security group", "a-security-group-name", "my-user"}, []string{"OK"}, ))