github.com/greenboxal/deis@v1.12.1/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  const appTransferExpected string = `{"owner":"test"}`
    49  
    50  type fakeHTTPServer struct {
    51  	createID        bool
    52  	createWithoutID bool
    53  }
    54  
    55  func (f *fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
    56  	res.Header().Add("DEIS_API_VERSION", version.APIVersion)
    57  
    58  	if req.URL.Path == "/v1/apps/" && req.Method == "POST" {
    59  		body, err := ioutil.ReadAll(req.Body)
    60  
    61  		if err != nil {
    62  			fmt.Println(err)
    63  			res.WriteHeader(http.StatusInternalServerError)
    64  			res.Write(nil)
    65  		}
    66  
    67  		if string(body) == appCreateExpected && f.createID == false {
    68  			f.createID = true
    69  			res.WriteHeader(http.StatusCreated)
    70  			res.Write([]byte(appFixture))
    71  			return
    72  		} else if string(body) == "" && f.createWithoutID == false {
    73  			f.createWithoutID = true
    74  			res.WriteHeader(http.StatusCreated)
    75  			res.Write([]byte(appFixture))
    76  			return
    77  		}
    78  
    79  		fmt.Printf("Unexpected Body: %s'\n", body)
    80  		res.WriteHeader(http.StatusInternalServerError)
    81  		res.Write(nil)
    82  		return
    83  	}
    84  
    85  	if req.URL.Path == "/v1/apps/" && req.Method == "GET" {
    86  		res.Write([]byte(appsFixture))
    87  		return
    88  	}
    89  
    90  	if req.URL.Path == "/v1/apps/example-go/" && req.Method == "GET" {
    91  		res.Write([]byte(appFixture))
    92  		return
    93  	}
    94  
    95  	if req.URL.Path == "/v1/apps/example-go/" && req.Method == "DELETE" {
    96  		res.WriteHeader(http.StatusNoContent)
    97  		res.Write(nil)
    98  		return
    99  	}
   100  
   101  	if req.URL.Path == "/v1/apps/example-go/logs" && req.URL.RawQuery == "" && req.Method == "GET" {
   102  		res.Write([]byte("test\nfoo\nbar\n"))
   103  		return
   104  	}
   105  
   106  	if req.URL.Path == "/v1/apps/example-go/logs" && req.URL.RawQuery == "log_lines=1" && req.Method == "GET" {
   107  		res.Write([]byte("test\n"))
   108  		return
   109  	}
   110  
   111  	if req.URL.Path == "/v1/apps/example-go/run" && req.Method == "POST" {
   112  		body, err := ioutil.ReadAll(req.Body)
   113  
   114  		if err != nil {
   115  			fmt.Println(err)
   116  			res.WriteHeader(http.StatusInternalServerError)
   117  			res.Write(nil)
   118  		}
   119  
   120  		if string(body) != appRunExpected {
   121  			fmt.Printf("Expected '%s', Got '%s'\n", appRunExpected, body)
   122  			res.WriteHeader(http.StatusInternalServerError)
   123  			res.Write(nil)
   124  			return
   125  		}
   126  
   127  		res.Write([]byte(`[0,"hi\n"]`))
   128  		return
   129  	}
   130  
   131  	if req.URL.Path == "/v1/apps/example-go/" && req.Method == "POST" {
   132  		body, err := ioutil.ReadAll(req.Body)
   133  
   134  		if err != nil {
   135  			fmt.Println(err)
   136  			res.WriteHeader(http.StatusInternalServerError)
   137  			res.Write(nil)
   138  		}
   139  
   140  		if string(body) != appTransferExpected {
   141  			fmt.Printf("Expected '%s', Got '%s'\n", appTransferExpected, body)
   142  			res.WriteHeader(http.StatusInternalServerError)
   143  			res.Write(nil)
   144  			return
   145  		}
   146  
   147  		res.WriteHeader(http.StatusNoContent)
   148  		res.Write(nil)
   149  		return
   150  	}
   151  
   152  	fmt.Printf("Unrecongized URL %s\n", req.URL)
   153  	res.WriteHeader(http.StatusNotFound)
   154  	res.Write(nil)
   155  }
   156  
   157  func TestAppsCreate(t *testing.T) {
   158  	t.Parallel()
   159  
   160  	expected := api.App{
   161  		ID:      "example-go",
   162  		Created: "2014-01-01T00:00:00UTC",
   163  		Owner:   "test",
   164  		Updated: "2014-01-01T00:00:00UTC",
   165  		URL:     "example-go.example.com",
   166  		UUID:    "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   167  	}
   168  
   169  	handler := fakeHTTPServer{createID: false, createWithoutID: false}
   170  	server := httptest.NewServer(&handler)
   171  	defer server.Close()
   172  
   173  	u, err := url.Parse(server.URL)
   174  
   175  	if err != nil {
   176  		t.Fatal(err)
   177  	}
   178  
   179  	httpClient := client.CreateHTTPClient(false)
   180  
   181  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   182  
   183  	for _, id := range []string{"example-go", ""} {
   184  		actual, err := New(&client, id)
   185  
   186  		if err != nil {
   187  			t.Fatal(err)
   188  		}
   189  
   190  		if !reflect.DeepEqual(expected, actual) {
   191  			t.Errorf("Expected %v, Got %v", expected, actual)
   192  		}
   193  	}
   194  }
   195  
   196  func TestAppsGet(t *testing.T) {
   197  	t.Parallel()
   198  
   199  	expected := api.App{
   200  		ID:      "example-go",
   201  		Created: "2014-01-01T00:00:00UTC",
   202  		Owner:   "test",
   203  		Updated: "2014-01-01T00:00:00UTC",
   204  		URL:     "example-go.example.com",
   205  		UUID:    "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   206  	}
   207  
   208  	handler := fakeHTTPServer{}
   209  	server := httptest.NewServer(&handler)
   210  	defer server.Close()
   211  
   212  	u, err := url.Parse(server.URL)
   213  
   214  	if err != nil {
   215  		t.Fatal(err)
   216  	}
   217  
   218  	httpClient := client.CreateHTTPClient(false)
   219  
   220  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   221  
   222  	actual, err := Get(&client, "example-go")
   223  
   224  	if err != nil {
   225  		t.Fatal(err)
   226  	}
   227  
   228  	if !reflect.DeepEqual(expected, actual) {
   229  		t.Errorf("Expected %v, Got %v", expected, actual)
   230  	}
   231  }
   232  
   233  func TestAppsDestroy(t *testing.T) {
   234  	t.Parallel()
   235  
   236  	handler := fakeHTTPServer{}
   237  	server := httptest.NewServer(&handler)
   238  	defer server.Close()
   239  
   240  	u, err := url.Parse(server.URL)
   241  
   242  	if err != nil {
   243  		t.Fatal(err)
   244  	}
   245  
   246  	httpClient := client.CreateHTTPClient(false)
   247  
   248  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   249  
   250  	if err = Delete(&client, "example-go"); err != nil {
   251  		t.Fatal(err)
   252  	}
   253  }
   254  
   255  func TestAppsRun(t *testing.T) {
   256  	t.Parallel()
   257  
   258  	expected := api.AppRunResponse{
   259  		Output:     "hi\n",
   260  		ReturnCode: 0,
   261  	}
   262  
   263  	handler := fakeHTTPServer{}
   264  	server := httptest.NewServer(&handler)
   265  	defer server.Close()
   266  
   267  	u, err := url.Parse(server.URL)
   268  
   269  	if err != nil {
   270  		t.Fatal(err)
   271  	}
   272  
   273  	httpClient := client.CreateHTTPClient(false)
   274  
   275  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   276  
   277  	actual, err := Run(&client, "example-go", "echo hi")
   278  
   279  	if err != nil {
   280  		t.Fatal(err)
   281  	}
   282  
   283  	if !reflect.DeepEqual(expected, actual) {
   284  		t.Errorf("Expected %v, Got %v", expected, actual)
   285  	}
   286  }
   287  
   288  func TestAppsList(t *testing.T) {
   289  	t.Parallel()
   290  
   291  	expected := []api.App{
   292  		api.App{
   293  			ID:      "example-go",
   294  			Created: "2014-01-01T00:00:00UTC",
   295  			Owner:   "test",
   296  			Updated: "2014-01-01T00:00:00UTC",
   297  			URL:     "example-go.example.com",
   298  			UUID:    "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   299  		},
   300  	}
   301  
   302  	handler := fakeHTTPServer{}
   303  	server := httptest.NewServer(&handler)
   304  	defer server.Close()
   305  
   306  	u, err := url.Parse(server.URL)
   307  
   308  	if err != nil {
   309  		t.Fatal(err)
   310  	}
   311  
   312  	httpClient := client.CreateHTTPClient(false)
   313  
   314  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   315  
   316  	actual, _, err := List(&client, 100)
   317  
   318  	if err != nil {
   319  		t.Fatal(err)
   320  	}
   321  
   322  	if !reflect.DeepEqual(expected, actual) {
   323  		t.Errorf("Expected %v, Got %v", expected, actual)
   324  	}
   325  }
   326  
   327  type testExpected struct {
   328  	Input    int
   329  	Expected string
   330  }
   331  
   332  func TestAppsLogs(t *testing.T) {
   333  	t.Parallel()
   334  
   335  	tests := []testExpected{
   336  		testExpected{
   337  			Input:    -1,
   338  			Expected: "test\nfoo\nbar\n",
   339  		},
   340  		testExpected{
   341  			Input:    1,
   342  			Expected: "test\n",
   343  		},
   344  	}
   345  
   346  	handler := fakeHTTPServer{}
   347  	server := httptest.NewServer(&handler)
   348  	defer server.Close()
   349  
   350  	u, err := url.Parse(server.URL)
   351  
   352  	if err != nil {
   353  		t.Fatal(err)
   354  	}
   355  
   356  	httpClient := client.CreateHTTPClient(false)
   357  
   358  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   359  
   360  	for _, test := range tests {
   361  		actual, err := Logs(&client, "example-go", test.Input)
   362  
   363  		if err != nil {
   364  			t.Error(err)
   365  		}
   366  
   367  		if actual != test.Expected {
   368  			t.Errorf("Expected %s, Got %s", test.Expected, actual)
   369  		}
   370  	}
   371  }
   372  
   373  func TestAppsTransfer(t *testing.T) {
   374  	t.Parallel()
   375  
   376  	handler := fakeHTTPServer{}
   377  	server := httptest.NewServer(&handler)
   378  	defer server.Close()
   379  
   380  	u, err := url.Parse(server.URL)
   381  
   382  	if err != nil {
   383  		t.Fatal(err)
   384  	}
   385  
   386  	httpClient := client.CreateHTTPClient(false)
   387  
   388  	client := client.Client{HTTPClient: httpClient, ControllerURL: *u, Token: "abc"}
   389  
   390  	if err = Transfer(&client, "example-go", "test"); err != nil {
   391  		t.Fatal(err)
   392  	}
   393  }