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  }