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