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