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