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  }