github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/routes_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 TestRoutesCreate(t *testing.T) {
    16  	t.Parallel()
    17  	cf, server, err := testutil.NewTestServerAndClient()
    18  	if err != nil {
    19  		t.Fatal(err)
    20  	}
    21  	defer server.Close()
    22  	var b bytes.Buffer
    23  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    24  
    25  	server.Mux.HandleFunc("/v2/apps/foo/routes/", func(w http.ResponseWriter, r *http.Request) {
    26  		testutil.AssertBody(t, api.RouteCreateRequest{Name: "example-go", Type: "web", Port: 443, Kind: "HTTPRoute"}, r)
    27  		testutil.SetHeaders(w)
    28  		w.WriteHeader(http.StatusCreated)
    29  		// Body isn't used by CLI, so it isn't set.
    30  		w.Write([]byte("{}"))
    31  	})
    32  
    33  	err = cmdr.RoutesCreate("foo", "example-go", "web", "HTTPRoute", 443)
    34  	assert.NoError(t, err)
    35  
    36  	assert.Equal(t, testutil.StripProgress(b.String()), "Adding route example-go to foo... done\n", "output")
    37  }
    38  
    39  func TestRoutesList(t *testing.T) {
    40  	t.Parallel()
    41  	cf, server, err := testutil.NewTestServerAndClient()
    42  	if err != nil {
    43  		t.Fatal(err)
    44  	}
    45  	defer server.Close()
    46  	var b bytes.Buffer
    47  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    48  
    49  	server.Mux.HandleFunc("/v2/apps/foo/routes/", func(w http.ResponseWriter, _ *http.Request) {
    50  		testutil.SetHeaders(w)
    51  		fmt.Fprintf(w, `{
    52      "count": 1,
    53      "next": null,
    54      "previous": null,
    55      "results": [
    56          {
    57              "app": "example-go",
    58              "created": "2023-04-19T00:00:00UTC",
    59              "owner": "test",
    60              "updated": "2023-04-19T00:00:00UTC",
    61              "name": "example-go",
    62              "procfile_type": "web",
    63              "kind": "HTTPRoute",
    64              "port": 80,
    65              "parent_refs": [
    66                  {
    67                      "name": "example-go",
    68                      "port": 80
    69                  }
    70              ]
    71          }
    72      ]
    73  }`)
    74  	})
    75  
    76  	err = cmdr.RoutesList("foo", -1)
    77  	assert.NoError(t, err)
    78  
    79  	assert.Equal(t, b.String(), `NAME          OWNER    PTYPE    KIND         SERVICE-PORT    GATEWAY       LISTENER-PORT 
    80  example-go    test     web      HTTPRoute    80              example-go    80               
    81  `, "output")
    82  }
    83  
    84  func TestRoutesAttach(t *testing.T) {
    85  	t.Parallel()
    86  	cf, server, err := testutil.NewTestServerAndClient()
    87  	if err != nil {
    88  		t.Fatal(err)
    89  	}
    90  	defer server.Close()
    91  	var b bytes.Buffer
    92  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    93  
    94  	server.Mux.HandleFunc("/v2/apps/foo/routes/example-go/attach/", func(w http.ResponseWriter, r *http.Request) {
    95  		testutil.AssertBody(t, api.RouteAttackRequest{Port: 4443, Gateway: "example-go"}, r)
    96  		testutil.SetHeaders(w)
    97  		w.WriteHeader(http.StatusCreated)
    98  		// Body isn't used by CLI, so it isn't set.
    99  		w.Write([]byte("{}"))
   100  	})
   101  
   102  	err = cmdr.RoutesAttach("foo", "example-go", 4443, "example-go")
   103  	assert.NoError(t, err)
   104  
   105  	assert.Equal(t, testutil.StripProgress(b.String()), "Attaching route example-go to gateway example-go... done\n", "output")
   106  }
   107  func TestRoutesDetach(t *testing.T) {
   108  	t.Parallel()
   109  	cf, server, err := testutil.NewTestServerAndClient()
   110  	if err != nil {
   111  		t.Fatal(err)
   112  	}
   113  	defer server.Close()
   114  	var b bytes.Buffer
   115  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   116  
   117  	server.Mux.HandleFunc("/v2/apps/foo/routes/example-go/detach/", func(w http.ResponseWriter, r *http.Request) {
   118  		testutil.AssertBody(t, api.RouteDetackRequest{Port: 4443, Gateway: "example-go"}, r)
   119  		testutil.SetHeaders(w)
   120  		w.WriteHeader(http.StatusCreated)
   121  		// Body isn't used by CLI, so it isn't set.
   122  		w.Write([]byte("{}"))
   123  	})
   124  
   125  	err = cmdr.RoutesDetach("foo", "example-go", 4443, "example-go")
   126  	assert.NoError(t, err)
   127  
   128  	assert.Equal(t, testutil.StripProgress(b.String()), "Detaching route example-go to gateway example-go... done\n", "output")
   129  }
   130  
   131  func TestRouteGet(t *testing.T) {
   132  	t.Parallel()
   133  	cf, server, err := testutil.NewTestServerAndClient()
   134  	if err != nil {
   135  		t.Fatal(err)
   136  	}
   137  	defer server.Close()
   138  	var b bytes.Buffer
   139  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   140  
   141  	server.Mux.HandleFunc("/v2/apps/foo/routes/example-go/rules/", func(w http.ResponseWriter, _ *http.Request) {
   142  		testutil.SetHeaders(w)
   143  		fmt.Fprintf(w, `{
   144    "stable": [
   145      {
   146        "backendRefs": [
   147          {
   148            "group": "",
   149            "kind": "Service",
   150            "name": "example-go",
   151            "port": 1234,
   152            "weight": 1
   153          }
   154        ],
   155        "matches": [
   156          {
   157            "path": {
   158              "type": "PathPrefix",
   159              "value": "/get"
   160            }
   161          }
   162        ]
   163      }
   164    ]
   165  }`)
   166  	})
   167  
   168  	err = cmdr.RoutesGet("foo", "example-go")
   169  	assert.NoError(t, err)
   170  
   171  	assert.Equal(t, b.String(), `stable:
   172  - backendRefs:
   173    - group: ""
   174      kind: Service
   175      name: example-go
   176      port: 1234
   177      weight: 1
   178    matches:
   179    - path:
   180        type: PathPrefix
   181        value: /get
   182  
   183  `, "output")
   184  }
   185  
   186  func TestRoutesSet(t *testing.T) {
   187  	t.Parallel()
   188  	cf, server, err := testutil.NewTestServerAndClient()
   189  	if err != nil {
   190  		t.Fatal(err)
   191  	}
   192  	defer server.Close()
   193  	var b bytes.Buffer
   194  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   195  
   196  	server.Mux.HandleFunc("/v2/apps/foo/routes/example-go/rules/", func(w http.ResponseWriter, _ *http.Request) {
   197  		testutil.SetHeaders(w)
   198  		w.WriteHeader(http.StatusNoContent)
   199  		w.Write([]byte(""))
   200  	})
   201  	ruleFile, err := os.CreateTemp("", "rules.yaml")
   202  	rules := `
   203  stable:
   204  - backendRefs:
   205    - group: ""
   206      kind: Service
   207      name: example-go
   208      port: 1234
   209      weight: 1
   210    matches:
   211    - path:
   212        type: PathPrefix
   213        value: /get`
   214  	assert.NoError(t, err)
   215  	defer os.Remove(ruleFile.Name())
   216  	_, err = ruleFile.Write([]byte(rules))
   217  	assert.NoError(t, err)
   218  	ruleFile.Close()
   219  	err = cmdr.RoutesSet("foo", "example-go", ruleFile.Name())
   220  	assert.NoError(t, err)
   221  
   222  	assert.Equal(t, testutil.StripProgress(b.String()), "Applying rules... done\n", "output")
   223  }
   224  
   225  func TestRoutesRemove(t *testing.T) {
   226  	t.Parallel()
   227  	cf, server, err := testutil.NewTestServerAndClient()
   228  	if err != nil {
   229  		t.Fatal(err)
   230  	}
   231  	defer server.Close()
   232  	var b bytes.Buffer
   233  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   234  
   235  	server.Mux.HandleFunc("/v2/apps/foo/routes/example-go/", func(w http.ResponseWriter, _ *http.Request) {
   236  		testutil.SetHeaders(w)
   237  		w.WriteHeader(http.StatusNoContent)
   238  	})
   239  
   240  	err = cmdr.RoutesRemove("foo", "example-go")
   241  	assert.NoError(t, err)
   242  
   243  	assert.Equal(t, testutil.StripProgress(b.String()), "Removing route example-go to foo... done\n", "output")
   244  }