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