github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/logging/azureblob/azureblob_test.go (about) 1 package azureblob_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/azureblob" 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 TestCreateBlobStorageInput(t *testing.T) { 20 for _, testcase := range []struct { 21 name string 22 cmd *azureblob.CreateCommand 23 want *fastly.CreateBlobStorageInput 24 wantError string 25 }{ 26 { 27 name: "required values set flag serviceID", 28 cmd: createCommandRequired(), 29 want: &fastly.CreateBlobStorageInput{ 30 ServiceID: "123", 31 ServiceVersion: 4, 32 Name: fastly.ToPointer("logs"), 33 AccountName: fastly.ToPointer("account"), 34 Container: fastly.ToPointer("container"), 35 SASToken: fastly.ToPointer("token"), 36 }, 37 }, 38 { 39 name: "all values set flag serviceID", 40 cmd: createCommandAll(), 41 want: &fastly.CreateBlobStorageInput{ 42 ServiceID: "123", 43 ServiceVersion: 4, 44 Name: fastly.ToPointer("logs"), 45 Container: fastly.ToPointer("container"), 46 AccountName: fastly.ToPointer("account"), 47 SASToken: fastly.ToPointer("token"), 48 Path: fastly.ToPointer("/log"), 49 Period: fastly.ToPointer(3600), 50 Format: fastly.ToPointer(`%h %l %u %t "%r" %>s %b`), 51 MessageType: fastly.ToPointer("classic"), 52 FormatVersion: fastly.ToPointer(2), 53 ResponseCondition: fastly.ToPointer("Prevent default logging"), 54 TimestampFormat: fastly.ToPointer("%Y-%m-%dT%H:%M:%S.000"), 55 Placement: fastly.ToPointer("none"), 56 PublicKey: fastly.ToPointer(pgpPublicKey()), 57 CompressionCodec: fastly.ToPointer("zstd"), 58 }, 59 }, 60 { 61 name: "error missing serviceID", 62 cmd: createCommandMissingServiceID(), 63 want: nil, 64 wantError: errors.ErrNoServiceID.Error(), 65 }, 66 } { 67 t.Run(testcase.name, func(t *testing.T) { 68 var bs []byte 69 out := bytes.NewBuffer(bs) 70 verboseMode := true 71 72 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 73 AutoCloneFlag: testcase.cmd.AutoClone, 74 APIClient: testcase.cmd.Globals.APIClient, 75 Manifest: testcase.cmd.Manifest, 76 Out: out, 77 ServiceVersionFlag: testcase.cmd.ServiceVersion, 78 VerboseMode: verboseMode, 79 }) 80 81 switch { 82 case err != nil && testcase.wantError == "": 83 t.Fatalf("unexpected error getting service details: %v", err) 84 return 85 case err != nil && testcase.wantError != "": 86 testutil.AssertErrorContains(t, err, testcase.wantError) 87 return 88 case err == nil && testcase.wantError != "": 89 t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number) 90 case err == nil && testcase.wantError == "": 91 have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number)) 92 testutil.AssertErrorContains(t, err, testcase.wantError) 93 testutil.AssertEqual(t, testcase.want, have) 94 } 95 }) 96 } 97 } 98 99 func TestUpdateBlobStorageInput(t *testing.T) { 100 scenarios := []struct { 101 name string 102 cmd *azureblob.UpdateCommand 103 api mock.API 104 want *fastly.UpdateBlobStorageInput 105 wantError string 106 }{ 107 { 108 name: "all values set flag serviceID", 109 cmd: updateCommandAll(), 110 api: mock.API{ 111 ListVersionsFn: testutil.ListVersions, 112 CloneVersionFn: testutil.CloneVersionResult(4), 113 GetBlobStorageFn: getBlobStorageOK, 114 }, 115 want: &fastly.UpdateBlobStorageInput{ 116 ServiceID: "123", 117 ServiceVersion: 4, 118 Name: "logs", 119 NewName: fastly.ToPointer("new1"), 120 Container: fastly.ToPointer("new2"), 121 AccountName: fastly.ToPointer("new3"), 122 SASToken: fastly.ToPointer("new4"), 123 Path: fastly.ToPointer("new5"), 124 Period: fastly.ToPointer(3601), 125 GzipLevel: fastly.ToPointer(0), 126 Format: fastly.ToPointer("new6"), 127 FormatVersion: fastly.ToPointer(3), 128 ResponseCondition: fastly.ToPointer("new7"), 129 MessageType: fastly.ToPointer("new8"), 130 TimestampFormat: fastly.ToPointer("new9"), 131 Placement: fastly.ToPointer("new10"), 132 PublicKey: fastly.ToPointer("new11"), 133 CompressionCodec: fastly.ToPointer("new12"), 134 }, 135 }, 136 { 137 name: "no updates", 138 cmd: updateCommandNoUpdates(), 139 api: mock.API{ 140 ListVersionsFn: testutil.ListVersions, 141 CloneVersionFn: testutil.CloneVersionResult(4), 142 GetBlobStorageFn: getBlobStorageOK, 143 }, 144 want: &fastly.UpdateBlobStorageInput{ 145 ServiceID: "123", 146 ServiceVersion: 4, 147 Name: "logs", 148 }, 149 }, 150 { 151 name: "error missing serviceID", 152 cmd: updateCommandMissingServiceID(), 153 want: nil, 154 wantError: errors.ErrNoServiceID.Error(), 155 }, 156 } 157 for testcaseIdx := range scenarios { 158 testcase := &scenarios[testcaseIdx] 159 t.Run(testcase.name, func(t *testing.T) { 160 testcase.cmd.Globals.APIClient = testcase.api 161 162 var bs []byte 163 out := bytes.NewBuffer(bs) 164 verboseMode := true 165 166 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 167 AutoCloneFlag: testcase.cmd.AutoClone, 168 APIClient: testcase.api, 169 Manifest: testcase.cmd.Manifest, 170 Out: out, 171 ServiceVersionFlag: testcase.cmd.ServiceVersion, 172 VerboseMode: verboseMode, 173 }) 174 175 switch { 176 case err != nil && testcase.wantError == "": 177 t.Fatalf("unexpected error getting service details: %v", err) 178 return 179 case err != nil && testcase.wantError != "": 180 testutil.AssertErrorContains(t, err, testcase.wantError) 181 return 182 case err == nil && testcase.wantError != "": 183 t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number) 184 case err == nil && testcase.wantError == "": 185 have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number)) 186 testutil.AssertErrorContains(t, err, testcase.wantError) 187 testutil.AssertEqual(t, testcase.want, have) 188 } 189 }) 190 } 191 } 192 193 func createCommandRequired() *azureblob.CreateCommand { 194 var b bytes.Buffer 195 196 g := global.Data{ 197 Config: config.File{}, 198 Env: config.Environment{}, 199 Output: &b, 200 } 201 // TODO: make consistent (in all other logging files) with syslog_test which 202 // uses a testcase.api field to assign the mock API to the global client. 203 g.APIClient, _ = mock.APIClient(mock.API{ 204 ListVersionsFn: testutil.ListVersions, 205 CloneVersionFn: testutil.CloneVersionResult(4), 206 })("token", "endpoint", false) 207 208 return &azureblob.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: "logs"}, 229 Container: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "container"}, 230 AccountName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "account"}, 231 SASToken: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "token"}, 232 } 233 } 234 235 func createCommandAll() *azureblob.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 &azureblob.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: "logs"}, 269 Container: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "container"}, 270 AccountName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "account"}, 271 SASToken: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "token"}, 272 Path: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "/log"}, 273 Period: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3600}, 274 Format: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: `%h %l %u %t "%r" %>s %b`}, 275 FormatVersion: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 2}, 276 ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "Prevent default logging"}, 277 TimestampFormat: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "%Y-%m-%dT%H:%M:%S.000"}, 278 Placement: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "none"}, 279 MessageType: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "classic"}, 280 PublicKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: pgpPublicKey()}, 281 CompressionCodec: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "zstd"}, 282 } 283 } 284 285 func createCommandMissingServiceID() *azureblob.CreateCommand { 286 res := createCommandAll() 287 res.Manifest = manifest.Data{} 288 return res 289 } 290 291 func updateCommandNoUpdates() *azureblob.UpdateCommand { 292 var b bytes.Buffer 293 294 g := global.Data{ 295 Config: config.File{}, 296 Env: config.Environment{}, 297 Output: &b, 298 } 299 300 return &azureblob.UpdateCommand{ 301 Base: argparser.Base{ 302 Globals: &g, 303 }, 304 Manifest: manifest.Data{ 305 Flag: manifest.Flag{ 306 ServiceID: "123", 307 }, 308 }, 309 EndpointName: "logs", 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 } 322 } 323 324 func updateCommandAll() *azureblob.UpdateCommand { 325 var b bytes.Buffer 326 327 g := global.Data{ 328 Config: config.File{}, 329 Env: config.Environment{}, 330 Output: &b, 331 } 332 333 return &azureblob.UpdateCommand{ 334 Base: argparser.Base{ 335 Globals: &g, 336 }, 337 Manifest: manifest.Data{ 338 Flag: manifest.Flag{ 339 ServiceID: "123", 340 }, 341 }, 342 EndpointName: "logs", 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 NewName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new1"}, 355 Container: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new2"}, 356 AccountName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new3"}, 357 SASToken: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new4"}, 358 Path: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new5"}, 359 Period: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3601}, 360 GzipLevel: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 0}, 361 Format: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new6"}, 362 FormatVersion: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3}, 363 ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new7"}, 364 MessageType: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new8"}, 365 TimestampFormat: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new9"}, 366 Placement: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new10"}, 367 PublicKey: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new11"}, 368 CompressionCodec: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new12"}, 369 } 370 } 371 372 func updateCommandMissingServiceID() *azureblob.UpdateCommand { 373 res := updateCommandAll() 374 res.Manifest = manifest.Data{} 375 return res 376 }