github.com/cloudfoundry/cli@v7.1.0+incompatible/util/ui/ui_for_push_test.go (about) 1 package ui_test 2 3 import ( 4 "regexp" 5 6 "code.cloudfoundry.org/cli/types" 7 "code.cloudfoundry.org/cli/util/configv3" 8 . "code.cloudfoundry.org/cli/util/ui" 9 "code.cloudfoundry.org/cli/util/ui/uifakes" 10 . "github.com/onsi/ginkgo" 11 . "github.com/onsi/gomega" 12 . "github.com/onsi/gomega/gbytes" 13 ) 14 15 var _ = Describe("UI", func() { 16 var ( 17 ui *UI 18 fakeConfig *uifakes.FakeConfig 19 out *Buffer 20 ) 21 22 BeforeEach(func() { 23 fakeConfig = new(uifakes.FakeConfig) 24 fakeConfig.ColorEnabledReturns(configv3.ColorEnabled) 25 }) 26 27 JustBeforeEach(func() { 28 var err error 29 ui, err = NewUI(fakeConfig) 30 Expect(err).NotTo(HaveOccurred()) 31 32 out = NewBuffer() 33 ui.Out = out 34 ui.Err = NewBuffer() 35 }) 36 37 Describe("DisplayChangesForPush", func() { 38 It("alings all the string types", func() { 39 changeSet := []Change{ 40 { 41 Header: "h1", 42 CurrentValue: "old", 43 NewValue: "new", 44 }, 45 { 46 Header: "header2", 47 CurrentValue: "old", 48 NewValue: "old", 49 }, 50 { 51 Header: "header3", 52 CurrentValue: []string{"route2", "route1", "route4"}, 53 NewValue: []string{"route4", "route2", "route3"}, 54 }, 55 } 56 57 err := ui.DisplayChangesForPush(changeSet) 58 Expect(err).ToNot(HaveOccurred()) 59 60 Expect(out).To(Say("\x1b\\[31m\\-\\s+h1 old\x1b\\[0m")) 61 Expect(out).To(Say("\x1b\\[32m\\+\\s+h1 new\x1b\\[0m")) 62 Expect(out).To(Say("(?m)^\\s+header2 old")) 63 Expect(out).To(Say("(?m)^\\s+header3$")) 64 Expect(out).To(Say("\x1b\\[31m\\-\\s+route1\x1b\\[0m")) 65 Expect(out).To(Say("(?m)^\\s+route2$")) 66 Expect(out).To(Say("\x1b\\[32m\\+\\s+route3\x1b\\[0m")) 67 Expect(out).To(Say("(?m)^\\s+route4$")) 68 }) 69 }) 70 71 Describe("DisplayChangeForPush", func() { 72 Context("in english", func() { 73 When("passed strings for values", func() { 74 When("the values are *not* hidden", func() { 75 When("the values are not equal", func() { 76 When("both values are not empty", func() { 77 It("should display the header with differences", func() { 78 err := ui.DisplayChangeForPush("val", 2, false, "old", "new") 79 Expect(err).ToNot(HaveOccurred()) 80 Expect(out).To(Say("\x1b\\[31m\\-\\s+val old\x1b\\[0m")) 81 Expect(out).To(Say("\x1b\\[32m\\+\\s+val new\x1b\\[0m")) 82 }) 83 }) 84 85 When("the originalValue is empty", func() { 86 It("should display the header with the new value only", func() { 87 err := ui.DisplayChangeForPush("val", 2, false, "", "new") 88 Expect(err).ToNot(HaveOccurred()) 89 Expect(out).To(Say("\x1b\\[32m\\+\\s+val new\x1b\\[0m")) 90 91 err = ui.DisplayChangeForPush("val", 2, false, "", "new") 92 Expect(err).ToNot(HaveOccurred()) 93 Expect(out).ToNot(Say("\x1b\\[31m\\-\\s+val old\x1b\\[0m")) 94 }) 95 }) 96 97 When("the newValue is empty", func() { 98 It("should display the header with the new value only", func() { 99 err := ui.DisplayChangeForPush("val", 2, false, "old", "") 100 Expect(err).ToNot(HaveOccurred()) 101 Expect(out).To(Say("\x1b\\[31m\\-\\s+val old\x1b\\[0m")) 102 Expect(out).ToNot(Say("\x1b\\[32m\\+\\s+val \x1b\\[0m")) 103 }) 104 }) 105 }) 106 107 When("the values are the equal", func() { 108 It("should display the header without differences", func() { 109 err := ui.DisplayChangeForPush("val", 2, false, "old", "old") 110 Expect(err).ToNot(HaveOccurred()) 111 Expect(out).To(Say(`(?m)^\s+val old$`)) 112 }) 113 }) 114 115 When("the values are a different type", func() { 116 It("should return an ErrValueMissmatch", func() { 117 err := ui.DisplayChangeForPush("asdf", 2, false, "asdf", 7) 118 Expect(err).To(MatchError(ErrValueMissmatch)) 119 }) 120 }) 121 }) 122 123 When("the values are hidden", func() { 124 When("the values are not equal", func() { 125 When("the originalValue is not empty", func() { 126 It("should display the header with differences", func() { 127 err := ui.DisplayChangeForPush("val", 2, true, "old", "new") 128 Expect(err).ToNot(HaveOccurred()) 129 Expect(out).To(Say("\x1b\\[31m\\-\\s+val %s\x1b\\[0m", regexp.QuoteMeta(RedactedValue))) 130 Expect(out).To(Say("\x1b\\[32m\\+\\s+val %s\x1b\\[0m", regexp.QuoteMeta(RedactedValue))) 131 }) 132 }) 133 134 When("the originalValue is empty", func() { 135 It("should display the header with the new value only", func() { 136 err := ui.DisplayChangeForPush("val", 2, true, "", "new") 137 Expect(err).ToNot(HaveOccurred()) 138 Expect(out).To(Say("\x1b\\[32m\\+\\s+val %s\x1b\\[0m", regexp.QuoteMeta(RedactedValue))) 139 140 err = ui.DisplayChangeForPush("val", 2, true, "", "new") 141 Expect(err).ToNot(HaveOccurred()) 142 Expect(out).ToNot(Say("\x1b\\[31m\\-\\s+val %s\x1b\\[0m", regexp.QuoteMeta(RedactedValue))) 143 }) 144 }) 145 }) 146 147 When("the values are the equal", func() { 148 It("should display the header without differences", func() { 149 err := ui.DisplayChangeForPush("val", 2, true, "old", "old") 150 Expect(err).ToNot(HaveOccurred()) 151 Expect(out).To(Say(`(?m)^\s+val %s`, regexp.QuoteMeta(RedactedValue))) 152 }) 153 }) 154 155 When("the values are a different type", func() { 156 It("should return an ErrValueMissmatch", func() { 157 err := ui.DisplayChangeForPush("asdf", 2, true, "asdf", 7) 158 Expect(err).To(MatchError(ErrValueMissmatch)) 159 }) 160 }) 161 }) 162 }) 163 164 When("passed list of strings for values", func() { 165 It("should display the header with sorted differences", func() { 166 old := []string{"route2", "route1", "route4"} 167 new := []string{"route4", "route2", "route3"} 168 err := ui.DisplayChangeForPush("val", 2, false, old, new) 169 Expect(err).ToNot(HaveOccurred()) 170 Expect(out).To(Say(`\s+val`)) 171 Expect(out).To(Say("\x1b\\[31m\\-\\s+route1\x1b\\[0m")) 172 Expect(out).To(Say(`(?m)^\s+route2$`)) 173 Expect(out).To(Say("\x1b\\[32m\\+\\s+route3\x1b\\[0m")) 174 Expect(out).To(Say(`(?m)^\s+route4$`)) 175 }) 176 177 When("the values are a different type", func() { 178 It("should return an ErrValueMissmatch", func() { 179 err := ui.DisplayChangeForPush("asdf", 2, false, []string{"route4", "route2", "route3"}, 7) 180 Expect(err).To(MatchError(ErrValueMissmatch)) 181 }) 182 }) 183 184 When("both sets are empty", func() { 185 It("does not display anything", func() { 186 var old []string 187 new := []string{} 188 err := ui.DisplayChangeForPush("val", 2, false, old, new) 189 Expect(err).ToNot(HaveOccurred()) 190 Expect(out).ToNot(Say(`\s+val`)) 191 }) 192 }) 193 }) 194 195 When("passed ints for values", func() { 196 When("the values are not equal", func() { 197 When("the originalValue is not empty", func() { 198 It("should display the header with differences", func() { 199 err := ui.DisplayChangeForPush("val", 2, false, 1, 2) 200 Expect(err).ToNot(HaveOccurred()) 201 Expect(out).To(Say("\x1b\\[31m\\-\\s+val 1\x1b\\[0m")) 202 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 2\x1b\\[0m")) 203 }) 204 }) 205 206 When("the originalValue is zero", func() { 207 It("should display the header with the new value only", func() { 208 err := ui.DisplayChangeForPush("val", 2, false, 0, 1) 209 Expect(err).ToNot(HaveOccurred()) 210 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 1\x1b\\[0m")) 211 }) 212 }) 213 }) 214 215 When("the values are the equal", func() { 216 It("should display the header without differences", func() { 217 err := ui.DisplayChangeForPush("val", 2, false, 3, 3) 218 Expect(err).ToNot(HaveOccurred()) 219 Expect(out).To(Say(`(?m)^\s+val 3$`)) 220 }) 221 }) 222 223 When("the values are a different type", func() { 224 It("should return an ErrValueMissmatch", func() { 225 err := ui.DisplayChangeForPush("asdf", 2, false, 7, "asdf") 226 Expect(err).To(MatchError(ErrValueMissmatch)) 227 }) 228 }) 229 }) 230 231 When("passed NullInt for values", func() { 232 When("the values are not equal", func() { 233 When("the originalValue is not empty", func() { 234 It("should display the header with differences", func() { 235 err := ui.DisplayChangeForPush("val", 2, false, types.NullInt{ 236 Value: 1, 237 IsSet: true, 238 }, types.NullInt{ 239 Value: 2, 240 IsSet: true, 241 }) 242 Expect(err).ToNot(HaveOccurred()) 243 Expect(out).To(Say("\x1b\\[31m\\-\\s+val 1\x1b\\[0m")) 244 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 2\x1b\\[0m")) 245 }) 246 }) 247 248 When("the originalValue is not set", func() { 249 It("should display the header with the new value only", func() { 250 err := ui.DisplayChangeForPush("val", 2, false, types.NullInt{ 251 Value: 0, 252 IsSet: false, 253 }, types.NullInt{ 254 Value: 1, 255 IsSet: true, 256 }) 257 Expect(err).ToNot(HaveOccurred()) 258 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 1\x1b\\[0m")) 259 }) 260 }) 261 }) 262 263 When("the values are the equal", func() { 264 It("should display the header without differences", func() { 265 err := ui.DisplayChangeForPush("val", 2, false, types.NullInt{ 266 Value: 3, 267 IsSet: true, 268 }, types.NullInt{ 269 Value: 3, 270 IsSet: true, 271 }) 272 Expect(err).ToNot(HaveOccurred()) 273 Expect(out).To(Say(`(?m)^\s+val 3$`)) 274 }) 275 }) 276 277 When("the values are a different type", func() { 278 It("should return an ErrValueMissmatch", func() { 279 err := ui.DisplayChangeForPush("asdf", 2, false, types.NullInt{}, "asdf") 280 Expect(err).To(MatchError(ErrValueMissmatch)) 281 }) 282 }) 283 }) 284 285 When("passed uint64s for values", func() { 286 When("the values are not equal", func() { 287 When("the originalValue is not empty", func() { 288 It("should display the header with differences", func() { 289 err := ui.DisplayChangeForPush("val", 2, false, uint64(1), uint64(2)) 290 Expect(err).ToNot(HaveOccurred()) 291 Expect(out).To(Say("\x1b\\[31m\\-\\s+val 1\x1b\\[0m")) 292 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 2\x1b\\[0m")) 293 }) 294 }) 295 296 When("the originalValue is zero", func() { 297 It("should display the header with the new value only", func() { 298 err := ui.DisplayChangeForPush("val", 2, false, uint64(0), uint64(1)) 299 Expect(err).ToNot(HaveOccurred()) 300 Expect(out).To(Say("\x1b\\[32m\\+\\s+val 1\x1b\\[0m")) 301 }) 302 }) 303 }) 304 305 When("the values are the equal", func() { 306 It("should display the header without differences", func() { 307 err := ui.DisplayChangeForPush("val", 2, false, uint64(3), uint64(3)) 308 Expect(err).ToNot(HaveOccurred()) 309 Expect(out).To(Say(`(?m)^\s+val 3$`)) 310 }) 311 }) 312 313 When("the values are a different type", func() { 314 It("should return an ErrValueMissmatch", func() { 315 err := ui.DisplayChangeForPush("asdf", 2, false, uint64(7), "asdf") 316 Expect(err).To(MatchError(ErrValueMissmatch)) 317 }) 318 }) 319 }) 320 321 When("passed map[string]string for values", func() { 322 It("should display the header with sorted differences", func() { 323 old := map[string]string{"key2": "2", "key3": "2", "key4": "4"} 324 new := map[string]string{"key1": "1", "key3": "3", "key4": "4"} 325 err := ui.DisplayChangeForPush("maps", 2, false, old, new) 326 Expect(err).ToNot(HaveOccurred()) 327 Expect(out).To(Say(`\s+maps`)) 328 Expect(out).To(Say("\x1b\\[32m\\+\\s+key1\x1b\\[0m")) 329 Expect(out).To(Say("\x1b\\[31m\\-\\s+key2\x1b\\[0m")) 330 Expect(out).To(Say("\x1b\\[31m\\-\\s+key3\x1b\\[0m")) 331 Expect(out).To(Say("\x1b\\[32m\\+\\s+key3\x1b\\[0m")) 332 Expect(out).To(Say(`(?m)^\s+key4`)) 333 }) 334 335 When("the values are a different type", func() { 336 It("should return an ErrValueMissmatch", func() { 337 err := ui.DisplayChangeForPush("asdf", 2, false, map[string]string{}, map[string]int{}) 338 Expect(err).To(MatchError(ErrValueMissmatch)) 339 }) 340 }) 341 342 When("both sets are empty", func() { 343 It("does not display anything", func() { 344 var old map[string]string 345 new := map[string]string{} 346 err := ui.DisplayChangeForPush("maps", 2, false, old, new) 347 Expect(err).ToNot(HaveOccurred()) 348 Expect(out).ToNot(Say(`\s+maps`)) 349 }) 350 }) 351 }) 352 }) 353 354 Context("in a non-english language", func() { 355 BeforeEach(func() { 356 fakeConfig.LocaleReturns("fr-FR") 357 }) 358 359 When("passed strings for values", func() { 360 When("the values are not equal", func() { 361 It("should display the differences", func() { 362 err := ui.DisplayChangeForPush("Name", 2, false, "old", "new") 363 Expect(err).ToNot(HaveOccurred()) 364 Expect(out).To(Say("\x1b\\[31m\\-\\s+Nom old\x1b\\[0m")) 365 Expect(out).To(Say("\x1b\\[32m\\+\\s+Nom new\x1b\\[0m")) 366 }) 367 }) 368 369 When("the values are the equal", func() { 370 It("should display the header without differences", func() { 371 err := ui.DisplayChangeForPush("Name", 2, false, "old", "old") 372 Expect(err).ToNot(HaveOccurred()) 373 Expect(out).To(Say(`(?m)^\s+Nom old$`)) 374 }) 375 }) 376 }) 377 378 When("passed list of strings for values", func() { 379 It("should display the header with sorted differences", func() { 380 old := []string{"route2", "route1", "route4"} 381 new := []string{"route4", "route2", "route3"} 382 err := ui.DisplayChangeForPush("Name", 2, false, old, new) 383 Expect(err).ToNot(HaveOccurred()) 384 Expect(out).To(Say(`\s+Nom`)) 385 Expect(out).To(Say("\x1b\\[31m\\-\\s+route1\x1b\\[0m")) 386 Expect(out).To(Say(`(?m)^\s+route2$`)) 387 Expect(out).To(Say("\x1b\\[32m\\+\\s+route3\x1b\\[0m")) 388 Expect(out).To(Say(`(?m)^\s+route4$`)) 389 }) 390 }) 391 }) 392 }) 393 })