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  }