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