github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/config_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/drycc/controller-sdk-go/api"
    11  	"github.com/drycc/workflow-cli/pkg/testutil"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestParseConfig(t *testing.T) {
    16  	t.Parallel()
    17  
    18  	_, err := parseConfig([]string{"FOO=bar", "CAR star"})
    19  	assert.NotEqual(t, err, nil, "config")
    20  
    21  	actual, err := parseConfig([]string{"FOO=bar"})
    22  	assert.NoError(t, err)
    23  	assert.Equal(t, actual, map[string]interface{}{"FOO": "bar"}, "map")
    24  
    25  	actual, err = parseConfig([]string{"FOO="})
    26  	assert.NoError(t, err)
    27  	assert.Equal(t, actual, map[string]interface{}{"FOO": ""}, "map")
    28  }
    29  
    30  func TestParseSSHKey(t *testing.T) {
    31  	t.Parallel()
    32  
    33  	_, err := parseSSHKey("foobar")
    34  	assert.NotEqual(t, err, "bogus key")
    35  
    36  	validSSHKey := "-----BEGIN OPENSSH PRIVATE KEY-----"
    37  
    38  	actual, err := parseSSHKey(validSSHKey)
    39  	assert.NoError(t, err)
    40  	assert.Equal(t, actual, validSSHKey, "plain key")
    41  
    42  	encodedSSHKey := "LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0="
    43  
    44  	actual, err = parseSSHKey(encodedSSHKey)
    45  	assert.NoError(t, err)
    46  	assert.Equal(t, actual, validSSHKey, "base64 key")
    47  
    48  	keyFile, err := os.CreateTemp("", "drycc-cli-unit-test-sshkey")
    49  	assert.NoError(t, err)
    50  	defer os.Remove(keyFile.Name())
    51  	_, err = keyFile.Write([]byte(validSSHKey))
    52  	assert.NoError(t, err)
    53  	keyFile.Close()
    54  
    55  	actual, err = parseSSHKey(keyFile.Name())
    56  	assert.NoError(t, err)
    57  	assert.Equal(t, actual, validSSHKey, "key path")
    58  }
    59  
    60  func TestFormatConfig(t *testing.T) {
    61  	t.Parallel()
    62  
    63  	testMap := map[string]interface{}{
    64  		"TEST":  "testing",
    65  		"NCC":   1701,
    66  		"TRUE":  false,
    67  		"FLOAT": 12.34,
    68  	}
    69  
    70  	testOut := formatConfig(testMap)
    71  	assert.Equal(t, testOut, `FLOAT=12.34
    72  NCC=1701
    73  TEST=testing
    74  TRUE=false
    75  `, "output")
    76  }
    77  
    78  func TestSortKeys(t *testing.T) {
    79  	test := map[string]interface{}{
    80  		"d": nil,
    81  		"b": nil,
    82  		"c": nil,
    83  		"a": nil,
    84  	}
    85  
    86  	assert.Equal(t, *sortKeys(test), []string{"a", "b", "c", "d"}, "map")
    87  }
    88  
    89  func TestConfigList(t *testing.T) {
    90  	t.Parallel()
    91  	cf, server, err := testutil.NewTestServerAndClient()
    92  	if err != nil {
    93  		t.Fatal(err)
    94  	}
    95  	defer server.Close()
    96  
    97  	server.Mux.HandleFunc("/v2/apps/foo/config/", func(w http.ResponseWriter, _ *http.Request) {
    98  		testutil.SetHeaders(w)
    99  		fmt.Fprintf(w, `{
   100      "owner": "jkirk",
   101      "app": "foo",
   102      "values": {
   103          "TEST":  "testing",
   104          "NCC":   "1701",
   105          "TRUE":  "false",
   106          "FLOAT": "12.34"
   107      },
   108      "memory": {},
   109      "cpu": {},
   110      "tags": {},
   111      "registry": {},
   112      "created": "2014-01-01T00:00:00UTC",
   113      "updated": "2014-01-01T00:00:00UTC",
   114      "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   115  }`)
   116  	})
   117  
   118  	var b bytes.Buffer
   119  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   120  
   121  	err = cmdr.ConfigList("foo", "")
   122  	assert.NoError(t, err)
   123  
   124  	assert.Equal(t, b.String(), `UUID                                    OWNER    NAME     VALUE   
   125  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    FLOAT    12.34      
   126  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    NCC      1701       
   127  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TEST     testing    
   128  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TRUE     false      
   129  `, "output")
   130  	b.Reset()
   131  
   132  	err = cmdr.ConfigList("foo", "oneline")
   133  	assert.NoError(t, err)
   134  	assert.Equal(t, b.String(), "FLOAT=12.34 NCC=1701 TEST=testing TRUE=false\n", "output")
   135  
   136  	b.Reset()
   137  
   138  	err = cmdr.ConfigList("foo", "diff")
   139  	assert.NoError(t, err)
   140  	assert.Equal(t, b.String(), "FLOAT=12.34\nNCC=1701\nTEST=testing\nTRUE=false\n", "output")
   141  }
   142  
   143  func TestConfigSet(t *testing.T) {
   144  	t.Parallel()
   145  	cf, server, err := testutil.NewTestServerAndClient()
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  	defer server.Close()
   150  
   151  	server.Mux.HandleFunc("/v2/apps/foo/config/", func(w http.ResponseWriter, r *http.Request) {
   152  		testutil.SetHeaders(w)
   153  		if r.Method == "POST" {
   154  			testutil.AssertBody(t, api.Config{
   155  				Values: map[string]interface{}{
   156  					"TRUE":    "false",
   157  					"SSH_KEY": "LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0=",
   158  				},
   159  			}, r)
   160  		}
   161  
   162  		fmt.Fprintf(w, `{
   163  	"owner": "jkirk",
   164  	"app": "foo",
   165  	"values": {
   166  			"TEST":  "testing",
   167  			"NCC":   "1701",
   168  			"TRUE":  "false",
   169  			"SSH_KEY": "LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0=",
   170  			"FLOAT": "12.34"
   171  	},
   172  	"memory": {},
   173  	"cpu": {},
   174  	"tags": {},
   175  	"registry": {},
   176  	"created": "2014-01-01T00:00:00UTC",
   177  	"updated": "2014-01-01T00:00:00UTC",
   178  	"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   179  }`)
   180  	})
   181  
   182  	var b bytes.Buffer
   183  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   184  
   185  	err = cmdr.ConfigSet("foo", []string{"TRUE=false", "SSH_KEY=-----BEGIN OPENSSH PRIVATE KEY-----"})
   186  	assert.NoError(t, err)
   187  
   188  	assert.Equal(t, testutil.StripProgress(b.String()), `Creating config... done
   189  
   190  UUID                                    OWNER    NAME       VALUE                                            
   191  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    FLOAT      12.34                                               
   192  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    NCC        1701                                                
   193  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    SSH_KEY    LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0=    
   194  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TEST       testing                                             
   195  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TRUE       false                                               
   196  `, "output")
   197  }
   198  
   199  func TestConfigUnset(t *testing.T) {
   200  	t.Parallel()
   201  	cf, server, err := testutil.NewTestServerAndClient()
   202  	if err != nil {
   203  		t.Fatal(err)
   204  	}
   205  	defer server.Close()
   206  
   207  	server.Mux.HandleFunc("/v2/apps/foo/config/", func(w http.ResponseWriter, r *http.Request) {
   208  		testutil.SetHeaders(w)
   209  		if r.Method == "POST" {
   210  			testutil.AssertBody(t, api.Config{
   211  				Values: map[string]interface{}{
   212  					"FOO": nil,
   213  				},
   214  			}, r)
   215  		}
   216  
   217  		fmt.Fprintf(w, `{
   218  	"owner": "jkirk",
   219  	"app": "foo",
   220  	"values": {
   221  			"TEST":  "testing",
   222  			"NCC":   "1701",
   223  			"TRUE":  "false",
   224  			"FLOAT": "12.34"
   225  	},
   226  	"memory": {},
   227  	"cpu": {},
   228  	"tags": {},
   229  	"registry": {},
   230  	"created": "2014-01-01T00:00:00UTC",
   231  	"updated": "2014-01-01T00:00:00UTC",
   232  	"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   233  }`)
   234  	})
   235  
   236  	var b bytes.Buffer
   237  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   238  
   239  	err = cmdr.ConfigUnset("foo", []string{"FOO"})
   240  	assert.NoError(t, err)
   241  
   242  	assert.Equal(t, testutil.StripProgress(b.String()), `Removing config... done
   243  
   244  UUID                                    OWNER    NAME     VALUE   
   245  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    FLOAT    12.34      
   246  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    NCC      1701       
   247  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TEST     testing    
   248  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    TRUE     false      
   249  `, "output")
   250  }