github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/cf/commands/securitygroup/bind_security_group_test.go (about)

     1  package securitygroup_test
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/cf/api/organizations/organizationsfakes"
     5  	"code.cloudfoundry.org/cli/cf/api/securitygroups/securitygroupsfakes"
     6  	"code.cloudfoundry.org/cli/cf/api/securitygroups/spaces/spacesfakes"
     7  	spacesapifakes "code.cloudfoundry.org/cli/cf/api/spaces/spacesfakes"
     8  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
     9  	"code.cloudfoundry.org/cli/cf/errors"
    10  	"code.cloudfoundry.org/cli/cf/models"
    11  	"code.cloudfoundry.org/cli/cf/requirements"
    12  	"code.cloudfoundry.org/cli/cf/requirements/requirementsfakes"
    13  	testcmd "code.cloudfoundry.org/cli/cf/util/testhelpers/commands"
    14  	testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration"
    15  	testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal"
    16  
    17  	"code.cloudfoundry.org/cli/cf/commandregistry"
    18  	. "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers"
    19  	. "github.com/onsi/ginkgo"
    20  	. "github.com/onsi/gomega"
    21  )
    22  
    23  var _ = Describe("bind-security-group command", func() {
    24  	var (
    25  		ui                    *testterm.FakeUI
    26  		configRepo            coreconfig.Repository
    27  		fakeSecurityGroupRepo *securitygroupsfakes.FakeSecurityGroupRepo
    28  		requirementsFactory   *requirementsfakes.FakeFactory
    29  		fakeSpaceRepo         *spacesapifakes.FakeSpaceRepository
    30  		fakeOrgRepo           *organizationsfakes.FakeOrganizationRepository
    31  		fakeSpaceBinder       *spacesfakes.FakeSecurityGroupSpaceBinder
    32  		deps                  commandregistry.Dependency
    33  	)
    34  
    35  	updateCommandDependency := func(pluginCall bool) {
    36  		deps.UI = ui
    37  		deps.RepoLocator = deps.RepoLocator.SetSpaceRepository(fakeSpaceRepo)
    38  		deps.RepoLocator = deps.RepoLocator.SetOrganizationRepository(fakeOrgRepo)
    39  		deps.RepoLocator = deps.RepoLocator.SetSecurityGroupRepository(fakeSecurityGroupRepo)
    40  		deps.RepoLocator = deps.RepoLocator.SetSecurityGroupSpaceBinder(fakeSpaceBinder)
    41  		deps.Config = configRepo
    42  		commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("bind-security-group").SetDependency(deps, pluginCall))
    43  	}
    44  
    45  	BeforeEach(func() {
    46  		ui = &testterm.FakeUI{}
    47  		fakeOrgRepo = new(organizationsfakes.FakeOrganizationRepository)
    48  		fakeSpaceRepo = new(spacesapifakes.FakeSpaceRepository)
    49  		requirementsFactory = new(requirementsfakes.FakeFactory)
    50  		fakeSecurityGroupRepo = new(securitygroupsfakes.FakeSecurityGroupRepo)
    51  		configRepo = testconfig.NewRepositoryWithDefaults()
    52  		fakeSpaceBinder = new(spacesfakes.FakeSecurityGroupSpaceBinder)
    53  	})
    54  
    55  	runCommand := func(args ...string) bool {
    56  		return testcmd.RunCLICommand("bind-security-group", args, requirementsFactory, updateCommandDependency, false, ui)
    57  	}
    58  
    59  	Describe("requirements", func() {
    60  		It("fails when the user is not logged in", func() {
    61  			requirementsFactory.NewLoginRequirementReturns(requirements.Failing{Message: "not logged in"})
    62  			Expect(runCommand("my-craaaaaazy-security-group", "my-org", "my-space")).To(BeFalse())
    63  		})
    64  
    65  		It("succeeds when the user is logged in", func() {
    66  			requirementsFactory.NewLoginRequirementReturns(requirements.Passing{})
    67  
    68  			Expect(runCommand("my-craaaaaazy-security-group", "my-org", "my-space")).To(BeTrue())
    69  		})
    70  
    71  		Describe("number of arguments", func() {
    72  			Context("wrong number of arguments", func() {
    73  				It("fails with usage when not provided the name of a security group, org, and space", func() {
    74  					requirementsFactory.NewLoginRequirementReturns(requirements.Passing{})
    75  					runCommand("one fish", "two fish", "three fish", "purple fish")
    76  
    77  					Expect(ui.Outputs()).To(ContainSubstrings(
    78  						[]string{"Incorrect Usage", "Requires", "arguments"},
    79  					))
    80  				})
    81  			})
    82  
    83  			Context("providing securitygroup and org", func() {
    84  				It("should not fail", func() {
    85  					requirementsFactory.NewLoginRequirementReturns(requirements.Passing{})
    86  
    87  					Expect(runCommand("my-craaaaaazy-security-group", "my-org")).To(BeTrue())
    88  				})
    89  			})
    90  		})
    91  	})
    92  
    93  	Context("when the user is logged in and provides the name of a security group", func() {
    94  		BeforeEach(func() {
    95  			requirementsFactory.NewLoginRequirementReturns(requirements.Passing{})
    96  		})
    97  
    98  		Context("when a security group with that name does not exist", func() {
    99  			BeforeEach(func() {
   100  				fakeSecurityGroupRepo.ReadReturns(models.SecurityGroup{}, errors.NewModelNotFoundError("security group", "my-nonexistent-security-group"))
   101  			})
   102  
   103  			It("fails and tells the user", func() {
   104  				runCommand("my-nonexistent-security-group", "my-org", "my-space")
   105  
   106  				Expect(fakeSecurityGroupRepo.ReadArgsForCall(0)).To(Equal("my-nonexistent-security-group"))
   107  				Expect(ui.Outputs()).To(ContainSubstrings(
   108  					[]string{"FAILED"},
   109  					[]string{"security group", "my-nonexistent-security-group", "not found"},
   110  				))
   111  			})
   112  		})
   113  
   114  		Context("when the org does not exist", func() {
   115  			BeforeEach(func() {
   116  				fakeOrgRepo.FindByNameReturns(models.Organization{}, errors.New("Org org not found"))
   117  			})
   118  
   119  			It("fails and tells the user", func() {
   120  				runCommand("sec group", "org", "space")
   121  
   122  				Expect(fakeOrgRepo.FindByNameArgsForCall(0)).To(Equal("org"))
   123  				Expect(ui.Outputs()).To(ContainSubstrings(
   124  					[]string{"FAILED"},
   125  					[]string{"Org", "org", "not found"},
   126  				))
   127  			})
   128  		})
   129  
   130  		Context("when the space does not exist", func() {
   131  			BeforeEach(func() {
   132  				org := models.Organization{}
   133  				org.Name = "org-name"
   134  				org.GUID = "org-guid"
   135  				fakeOrgRepo.ListOrgsReturns([]models.Organization{org}, nil)
   136  				fakeOrgRepo.FindByNameReturns(org, nil)
   137  				fakeSpaceRepo.FindByNameInOrgReturns(models.Space{}, errors.NewModelNotFoundError("Space", "space-name"))
   138  			})
   139  
   140  			It("fails and tells the user", func() {
   141  				runCommand("sec group", "org-name", "space-name")
   142  
   143  				name, orgGUID := fakeSpaceRepo.FindByNameInOrgArgsForCall(0)
   144  				Expect(name).To(Equal("space-name"))
   145  				Expect(orgGUID).To(Equal("org-guid"))
   146  				Expect(ui.Outputs()).To(ContainSubstrings(
   147  					[]string{"FAILED"},
   148  					[]string{"Space", "space-name", "not found"},
   149  				))
   150  			})
   151  		})
   152  
   153  		Context("everything is hunky dory", func() {
   154  			var securityGroup models.SecurityGroup
   155  			var org models.Organization
   156  
   157  			BeforeEach(func() {
   158  				org = models.Organization{}
   159  				org.Name = "org-name"
   160  				org.GUID = "org-guid"
   161  				fakeOrgRepo.FindByNameReturns(org, nil)
   162  
   163  				space := models.Space{}
   164  				space.Name = "space-name"
   165  				space.GUID = "space-guid"
   166  				fakeSpaceRepo.FindByNameInOrgReturns(space, nil)
   167  
   168  				securityGroup = models.SecurityGroup{}
   169  				securityGroup.Name = "security-group"
   170  				securityGroup.GUID = "security-group-guid"
   171  				fakeSecurityGroupRepo.ReadReturns(securityGroup, nil)
   172  			})
   173  
   174  			Context("when space is provided", func() {
   175  				JustBeforeEach(func() {
   176  					runCommand("security-group", "org-name", "space-name")
   177  				})
   178  
   179  				It("assigns the security group to the space", func() {
   180  					secGroupGUID, spaceGUID := fakeSpaceBinder.BindSpaceArgsForCall(0)
   181  					Expect(secGroupGUID).To(Equal("security-group-guid"))
   182  					Expect(spaceGUID).To(Equal("space-guid"))
   183  				})
   184  
   185  				It("describes what it is doing for the user's benefit", func() {
   186  					Expect(ui.Outputs()).To(ContainSubstrings(
   187  						[]string{"Assigning security group security-group to space space-name in org org-name as my-user"},
   188  						[]string{"OK"},
   189  						[]string{"TIP: Changes will not apply to existing running applications until they are restarted."},
   190  					))
   191  				})
   192  			})
   193  
   194  			Context("when no space is provided", func() {
   195  				var spaces []models.Space
   196  				BeforeEach(func() {
   197  					spaces := []models.Space{
   198  						{
   199  							SpaceFields: models.SpaceFields{
   200  								GUID: "space-guid-1",
   201  								Name: "space-name-1",
   202  							},
   203  						},
   204  						{
   205  							SpaceFields: models.SpaceFields{
   206  								GUID: "space-guid-2",
   207  								Name: "space-name-2",
   208  							},
   209  						},
   210  					}
   211  
   212  					fakeSpaceRepo.ListSpacesFromOrgStub = func(orgGUID string, callback func(models.Space) bool) error {
   213  						Expect(orgGUID).To(Equal(org.GUID))
   214  
   215  						for _, space := range spaces {
   216  							Expect(callback(space)).To(BeTrue())
   217  						}
   218  
   219  						return nil
   220  					}
   221  				})
   222  
   223  				It("binds the security group to all of the org's spaces", func() {
   224  					runCommand("sec group", "org")
   225  
   226  					Expect(fakeSpaceRepo.ListSpacesFromOrgCallCount()).Should(Equal(1))
   227  					Expect(fakeSpaceBinder.BindSpaceCallCount()).Should(Equal(2))
   228  
   229  					for i, space := range spaces {
   230  						securityGroupGUID, spaceGUID := fakeSpaceBinder.BindSpaceArgsForCall(i)
   231  						Expect(securityGroupGUID).To(Equal(securityGroup.GUID))
   232  						Expect(spaceGUID).To(Equal(space.GUID))
   233  					}
   234  				})
   235  			})
   236  		})
   237  	})
   238  })