github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/logging/cloudfiles/cloudfiles_test.go (about) 1 package cloudfiles_test 2 3 import ( 4 "bytes" 5 "testing" 6 7 "github.com/fastly/go-fastly/v9/fastly" 8 9 "github.com/fastly/cli/pkg/argparser" 10 "github.com/fastly/cli/pkg/commands/logging/cloudfiles" 11 "github.com/fastly/cli/pkg/config" 12 "github.com/fastly/cli/pkg/errors" 13 "github.com/fastly/cli/pkg/global" 14 "github.com/fastly/cli/pkg/manifest" 15 "github.com/fastly/cli/pkg/mock" 16 "github.com/fastly/cli/pkg/testutil" 17 ) 18 19 func TestCreateCloudfilesInput(t *testing.T) { 20 for _, testcase := range []struct { 21 name string 22 cmd *cloudfiles.CreateCommand 23 want *fastly.CreateCloudfilesInput 24 wantError string 25 }{ 26 { 27 name: "required values set flag serviceID", 28 cmd: createCommandRequired(), 29 want: &fastly.CreateCloudfilesInput{ 30 ServiceID: "123", 31 ServiceVersion: 4, 32 Name: fastly.ToPointer("log"), 33 User: fastly.ToPointer("user"), 34 AccessKey: fastly.ToPointer("key"), 35 BucketName: fastly.ToPointer("bucket"), 36 }, 37 }, 38 { 39 name: "all values set flag serviceID", 40 cmd: createCommandAll(), 41 want: &fastly.CreateCloudfilesInput{ 42 ServiceID: "123", 43 ServiceVersion: 4, 44 Name: fastly.ToPointer("log"), 45 User: fastly.ToPointer("user"), 46 AccessKey: fastly.ToPointer("key"), 47 BucketName: fastly.ToPointer("bucket"), 48 Path: fastly.ToPointer("/logs"), 49 Region: fastly.ToPointer("abc"), 50 Placement: fastly.ToPointer("none"), 51 Period: fastly.ToPointer(3600), 52 Format: fastly.ToPointer(`%h %l %u %t "%r" %>s %b`), 53 FormatVersion: fastly.ToPointer(2), 54 ResponseCondition: fastly.ToPointer("Prevent default logging"), 55 MessageType: fastly.ToPointer("classic"), 56 TimestampFormat: fastly.ToPointer("%Y-%m-%dT%H:%M:%S.000"), 57 PublicKey: fastly.ToPointer(pgpPublicKey()), 58 CompressionCodec: fastly.ToPointer("zstd"), 59 }, 60 }, 61 { 62 name: "error missing serviceID", 63 cmd: createCommandMissingServiceID(), 64 want: nil, 65 wantError: errors.ErrNoServiceID.Error(), 66 }, 67 } { 68 t.Run(testcase.name, func(t *testing.T) { 69 var bs []byte 70 out := bytes.NewBuffer(bs) 71 verboseMode := true 72 73 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 74 AutoCloneFlag: testcase.cmd.AutoClone, 75 APIClient: testcase.cmd.Globals.APIClient, 76 Manifest: testcase.cmd.Manifest, 77 Out: out, 78 ServiceVersionFlag: testcase.cmd.ServiceVersion, 79 VerboseMode: verboseMode, 80 }) 81 82 switch { 83 case err != nil && testcase.wantError == "": 84 t.Fatalf("unexpected error getting service details: %v", err) 85 return 86 case err != nil && testcase.wantError != "": 87 testutil.AssertErrorContains(t, err, testcase.wantError) 88 return 89 case err == nil && testcase.wantError != "": 90 t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number) 91 case err == nil && testcase.wantError == "": 92 have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number)) 93 testutil.AssertErrorContains(t, err, testcase.wantError) 94 testutil.AssertEqual(t, testcase.want, have) 95 } 96 }) 97 } 98 } 99 100 func TestUpdateCloudfilesInput(t *testing.T) { 101 scenarios := []struct { 102 name string 103 cmd *cloudfiles.UpdateCommand 104 api mock.API 105 want *fastly.UpdateCloudfilesInput 106 wantError string 107 }{ 108 { 109 name: "no update", 110 cmd: updateCommandNoUpdate(), 111 api: mock.API{ 112 ListVersionsFn: testutil.ListVersions, 113 CloneVersionFn: testutil.CloneVersionResult(4), 114 GetCloudfilesFn: getCloudfilesOK, 115 }, 116 want: &fastly.UpdateCloudfilesInput{ 117 ServiceID: "123", 118 ServiceVersion: 4, 119 Name: "log", 120 }, 121 }, 122 { 123 name: "all values set flag serviceID", 124 cmd: updateCommandAll(), 125 api: mock.API{ 126 ListVersionsFn: testutil.ListVersions, 127 CloneVersionFn: testutil.CloneVersionResult(4), 128 GetCloudfilesFn: getCloudfilesOK, 129 }, 130 want: &fastly.UpdateCloudfilesInput{ 131 ServiceID: "123", 132 ServiceVersion: 4, 133 Name: "log", 134 NewName: fastly.ToPointer("new1"), 135 AccessKey: fastly.ToPointer("new2"), 136 BucketName: fastly.ToPointer("new3"), 137 Path: fastly.ToPointer("new4"), 138 Region: fastly.ToPointer("new5"), 139 Placement: fastly.ToPointer("new6"), 140 Period: fastly.ToPointer(3601), 141 GzipLevel: fastly.ToPointer(0), 142 Format: fastly.ToPointer("new7"), 143 FormatVersion: fastly.ToPointer(3), 144 ResponseCondition: fastly.ToPointer("new8"), 145 MessageType: fastly.ToPointer("new9"), 146 TimestampFormat: fastly.ToPointer("new10"), 147 PublicKey: fastly.ToPointer("new11"), 148 User: fastly.ToPointer("new12"), 149 CompressionCodec: fastly.ToPointer("new13"), 150 }, 151 }, 152 { 153 name: "error missing serviceID", 154 cmd: updateCommandMissingServiceID(), 155 want: nil, 156 wantError: errors.ErrNoServiceID.Error(), 157 }, 158 } 159 for testcaseIdx := range scenarios { 160 testcase := &scenarios[testcaseIdx] 161 t.Run(testcase.name, func(t *testing.T) { 162 testcase.cmd.Globals.APIClient = testcase.api 163 164 var bs []byte 165 out := bytes.NewBuffer(bs) 166 verboseMode := true 167 168 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 169 AutoCloneFlag: testcase.cmd.AutoClone, 170 APIClient: testcase.api, 171 Manifest: testcase.cmd.Manifest, 172 Out: out, 173 ServiceVersionFlag: testcase.cmd.ServiceVersion, 174 VerboseMode: verboseMode, 175 }) 176 177 switch { 178 case err != nil && testcase.wantError == "": 179 t.Fatalf("unexpected error getting service details: %v", err) 180 return 181 case err != nil && testcase.wantError != "": 182 testutil.AssertErrorContains(t, err, testcase.wantError) 183 return 184 case err == nil && testcase.wantError != "": 185 t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number) 186 case err == nil && testcase.wantError == "": 187 have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number)) 188 testutil.AssertErrorContains(t, err, testcase.wantError) 189 testutil.AssertEqual(t, testcase.want, have) 190 } 191 }) 192 } 193 } 194 195 func createCommandRequired() *cloudfiles.CreateCommand { 196 var b bytes.Buffer 197 198 g := global.Data{ 199 Config: config.File{}, 200 Env: config.Environment{}, 201 Output: &b, 202 } 203 g.APIClient, _ = mock.APIClient(mock.API{ 204 ListVersionsFn: testutil.ListVersions, 205 CloneVersionFn: testutil.CloneVersionResult(4), 206 })("token", "endpoint", false) 207 208 return &cloudfiles.CreateCommand{ 209 Base: argparser.Base{ 210 Globals: &g, 211 }, 212 Manifest: manifest.Data{ 213 Flag: manifest.Flag{ 214 ServiceID: "123", 215 }, 216 }, 217 ServiceVersion: argparser.OptionalServiceVersion{ 218 OptionalString: argparser.OptionalString{Value: "1"}, 219 }, 220 AutoClone: argparser.OptionalAutoClone{ 221 OptionalBool: argparser.OptionalBool{ 222 Optional: argparser.Optional{ 223 WasSet: true, 224 }, 225 Value: true, 226 }, 227 }, 228 EndpointName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "log"}, 229 User: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "user"}, 230 AccessKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "key"}, 231 BucketName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "bucket"}, 232 } 233 } 234 235 func createCommandAll() *cloudfiles.CreateCommand { 236 var b bytes.Buffer 237 238 g := global.Data{ 239 Config: config.File{}, 240 Env: config.Environment{}, 241 Output: &b, 242 } 243 g.APIClient, _ = mock.APIClient(mock.API{ 244 ListVersionsFn: testutil.ListVersions, 245 CloneVersionFn: testutil.CloneVersionResult(4), 246 })("token", "endpoint", false) 247 248 return &cloudfiles.CreateCommand{ 249 Base: argparser.Base{ 250 Globals: &g, 251 }, 252 Manifest: manifest.Data{ 253 Flag: manifest.Flag{ 254 ServiceID: "123", 255 }, 256 }, 257 ServiceVersion: argparser.OptionalServiceVersion{ 258 OptionalString: argparser.OptionalString{Value: "1"}, 259 }, 260 AutoClone: argparser.OptionalAutoClone{ 261 OptionalBool: argparser.OptionalBool{ 262 Optional: argparser.Optional{ 263 WasSet: true, 264 }, 265 Value: true, 266 }, 267 }, 268 EndpointName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "log"}, 269 User: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "user"}, 270 AccessKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "key"}, 271 BucketName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "bucket"}, 272 Path: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "/logs"}, 273 Region: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "abc"}, 274 Placement: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "none"}, 275 Period: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3600}, 276 Format: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: `%h %l %u %t "%r" %>s %b`}, 277 FormatVersion: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 2}, 278 ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "Prevent default logging"}, 279 MessageType: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "classic"}, 280 TimestampFormat: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "%Y-%m-%dT%H:%M:%S.000"}, 281 PublicKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: pgpPublicKey()}, 282 CompressionCodec: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "zstd"}, 283 } 284 } 285 286 func createCommandMissingServiceID() *cloudfiles.CreateCommand { 287 res := createCommandAll() 288 res.Manifest = manifest.Data{} 289 return res 290 } 291 292 func updateCommandNoUpdate() *cloudfiles.UpdateCommand { 293 var b bytes.Buffer 294 295 g := global.Data{ 296 Config: config.File{}, 297 Env: config.Environment{}, 298 Output: &b, 299 } 300 301 return &cloudfiles.UpdateCommand{ 302 Base: argparser.Base{ 303 Globals: &g, 304 }, 305 Manifest: manifest.Data{ 306 Flag: manifest.Flag{ 307 ServiceID: "123", 308 }, 309 }, 310 ServiceVersion: argparser.OptionalServiceVersion{ 311 OptionalString: argparser.OptionalString{Value: "1"}, 312 }, 313 AutoClone: argparser.OptionalAutoClone{ 314 OptionalBool: argparser.OptionalBool{ 315 Optional: argparser.Optional{ 316 WasSet: true, 317 }, 318 Value: true, 319 }, 320 }, 321 EndpointName: "log", 322 } 323 } 324 325 func updateCommandAll() *cloudfiles.UpdateCommand { 326 var b bytes.Buffer 327 328 g := global.Data{ 329 Config: config.File{}, 330 Env: config.Environment{}, 331 Output: &b, 332 } 333 334 return &cloudfiles.UpdateCommand{ 335 Base: argparser.Base{ 336 Globals: &g, 337 }, 338 Manifest: manifest.Data{ 339 Flag: manifest.Flag{ 340 ServiceID: "123", 341 }, 342 }, 343 ServiceVersion: argparser.OptionalServiceVersion{ 344 OptionalString: argparser.OptionalString{Value: "1"}, 345 }, 346 AutoClone: argparser.OptionalAutoClone{ 347 OptionalBool: argparser.OptionalBool{ 348 Optional: argparser.Optional{ 349 WasSet: true, 350 }, 351 Value: true, 352 }, 353 }, 354 EndpointName: "log", 355 NewName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new1"}, 356 AccessKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new2"}, 357 BucketName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new3"}, 358 Path: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new4"}, 359 Region: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new5"}, 360 Placement: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new6"}, 361 Period: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3601}, 362 GzipLevel: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 0}, 363 Format: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new7"}, 364 FormatVersion: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3}, 365 ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new8"}, 366 MessageType: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new9"}, 367 TimestampFormat: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new10"}, 368 PublicKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new11"}, 369 User: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new12"}, 370 CompressionCodec: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new13"}, 371 } 372 } 373 374 func updateCommandMissingServiceID() *cloudfiles.UpdateCommand { 375 res := updateCommandAll() 376 res.Manifest = manifest.Data{} 377 return res 378 }