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

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/drycc/controller-sdk-go/api"
    10  	"github.com/drycc/workflow-cli/pkg/testutil"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  type parseTagCase struct {
    15  	Input         string
    16  	Key           string
    17  	Value         string
    18  	ExpectedError bool
    19  	ExpectedMsg   string
    20  }
    21  
    22  func TestParseTag(t *testing.T) {
    23  	t.Parallel()
    24  
    25  	cases := []parseTagCase{
    26  		{"foo=bar", "foo", "bar", false, ""},
    27  		{"test=1", "test", "1", false, ""},
    28  		{"test", "", "", true, `test is invalid, Must be in format key=value
    29  Examples: rack=1 evironment=production`},
    30  		{"test=1=2", "", "", true, `test=1=2 is invalid, Must be in format key=value
    31  Examples: rack=1 evironment=production`},
    32  		{"test=", "", "", true, `test= is invalid, Must be in format key=value
    33  Examples: rack=1 evironment=production`},
    34  		{"=test", "", "", true, `=test is invalid, Must be in format key=value
    35  Examples: rack=1 evironment=production`},
    36  	}
    37  
    38  	for _, check := range cases {
    39  		key, value, err := parseTag(check.Input)
    40  		if check.ExpectedError {
    41  			assert.Equal(t, err.Error(), check.ExpectedMsg, "error")
    42  		} else {
    43  			assert.NoError(t, err)
    44  			assert.Equal(t, key, check.Key, "key")
    45  			assert.Equal(t, value, check.Value, "value")
    46  		}
    47  	}
    48  }
    49  
    50  type parseTagsCase struct {
    51  	Input         []string
    52  	ExpectedMap   map[string]interface{}
    53  	ExpectedError bool
    54  	ExpectedMsg   string
    55  }
    56  
    57  func TestParseTags(t *testing.T) {
    58  	t.Parallel()
    59  
    60  	cases := []parseTagsCase{
    61  		{[]string{"foo=bar", "true=false"}, map[string]interface{}{"foo": "bar", "true": "false"}, false, ""},
    62  		{[]string{"foo=", "true=false"}, nil, true, `foo= is invalid, Must be in format key=value
    63  Examples: rack=1 evironment=production`},
    64  	}
    65  
    66  	for _, check := range cases {
    67  		actual, err := parseTags(check.Input)
    68  		if check.ExpectedError {
    69  			assert.Equal(t, err.Error(), check.ExpectedMsg, "error")
    70  		} else {
    71  			assert.NoError(t, err)
    72  			assert.Equal(t, actual, check.ExpectedMap, "map")
    73  		}
    74  	}
    75  }
    76  
    77  func TestTagsList(t *testing.T) {
    78  	t.Parallel()
    79  	cf, server, err := testutil.NewTestServerAndClient()
    80  	if err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	defer server.Close()
    84  
    85  	server.Mux.HandleFunc("/v2/apps/enterprise/config/", func(w http.ResponseWriter, _ *http.Request) {
    86  		testutil.SetHeaders(w)
    87  		fmt.Fprintf(w, `{
    88  			"owner": "jkirk",
    89  			"app": "enterprise",
    90  			"values": {},
    91  			"memory": {},
    92  			"cpu": {},
    93  			"tags": {
    94  				"warp": "8",
    95  				"ncc": "1701"
    96  			},
    97  			"registry": {},
    98  			"created": "2014-01-01T00:00:00UTC",
    99  			"updated": "2014-01-01T00:00:00UTC",
   100  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   101  		}`)
   102  	})
   103  
   104  	var b bytes.Buffer
   105  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   106  
   107  	err = cmdr.TagsList("enterprise")
   108  	assert.NoError(t, err)
   109  	assert.Equal(t, b.String(), `UUID                                    OWNER    PTYPE    TAG  
   110  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    ncc      1701    
   111  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    warp     8       
   112  `, "output")
   113  }
   114  
   115  func TestTagsSet(t *testing.T) {
   116  	t.Parallel()
   117  	cf, server, err := testutil.NewTestServerAndClient()
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  	defer server.Close()
   122  
   123  	server.Mux.HandleFunc("/v2/apps/foo/config/", func(w http.ResponseWriter, r *http.Request) {
   124  		testutil.SetHeaders(w)
   125  		if r.Method == "POST" {
   126  			testutil.AssertBody(t, api.Config{
   127  				Tags: map[string]interface{}{
   128  					"true": "false",
   129  				},
   130  			}, r)
   131  		}
   132  
   133  		fmt.Fprintf(w, `{
   134  			"owner": "jkirk",
   135  			"app": "foo",
   136  			"values": {},
   137  			"memory": {},
   138  			"cpu": {},
   139  			"tags": {
   140  				"true": "false"
   141  			},
   142  			"registry": {},
   143  			"created": "2014-01-01T00:00:00UTC",
   144  			"updated": "2014-01-01T00:00:00UTC",
   145  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   146  		}`)
   147  	})
   148  
   149  	var b bytes.Buffer
   150  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   151  
   152  	err = cmdr.TagsSet("foo", []string{"true=false"})
   153  	assert.NoError(t, err)
   154  
   155  	assert.Equal(t, testutil.StripProgress(b.String()), `Applying tags... done
   156  
   157  UUID                                    OWNER    PTYPE    TAG   
   158  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    true     false    
   159  `, "output")
   160  }
   161  
   162  func TestTagsUnset(t *testing.T) {
   163  	t.Parallel()
   164  	cf, server, err := testutil.NewTestServerAndClient()
   165  	if err != nil {
   166  		t.Fatal(err)
   167  	}
   168  	defer server.Close()
   169  
   170  	server.Mux.HandleFunc("/v2/apps/foo/config/", func(w http.ResponseWriter, r *http.Request) {
   171  		testutil.SetHeaders(w)
   172  		if r.Method == "POST" {
   173  			testutil.AssertBody(t, api.Config{
   174  				Tags: map[string]interface{}{
   175  					"ncc": nil,
   176  				},
   177  			}, r)
   178  		}
   179  
   180  		fmt.Fprintf(w, `{
   181  			"owner": "jkirk",
   182  			"app": "foo",
   183  			"values": {},
   184  			"memory": {},
   185  			"cpu": {},
   186  			"tags": {
   187  				"warp": 8
   188  			},
   189  			"registry": {},
   190  			"created": "2014-01-01T00:00:00UTC",
   191  			"updated": "2014-01-01T00:00:00UTC",
   192  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
   193  		}`)
   194  	})
   195  
   196  	var b bytes.Buffer
   197  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   198  
   199  	err = cmdr.TagsUnset("foo", []string{"ncc"})
   200  	assert.NoError(t, err)
   201  
   202  	assert.Equal(t, testutil.StripProgress(b.String()), `Applying tags... done
   203  
   204  UUID                                    OWNER    PTYPE    TAG 
   205  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    jkirk    warp     8      
   206  `, "output")
   207  }