github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/tls/platform/platform_test.go (about)

     1  package platform_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"testing"
     8  
     9  	"github.com/fastly/go-fastly/v9/fastly"
    10  
    11  	"github.com/fastly/cli/pkg/app"
    12  	"github.com/fastly/cli/pkg/global"
    13  	"github.com/fastly/cli/pkg/mock"
    14  	"github.com/fastly/cli/pkg/testutil"
    15  )
    16  
    17  const (
    18  	validateAPIError      = "validate API error"
    19  	validateAPISuccess    = "validate API success"
    20  	validateMissingIDFlag = "validate missing --id flag"
    21  	mockResponseID        = "123"
    22  )
    23  
    24  func TestTLSPlatformCreate(t *testing.T) {
    25  	args := testutil.Args
    26  	scenarios := []testutil.TestScenario{
    27  		{
    28  			Name:      "validate missing --cert-blob flag",
    29  			Args:      args("tls-platform upload --intermediates-blob example"),
    30  			WantError: "required flag --cert-blob not provided",
    31  		},
    32  		{
    33  			Name:      "validate missing --intermediates-blob flag",
    34  			Args:      args("tls-platform upload --cert-blob example"),
    35  			WantError: "required flag --intermediates-blob not provided",
    36  		},
    37  		{
    38  			Name: validateAPIError,
    39  			API: mock.API{
    40  				CreateBulkCertificateFn: func(_ *fastly.CreateBulkCertificateInput) (*fastly.BulkCertificate, error) {
    41  					return nil, testutil.Err
    42  				},
    43  			},
    44  			Args:      args("tls-platform upload --cert-blob example --intermediates-blob example"),
    45  			WantError: testutil.Err.Error(),
    46  		},
    47  		{
    48  			Name: validateAPISuccess,
    49  			API: mock.API{
    50  				CreateBulkCertificateFn: func(_ *fastly.CreateBulkCertificateInput) (*fastly.BulkCertificate, error) {
    51  					return &fastly.BulkCertificate{
    52  						ID: mockResponseID,
    53  					}, nil
    54  				},
    55  			},
    56  			Args:       args("tls-platform upload --cert-blob example --intermediates-blob example"),
    57  			WantOutput: fmt.Sprintf("Uploaded TLS Bulk Certificate '%s'", mockResponseID),
    58  		},
    59  	}
    60  
    61  	for testcaseIdx := range scenarios {
    62  		testcase := &scenarios[testcaseIdx]
    63  		t.Run(testcase.Name, func(t *testing.T) {
    64  			var stdout bytes.Buffer
    65  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
    66  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
    67  				opts.APIClientFactory = mock.APIClient(testcase.API)
    68  				return opts, nil
    69  			}
    70  			err := app.Run(testcase.Args, nil)
    71  			testutil.AssertErrorContains(t, err, testcase.WantError)
    72  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
    73  		})
    74  	}
    75  }
    76  
    77  func TestTLSPlatformDelete(t *testing.T) {
    78  	args := testutil.Args
    79  	scenarios := []testutil.TestScenario{
    80  		{
    81  			Name:      validateMissingIDFlag,
    82  			Args:      args("tls-platform delete"),
    83  			WantError: "error parsing arguments: required flag --id not provided",
    84  		},
    85  		{
    86  			Name: validateAPIError,
    87  			API: mock.API{
    88  				DeleteBulkCertificateFn: func(_ *fastly.DeleteBulkCertificateInput) error {
    89  					return testutil.Err
    90  				},
    91  			},
    92  			Args:      args("tls-platform delete --id example"),
    93  			WantError: testutil.Err.Error(),
    94  		},
    95  		{
    96  			Name: validateAPISuccess,
    97  			API: mock.API{
    98  				DeleteBulkCertificateFn: func(_ *fastly.DeleteBulkCertificateInput) error {
    99  					return nil
   100  				},
   101  			},
   102  			Args:       args("tls-platform delete --id example"),
   103  			WantOutput: "Deleted TLS Bulk Certificate 'example'",
   104  		},
   105  	}
   106  
   107  	for testcaseIdx := range scenarios {
   108  		testcase := &scenarios[testcaseIdx]
   109  		t.Run(testcase.Name, func(t *testing.T) {
   110  			var stdout bytes.Buffer
   111  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   112  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   113  				opts.APIClientFactory = mock.APIClient(testcase.API)
   114  				return opts, nil
   115  			}
   116  			err := app.Run(testcase.Args, nil)
   117  			testutil.AssertErrorContains(t, err, testcase.WantError)
   118  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   119  		})
   120  	}
   121  }
   122  
   123  func TestTLSPlatformDescribe(t *testing.T) {
   124  	args := testutil.Args
   125  	scenarios := []testutil.TestScenario{
   126  		{
   127  			Name:      validateMissingIDFlag,
   128  			Args:      args("tls-platform describe"),
   129  			WantError: "error parsing arguments: required flag --id not provided",
   130  		},
   131  		{
   132  			Name: validateAPIError,
   133  			API: mock.API{
   134  				GetBulkCertificateFn: func(_ *fastly.GetBulkCertificateInput) (*fastly.BulkCertificate, error) {
   135  					return nil, testutil.Err
   136  				},
   137  			},
   138  			Args:      args("tls-platform describe --id example"),
   139  			WantError: testutil.Err.Error(),
   140  		},
   141  		{
   142  			Name: validateAPISuccess,
   143  			API: mock.API{
   144  				GetBulkCertificateFn: func(_ *fastly.GetBulkCertificateInput) (*fastly.BulkCertificate, error) {
   145  					t := testutil.Date
   146  					return &fastly.BulkCertificate{
   147  						ID:        "123",
   148  						CreatedAt: &t,
   149  						UpdatedAt: &t,
   150  						Replace:   true,
   151  					}, nil
   152  				},
   153  			},
   154  			Args:       args("tls-platform describe --id example"),
   155  			WantOutput: "\nID: 123\nCreated at: 2021-06-15 23:00:00 +0000 UTC\nUpdated at: 2021-06-15 23:00:00 +0000 UTC\nReplace: true\n",
   156  		},
   157  	}
   158  
   159  	for testcaseIdx := range scenarios {
   160  		testcase := &scenarios[testcaseIdx]
   161  		t.Run(testcase.Name, func(t *testing.T) {
   162  			var stdout bytes.Buffer
   163  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   164  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   165  				opts.APIClientFactory = mock.APIClient(testcase.API)
   166  				return opts, nil
   167  			}
   168  			err := app.Run(testcase.Args, nil)
   169  			testutil.AssertErrorContains(t, err, testcase.WantError)
   170  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   171  		})
   172  	}
   173  }
   174  
   175  func TestTLSPlatformList(t *testing.T) {
   176  	args := testutil.Args
   177  	scenarios := []testutil.TestScenario{
   178  		{
   179  			Name: validateAPIError,
   180  			API: mock.API{
   181  				ListBulkCertificatesFn: func(_ *fastly.ListBulkCertificatesInput) ([]*fastly.BulkCertificate, error) {
   182  					return nil, testutil.Err
   183  				},
   184  			},
   185  			Args:      args("tls-platform list"),
   186  			WantError: testutil.Err.Error(),
   187  		},
   188  		{
   189  			Name: validateAPISuccess,
   190  			API: mock.API{
   191  				ListBulkCertificatesFn: func(_ *fastly.ListBulkCertificatesInput) ([]*fastly.BulkCertificate, error) {
   192  					t := testutil.Date
   193  					return []*fastly.BulkCertificate{
   194  						{
   195  							ID:        mockResponseID,
   196  							CreatedAt: &t,
   197  							UpdatedAt: &t,
   198  							Replace:   true,
   199  						},
   200  					}, nil
   201  				},
   202  			},
   203  			Args:       args("tls-platform list --verbose"),
   204  			WantOutput: "\nID: " + mockResponseID + "\nCreated at: 2021-06-15 23:00:00 +0000 UTC\nUpdated at: 2021-06-15 23:00:00 +0000 UTC\nReplace: true\n",
   205  		},
   206  	}
   207  
   208  	for testcaseIdx := range scenarios {
   209  		testcase := &scenarios[testcaseIdx]
   210  		t.Run(testcase.Name, func(t *testing.T) {
   211  			var stdout bytes.Buffer
   212  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   213  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   214  				opts.APIClientFactory = mock.APIClient(testcase.API)
   215  				return opts, nil
   216  			}
   217  			err := app.Run(testcase.Args, nil)
   218  			testutil.AssertErrorContains(t, err, testcase.WantError)
   219  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   220  		})
   221  	}
   222  }
   223  
   224  func TestTLSPlatformUpdate(t *testing.T) {
   225  	args := testutil.Args
   226  	scenarios := []testutil.TestScenario{
   227  		{
   228  			Name:      validateMissingIDFlag,
   229  			Args:      args("tls-platform update --cert-blob example --intermediates-blob example"),
   230  			WantError: "required flag --id not provided",
   231  		},
   232  		{
   233  			Name:      "validate missing --cert-blob flag",
   234  			Args:      args("tls-platform update --id example --intermediates-blob example"),
   235  			WantError: "required flag --cert-blob not provided",
   236  		},
   237  		{
   238  			Name:      "validate missing --intermediates-blob flag",
   239  			Args:      args("tls-platform update --id example --cert-blob example"),
   240  			WantError: "required flag --intermediates-blob not provided",
   241  		},
   242  		{
   243  			Name: validateAPIError,
   244  			API: mock.API{
   245  				UpdateBulkCertificateFn: func(_ *fastly.UpdateBulkCertificateInput) (*fastly.BulkCertificate, error) {
   246  					return nil, testutil.Err
   247  				},
   248  			},
   249  			Args:      args("tls-platform update --id example --cert-blob example --intermediates-blob example"),
   250  			WantError: testutil.Err.Error(),
   251  		},
   252  		{
   253  			Name: validateAPISuccess,
   254  			API: mock.API{
   255  				UpdateBulkCertificateFn: func(_ *fastly.UpdateBulkCertificateInput) (*fastly.BulkCertificate, error) {
   256  					return &fastly.BulkCertificate{
   257  						ID: mockResponseID,
   258  					}, nil
   259  				},
   260  			},
   261  			Args:       args("tls-platform update --id example --cert-blob example --intermediates-blob example"),
   262  			WantOutput: "Updated TLS Bulk Certificate '123'",
   263  		},
   264  	}
   265  
   266  	for testcaseIdx := range scenarios {
   267  		testcase := &scenarios[testcaseIdx]
   268  		t.Run(testcase.Name, func(t *testing.T) {
   269  			var stdout bytes.Buffer
   270  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   271  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   272  				opts.APIClientFactory = mock.APIClient(testcase.API)
   273  				return opts, nil
   274  			}
   275  			err := app.Run(testcase.Args, nil)
   276  			testutil.AssertErrorContains(t, err, testcase.WantError)
   277  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   278  		})
   279  	}
   280  }