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

     1  package config_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  	mockResponseID     = "123"
    21  )
    22  
    23  func TestDescribe(t *testing.T) {
    24  	args := testutil.Args
    25  	scenarios := []testutil.TestScenario{
    26  		{
    27  			Name:      "validate missing --id flag",
    28  			Args:      args("tls-config describe"),
    29  			WantError: "error parsing arguments: required flag --id not provided",
    30  		},
    31  		{
    32  			Name: validateAPIError,
    33  			API: mock.API{
    34  				GetCustomTLSConfigurationFn: func(i *fastly.GetCustomTLSConfigurationInput) (*fastly.CustomTLSConfiguration, error) {
    35  					return nil, testutil.Err
    36  				},
    37  			},
    38  			Args:      args("tls-config describe --id example"),
    39  			WantError: testutil.Err.Error(),
    40  		},
    41  		{
    42  			Name: validateAPISuccess,
    43  			API: mock.API{
    44  				GetCustomTLSConfigurationFn: func(_ *fastly.GetCustomTLSConfigurationInput) (*fastly.CustomTLSConfiguration, error) {
    45  					t := testutil.Date
    46  					return &fastly.CustomTLSConfiguration{
    47  						ID:   mockResponseID,
    48  						Name: "Foo",
    49  						DNSRecords: []*fastly.DNSRecord{
    50  							{
    51  								ID:         "456",
    52  								RecordType: "Bar",
    53  								Region:     "Baz",
    54  							},
    55  						},
    56  						Bulk:          true,
    57  						Default:       true,
    58  						HTTPProtocols: []string{"1.1"},
    59  						TLSProtocols:  []string{"1.3"},
    60  						CreatedAt:     &t,
    61  						UpdatedAt:     &t,
    62  					}, nil
    63  				},
    64  			},
    65  			Args:       args("tls-config describe --id example"),
    66  			WantOutput: "\nID: " + mockResponseID + "\nName: Foo\nDNS Record ID: 456\nDNS Record Type: Bar\nDNS Record Region: Baz\nBulk: true\nDefault: true\nHTTP Protocol: 1.1\nTLS Protocol: 1.3\nCreated at: 2021-06-15 23:00:00 +0000 UTC\nUpdated at: 2021-06-15 23:00:00 +0000 UTC\n",
    67  		},
    68  	}
    69  
    70  	for testcaseIdx := range scenarios {
    71  		testcase := &scenarios[testcaseIdx]
    72  		t.Run(testcase.Name, func(t *testing.T) {
    73  			var stdout bytes.Buffer
    74  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
    75  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
    76  				opts.APIClientFactory = mock.APIClient(testcase.API)
    77  				return opts, nil
    78  			}
    79  			err := app.Run(testcase.Args, nil)
    80  			testutil.AssertErrorContains(t, err, testcase.WantError)
    81  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
    82  		})
    83  	}
    84  }
    85  
    86  func TestList(t *testing.T) {
    87  	args := testutil.Args
    88  	scenarios := []testutil.TestScenario{
    89  		{
    90  			Name: validateAPIError,
    91  			API: mock.API{
    92  				ListCustomTLSConfigurationsFn: func(_ *fastly.ListCustomTLSConfigurationsInput) ([]*fastly.CustomTLSConfiguration, error) {
    93  					return nil, testutil.Err
    94  				},
    95  			},
    96  			Args:      args("tls-config list"),
    97  			WantError: testutil.Err.Error(),
    98  		},
    99  		{
   100  			Name: validateAPISuccess,
   101  			API: mock.API{
   102  				ListCustomTLSConfigurationsFn: func(_ *fastly.ListCustomTLSConfigurationsInput) ([]*fastly.CustomTLSConfiguration, error) {
   103  					t := testutil.Date
   104  					return []*fastly.CustomTLSConfiguration{
   105  						{
   106  							ID:   mockResponseID,
   107  							Name: "Foo",
   108  							DNSRecords: []*fastly.DNSRecord{
   109  								{
   110  									ID:         "456",
   111  									RecordType: "Bar",
   112  									Region:     "Baz",
   113  								},
   114  							},
   115  							Bulk:          true,
   116  							Default:       true,
   117  							HTTPProtocols: []string{"1.1"},
   118  							TLSProtocols:  []string{"1.3"},
   119  							CreatedAt:     &t,
   120  							UpdatedAt:     &t,
   121  						},
   122  					}, nil
   123  				},
   124  			},
   125  			Args:       args("tls-config list --verbose"),
   126  			WantOutput: "\nID: " + mockResponseID + "\nName: Foo\nDNS Record ID: 456\nDNS Record Type: Bar\nDNS Record Region: Baz\nBulk: true\nDefault: true\nHTTP Protocol: 1.1\nTLS Protocol: 1.3\nCreated at: 2021-06-15 23:00:00 +0000 UTC\nUpdated at: 2021-06-15 23:00:00 +0000 UTC\n",
   127  		},
   128  	}
   129  
   130  	for testcaseIdx := range scenarios {
   131  		testcase := &scenarios[testcaseIdx]
   132  		t.Run(testcase.Name, func(t *testing.T) {
   133  			var stdout bytes.Buffer
   134  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   135  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   136  				opts.APIClientFactory = mock.APIClient(testcase.API)
   137  				return opts, nil
   138  			}
   139  			err := app.Run(testcase.Args, nil)
   140  			testutil.AssertErrorContains(t, err, testcase.WantError)
   141  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   142  		})
   143  	}
   144  }
   145  
   146  func TestUpdate(t *testing.T) {
   147  	args := testutil.Args
   148  	scenarios := []testutil.TestScenario{
   149  		{
   150  			Name:      "validate missing --id flag",
   151  			Args:      args("tls-config update --name example"),
   152  			WantError: "error parsing arguments: required flag --id not provided",
   153  		},
   154  		{
   155  			Name:      "validate missing --name flag",
   156  			Args:      args("tls-config update --id 123"),
   157  			WantError: "error parsing arguments: required flag --name not provided",
   158  		},
   159  		{
   160  			Name: validateAPIError,
   161  			API: mock.API{
   162  				UpdateCustomTLSConfigurationFn: func(i *fastly.UpdateCustomTLSConfigurationInput) (*fastly.CustomTLSConfiguration, error) {
   163  					return nil, testutil.Err
   164  				},
   165  			},
   166  			Args:      args("tls-config update --id example --name example"),
   167  			WantError: testutil.Err.Error(),
   168  		},
   169  		{
   170  			Name: validateAPISuccess,
   171  			API: mock.API{
   172  				UpdateCustomTLSConfigurationFn: func(_ *fastly.UpdateCustomTLSConfigurationInput) (*fastly.CustomTLSConfiguration, error) {
   173  					return &fastly.CustomTLSConfiguration{
   174  						ID: mockResponseID,
   175  					}, nil
   176  				},
   177  			},
   178  			Args:       args("tls-config update --id example --name example"),
   179  			WantOutput: fmt.Sprintf("Updated TLS Configuration '%s'", mockResponseID),
   180  		},
   181  	}
   182  
   183  	for testcaseIdx := range scenarios {
   184  		testcase := &scenarios[testcaseIdx]
   185  		t.Run(testcase.Name, func(t *testing.T) {
   186  			var stdout bytes.Buffer
   187  			app.Init = func(_ []string, _ io.Reader) (*global.Data, error) {
   188  				opts := testutil.MockGlobalData(testcase.Args, &stdout)
   189  				opts.APIClientFactory = mock.APIClient(testcase.API)
   190  				return opts, nil
   191  			}
   192  			err := app.Run(testcase.Args, nil)
   193  			testutil.AssertErrorContains(t, err, testcase.WantError)
   194  			testutil.AssertStringContains(t, stdout.String(), testcase.WantOutput)
   195  		})
   196  	}
   197  }