github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/logging/https/https_test.go (about)

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