github.com/rochacon/deis@v1.0.2-0.20150903015341-6839b592a1ff/client/controller/models/apps/apps_test.go (about) 1 package apps 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net/http" 7 "net/http/httptest" 8 "net/url" 9 "reflect" 10 "testing" 11 12 "github.com/deis/deis/client/controller/api" 13 "github.com/deis/deis/client/controller/client" 14 "github.com/deis/deis/version" 15 ) 16 17 const appFixture string = ` 18 { 19 "created": "2014-01-01T00:00:00UTC", 20 "id": "example-go", 21 "owner": "test", 22 "structure": {}, 23 "updated": "2014-01-01T00:00:00UTC", 24 "url": "example-go.example.com", 25 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75" 26 }` 27 28 const appsFixture string = ` 29 { 30 "count": 1, 31 "next": null, 32 "previous": null, 33 "results": [ 34 { 35 "created": "2014-01-01T00:00:00UTC", 36 "id": "example-go", 37 "owner": "test", 38 "structure": {}, 39 "updated": "2014-01-01T00:00:00UTC", 40 "url": "example-go.example.com", 41 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75" 42 } 43 ] 44 }` 45 46 const appCreateExpected string = `{"id":"example-go"}` 47 const appRunExpected string = `{"command":"echo hi"}` 48 49 type fakeHTTPServer struct { 50 createID bool 51 createWithoutID bool 52 } 53 54 func (f *fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) { 55 res.Header().Add("DEIS_API_VERSION", version.APIVersion) 56 57 if req.URL.Path == "/v1/apps/" && req.Method == "POST" { 58 body, err := ioutil.ReadAll(req.Body) 59 60 if err != nil { 61 fmt.Println(err) 62 res.WriteHeader(http.StatusInternalServerError) 63 res.Write(nil) 64 } 65 66 if string(body) == appCreateExpected && f.createID == false { 67 f.createID = true 68 res.WriteHeader(http.StatusCreated) 69 res.Write([]byte(appFixture)) 70 return 71 } else if string(body) == "" && f.createWithoutID == false { 72 f.createWithoutID = true 73 res.WriteHeader(http.StatusCreated) 74 res.Write([]byte(appFixture)) 75 return 76 } 77 78 fmt.Printf("Unexpected Body: %s'\n", body) 79 res.WriteHeader(http.StatusInternalServerError) 80 res.Write(nil) 81 return 82 } 83 84 if req.URL.Path == "/v1/apps/" && req.Method == "GET" { 85 res.Write([]byte(appsFixture)) 86 return 87 } 88 89 if req.URL.Path == "/v1/apps/example-go/" && req.Method == "GET" { 90 res.Write([]byte(appFixture)) 91 return 92 } 93 94 if req.URL.Path == "/v1/apps/example-go/" && req.Method == "DELETE" { 95 res.WriteHeader(http.StatusNoContent) 96 res.Write(nil) 97 return 98 } 99 100 if req.URL.Path == "/v1/apps/example-go/logs" && req.URL.RawQuery == "" && req.Method == "GET" { 101 res.Write([]byte("test\nfoo\nbar\n")) 102 return 103 } 104 105 if req.URL.Path == "/v1/apps/example-go/logs" && req.URL.RawQuery == "log_lines=1" && req.Method == "GET" { 106 res.Write([]byte("test\n")) 107 return 108 } 109 110 if req.URL.Path == "/v1/apps/example-go/run" && req.Method == "POST" { 111 body, err := ioutil.ReadAll(req.Body) 112 113 if err != nil { 114 fmt.Println(err) 115 res.WriteHeader(http.StatusInternalServerError) 116 res.Write(nil) 117 } 118 119 if string(body) != appRunExpected { 120 fmt.Printf("Expected '%s', Got '%s'\n", appRunExpected, body) 121 res.WriteHeader(http.StatusInternalServerError) 122 res.Write(nil) 123 return 124 } 125 126 res.Write([]byte(`[0,"hi\n"]`)) 127 return 128 } 129 130 fmt.Printf("Unrecongized URL %s\n", req.URL) 131 res.WriteHeader(http.StatusNotFound) 132 res.Write(nil) 133 } 134 135 func TestAppsCreate(t *testing.T) { 136 t.Parallel() 137 138 expected := api.App{ 139 ID: "example-go", 140 Created: "2014-01-01T00:00:00UTC", 141 Owner: "test", 142 Updated: "2014-01-01T00:00:00UTC", 143 URL: "example-go.example.com", 144 UUID: "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 145 } 146 147 handler := fakeHTTPServer{createID: false, createWithoutID: false} 148 server := httptest.NewServer(&handler) 149 defer server.Close() 150 151 u, err := url.Parse(server.URL) 152 153 if err != nil { 154 t.Fatal(err) 155 } 156 157 httpClient := client.CreateHTTPClient(false) 158 159 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 160 161 for _, id := range []string{"example-go", ""} { 162 actual, err := New(&client, id) 163 164 if err != nil { 165 t.Fatal(err) 166 } 167 168 if !reflect.DeepEqual(expected, actual) { 169 t.Errorf("Expected %v, Got %v", expected, actual) 170 } 171 } 172 } 173 174 func TestAppsGet(t *testing.T) { 175 t.Parallel() 176 177 expected := api.App{ 178 ID: "example-go", 179 Created: "2014-01-01T00:00:00UTC", 180 Owner: "test", 181 Updated: "2014-01-01T00:00:00UTC", 182 URL: "example-go.example.com", 183 UUID: "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 184 } 185 186 handler := fakeHTTPServer{} 187 server := httptest.NewServer(&handler) 188 defer server.Close() 189 190 u, err := url.Parse(server.URL) 191 192 if err != nil { 193 t.Fatal(err) 194 } 195 196 httpClient := client.CreateHTTPClient(false) 197 198 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 199 200 actual, err := Get(&client, "example-go") 201 202 if err != nil { 203 t.Fatal(err) 204 } 205 206 if !reflect.DeepEqual(expected, actual) { 207 t.Errorf("Expected %v, Got %v", expected, actual) 208 } 209 } 210 211 func TestAppsDestroy(t *testing.T) { 212 t.Parallel() 213 214 handler := fakeHTTPServer{} 215 server := httptest.NewServer(&handler) 216 defer server.Close() 217 218 u, err := url.Parse(server.URL) 219 220 if err != nil { 221 t.Fatal(err) 222 } 223 224 httpClient := client.CreateHTTPClient(false) 225 226 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 227 228 if err = Delete(&client, "example-go"); err != nil { 229 t.Fatal(err) 230 } 231 } 232 233 func TestAppsRun(t *testing.T) { 234 t.Parallel() 235 236 expected := api.AppRunResponse{ 237 Output: "hi\n", 238 ReturnCode: 0, 239 } 240 241 handler := fakeHTTPServer{} 242 server := httptest.NewServer(&handler) 243 defer server.Close() 244 245 u, err := url.Parse(server.URL) 246 247 if err != nil { 248 t.Fatal(err) 249 } 250 251 httpClient := client.CreateHTTPClient(false) 252 253 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 254 255 actual, err := Run(&client, "example-go", "echo hi") 256 257 if err != nil { 258 t.Fatal(err) 259 } 260 261 if !reflect.DeepEqual(expected, actual) { 262 t.Errorf("Expected %v, Got %v", expected, actual) 263 } 264 } 265 266 func TestAppsList(t *testing.T) { 267 t.Parallel() 268 269 expected := []api.App{ 270 api.App{ 271 ID: "example-go", 272 Created: "2014-01-01T00:00:00UTC", 273 Owner: "test", 274 Updated: "2014-01-01T00:00:00UTC", 275 URL: "example-go.example.com", 276 UUID: "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 277 }, 278 } 279 280 handler := fakeHTTPServer{} 281 server := httptest.NewServer(&handler) 282 defer server.Close() 283 284 u, err := url.Parse(server.URL) 285 286 if err != nil { 287 t.Fatal(err) 288 } 289 290 httpClient := client.CreateHTTPClient(false) 291 292 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 293 294 actual, _, err := List(&client, 100) 295 296 if err != nil { 297 t.Fatal(err) 298 } 299 300 if !reflect.DeepEqual(expected, actual) { 301 t.Errorf("Expected %v, Got %v", expected, actual) 302 } 303 } 304 305 type testExpected struct { 306 Input int 307 Expected string 308 } 309 310 func TestAppsLogs(t *testing.T) { 311 t.Parallel() 312 313 tests := []testExpected{ 314 testExpected{ 315 Input: -1, 316 Expected: "test\nfoo\nbar\n", 317 }, 318 testExpected{ 319 Input: 1, 320 Expected: "test\n", 321 }, 322 } 323 324 handler := fakeHTTPServer{} 325 server := httptest.NewServer(&handler) 326 defer server.Close() 327 328 u, err := url.Parse(server.URL) 329 330 if err != nil { 331 t.Fatal(err) 332 } 333 334 httpClient := client.CreateHTTPClient(false) 335 336 client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"} 337 338 for _, test := range tests { 339 actual, err := Logs(&client, "example-go", test.Input) 340 341 if err != nil { 342 t.Error(err) 343 } 344 345 if actual != test.Expected { 346 t.Errorf("Expected %s, Got %s", test.Expected, actual) 347 } 348 } 349 }