github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/cf/commands/organization/create_org_test.go (about) 1 package organization_test 2 3 import ( 4 "code.cloudfoundry.org/cli/cf/commands/user/userfakes" 5 "code.cloudfoundry.org/cli/cf/errors" 6 "code.cloudfoundry.org/cli/cf/models" 7 "code.cloudfoundry.org/cli/cf/requirements" 8 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 9 10 "code.cloudfoundry.org/cli/cf/api/featureflags/featureflagsfakes" 11 "code.cloudfoundry.org/cli/cf/api/organizations/organizationsfakes" 12 "code.cloudfoundry.org/cli/cf/api/quotas/quotasfakes" 13 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 14 testcmd "code.cloudfoundry.org/cli/util/testhelpers/commands" 15 testconfig "code.cloudfoundry.org/cli/util/testhelpers/configuration" 16 testterm "code.cloudfoundry.org/cli/util/testhelpers/terminal" 17 18 "code.cloudfoundry.org/cli/cf/commandregistry" 19 . "code.cloudfoundry.org/cli/util/testhelpers/matchers" 20 . "github.com/onsi/ginkgo" 21 . "github.com/onsi/gomega" 22 ) 23 24 var _ = Describe("create-org command", func() { 25 var ( 26 config coreconfig.Repository 27 ui *testterm.FakeUI 28 requirementsFactory *requirementsfakes.FakeFactory 29 orgRepo *organizationsfakes.FakeOrganizationRepository 30 quotaRepo *quotasfakes.FakeQuotaRepository 31 deps commandregistry.Dependency 32 orgRoleSetter *userfakes.FakeOrgRoleSetter 33 flagRepo *featureflagsfakes.FakeFeatureFlagRepository 34 OriginalCommand commandregistry.Command 35 ) 36 37 updateCommandDependency := func(pluginCall bool) { 38 deps.UI = ui 39 deps.RepoLocator = deps.RepoLocator.SetOrganizationRepository(orgRepo) 40 deps.RepoLocator = deps.RepoLocator.SetQuotaRepository(quotaRepo) 41 deps.RepoLocator = deps.RepoLocator.SetFeatureFlagRepository(flagRepo) 42 deps.Config = config 43 44 //inject fake 'command dependency' into registry 45 commandregistry.Register(orgRoleSetter) 46 47 commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("create-org").SetDependency(deps, pluginCall)) 48 } 49 50 BeforeEach(func() { 51 ui = &testterm.FakeUI{} 52 config = testconfig.NewRepositoryWithDefaults() 53 requirementsFactory = new(requirementsfakes.FakeFactory) 54 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 55 orgRepo = new(organizationsfakes.FakeOrganizationRepository) 56 quotaRepo = new(quotasfakes.FakeQuotaRepository) 57 flagRepo = new(featureflagsfakes.FakeFeatureFlagRepository) 58 config.SetAPIVersion("2.36.9") 59 60 orgRoleSetter = new(userfakes.FakeOrgRoleSetter) 61 //setup fakes to correctly interact with commandregistry 62 orgRoleSetter.SetDependencyStub = func(_ commandregistry.Dependency, _ bool) commandregistry.Command { 63 return orgRoleSetter 64 } 65 orgRoleSetter.MetaDataReturns(commandregistry.CommandMetadata{Name: "set-org-role"}) 66 67 //save original command and restore later 68 OriginalCommand = commandregistry.Commands.FindCommand("set-org-role") 69 }) 70 71 AfterEach(func() { 72 commandregistry.Register(OriginalCommand) 73 }) 74 75 runCommand := func(args ...string) bool { 76 return testcmd.RunCLICommand("create-org", args, requirementsFactory, updateCommandDependency, false, ui) 77 } 78 79 Describe("requirements", func() { 80 It("fails with usage when not provided exactly one arg", func() { 81 runCommand() 82 Expect(ui.Outputs()).To(ContainSubstrings( 83 []string{"Incorrect Usage", "Requires an argument"}, 84 )) 85 }) 86 87 It("fails when not logged in", func() { 88 requirementsFactory.NewLoginRequirementReturns(requirements.Failing{Message: "not logged in"}) 89 Expect(runCommand("my-org")).To(BeFalse()) 90 }) 91 }) 92 93 Context("when logged in and provided the name of an org to create", func() { 94 BeforeEach(func() { 95 orgRepo.CreateReturns(nil) 96 }) 97 98 It("creates an org", func() { 99 runCommand("my-org") 100 101 Expect(ui.Outputs()).To(ContainSubstrings( 102 []string{"Creating org", "my-org", "my-user"}, 103 []string{"OK"}, 104 []string{`TIP: Use 'cf target -o "my-org"' to target new org`}, 105 )) 106 Expect(orgRepo.CreateArgsForCall(0).Name).To(Equal("my-org")) 107 }) 108 109 It("fails and warns the user when the org already exists", func() { 110 err := errors.NewHTTPError(400, errors.OrganizationNameTaken, "org already exists") 111 orgRepo.CreateReturns(err) 112 runCommand("my-org") 113 114 Expect(ui.Outputs()).To(ContainSubstrings( 115 []string{"Creating org", "my-org"}, 116 []string{"OK"}, 117 []string{"my-org", "already exists"}, 118 )) 119 120 Expect(ui.Outputs()).NotTo(ContainSubstrings( 121 []string{`TIP: Use 'cf target -o "my-org"' to target new org`}, 122 )) 123 }) 124 125 Context("when CC api version supports assigning orgRole by name, and feature-flag 'set_roles_by_username' is enabled", func() { 126 BeforeEach(func() { 127 config.SetAPIVersion("2.37.0") 128 flagRepo.FindByNameReturns(models.FeatureFlag{ 129 Name: "set_roles_by_username", 130 Enabled: true, 131 }, nil) 132 orgRepo.FindByNameReturns(models.Organization{ 133 OrganizationFields: models.OrganizationFields{ 134 GUID: "my-org-guid", 135 }, 136 }, nil) 137 }) 138 139 It("assigns manager role to user", func() { 140 runCommand("my-org") 141 142 orgGUID, role, userGUID, userName := orgRoleSetter.SetOrgRoleArgsForCall(0) 143 144 Expect(orgRoleSetter.SetOrgRoleCallCount()).To(Equal(1)) 145 Expect(orgGUID).To(Equal("my-org-guid")) 146 Expect(role).To(Equal(models.RoleOrgManager)) 147 Expect(userGUID).To(Equal("")) 148 Expect(userName).To(Equal("my-user")) 149 }) 150 151 It("warns user about problem accessing feature-flag", func() { 152 flagRepo.FindByNameReturns(models.FeatureFlag{}, errors.New("error error error")) 153 154 runCommand("my-org") 155 156 Expect(orgRoleSetter.SetOrgRoleCallCount()).To(Equal(0)) 157 Expect(ui.Outputs()).To(ContainSubstrings( 158 []string{"Warning", "error error error"}, 159 )) 160 161 }) 162 163 It("fails on failing getting the guid of the newly created org", func() { 164 orgRepo.FindByNameReturns(models.Organization{}, errors.New("cannot get org guid")) 165 166 runCommand("my-org") 167 168 Expect(orgRoleSetter.SetOrgRoleCallCount()).To(Equal(0)) 169 Expect(ui.Outputs()).To(ContainSubstrings( 170 []string{"FAILED"}, 171 []string{"cannot get org guid"}, 172 )) 173 174 }) 175 176 It("fails on failing assigning org role to user", func() { 177 orgRoleSetter.SetOrgRoleReturns(errors.New("failed to assign role")) 178 179 runCommand("my-org") 180 181 Expect(orgRoleSetter.SetOrgRoleCallCount()).To(Equal(1)) 182 Expect(ui.Outputs()).To(ContainSubstrings( 183 []string{"Assigning role OrgManager to user my-user in org my-org ..."}, 184 []string{"FAILED"}, 185 []string{"failed to assign role"}, 186 )) 187 188 }) 189 }) 190 191 Context("when allowing a non-defualt quota", func() { 192 var ( 193 quota models.QuotaFields 194 ) 195 196 BeforeEach(func() { 197 quota = models.QuotaFields{ 198 Name: "non-default-quota", 199 GUID: "non-default-quota-guid", 200 } 201 }) 202 203 It("creates an org with a non-default quota", func() { 204 quotaRepo.FindByNameReturns(quota, nil) 205 runCommand("-q", "non-default-quota", "my-org") 206 207 Expect(quotaRepo.FindByNameArgsForCall(0)).To(Equal("non-default-quota")) 208 Expect(orgRepo.CreateArgsForCall(0).QuotaDefinition.GUID).To(Equal("non-default-quota-guid")) 209 Expect(ui.Outputs()).To(ContainSubstrings( 210 []string{"Creating org", "my-org"}, 211 []string{"OK"}, 212 )) 213 }) 214 215 It("fails and warns the user when the quota cannot be found", func() { 216 quotaRepo.FindByNameReturns(models.QuotaFields{}, errors.New("Could not find quota")) 217 runCommand("-q", "non-default-quota", "my-org") 218 219 Expect(ui.Outputs()).To(ContainSubstrings( 220 []string{"Creating org", "my-org"}, 221 []string{"Could not find quota"}, 222 )) 223 }) 224 }) 225 }) 226 })