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 }