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

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