// Copyright (c) 2012-2016 The Revel Framework Authors, All rights reserved. // Revel Framework source code and usage is governed by a MIT style // license that can be found in the LICENSE file. package testing import ( "bytes" "fmt" "net/http" "net/http/httptest" "net/url" "os" "path/filepath" "strings" "testing" "time" "github.com/revel/revel" "github.com/revel/revel/session" ) func TestMisc(t *testing.T) { testSuite := createNewTestSuite(t) // test Host value if !strings.EqualFold("127.0.0.1:9001", testSuite.Host()) { t.Error("Incorrect Host value found.") } // test BaseUrl if !strings.EqualFold("http://127.0.0.1:9001", testSuite.BaseUrl()) { t.Error("Incorrect BaseUrl http value found.") } revel.HTTPSsl = true if !strings.EqualFold("https://127.0.0.1:9001", testSuite.BaseUrl()) { t.Error("Incorrect BaseUrl https value found.") } revel.HTTPSsl = false // test WebSocketUrl if !strings.EqualFold("ws://127.0.0.1:9001", testSuite.WebSocketUrl()) { t.Error("Incorrect WebSocketUrl value found.") } testSuite.AssertNotEqual("Yes", "No") testSuite.Assert(true) } func TestGet(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Get("/") testSuite.AssertOk() testSuite.AssertContains("this is testcase homepage") testSuite.AssertNotContains("not exists") } func TestGetNotFound(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Get("/notfound") testSuite.AssertNotFound() // testSuite.AssertContains("this is testcase homepage") // testSuite.AssertNotContains("not exists") } // This test is known to fail func TestGetCustom(t *testing.T) { testSuite := createNewTestSuite(t) for x := 0; x < 5; x++ { testSuite.GetCustom("http://httpbin.org/get").Send() if testSuite.Response.StatusCode == http.StatusOK { break } println("Failed request from http://httpbin.org/get", testSuite.Response.StatusCode) } testSuite.AssertOk() testSuite.AssertContentType("application/json") testSuite.AssertContains("httpbin.org") testSuite.AssertContainsRegex("gzip|deflate") } func TestDelete(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Delete("/purchases/10001") testSuite.AssertOk() } func TestPut(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Put("/purchases/10002", "application/json", bytes.NewReader([]byte(`{"sku":"163645GHT", "desc":"This is test product"}`)), ) testSuite.AssertStatus(http.StatusNoContent) } func TestPutForm(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) data := url.Values{} data.Add("name", "beacon1name") data.Add("value", "beacon1value") testSuite.PutForm("/send", data) testSuite.AssertStatus(http.StatusNoContent) } func TestPatch(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Patch("/purchases/10003", "application/json", bytes.NewReader([]byte(`{"desc": "This is test patch for product"}`)), ) testSuite.AssertStatus(http.StatusNoContent) } func TestPost(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) testSuite.Post("/login", "application/json", bytes.NewReader([]byte(`{"username":"testuser", "password":"testpass"}`)), ) testSuite.AssertOk() testSuite.AssertContains("login successful") } func TestPostForm(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) data := url.Values{} data.Add("username", "testuser") data.Add("password", "testpassword") testSuite.PostForm("/login", data) testSuite.AssertOk() testSuite.AssertContains("login successful") } func TestPostFileUpload(t *testing.T) { ts := createTestServer(testHandle) defer ts.Close() testSuite := createNewTestSuite(t) params := url.Values{} params.Add("first_name", "Jeevanandam") params.Add("last_name", "M.") currentDir, _ := os.Getwd() basePath := filepath.Dir(currentDir) filePaths := url.Values{} filePaths.Add("revel_file", filepath.Join(basePath, "revel.go")) filePaths.Add("server_file", filepath.Join(basePath, "server.go")) filePaths.Add("readme_file", filepath.Join(basePath, "README.md")) testSuite.PostFile("/upload", params, filePaths) testSuite.AssertOk() testSuite.AssertContains("File: revel.go") testSuite.AssertContains("File: server.go") testSuite.AssertNotContains("File: not_exists.go") testSuite.AssertEqual("text/plain; charset=utf-8", testSuite.Response.Header.Get("Content-Type")) } func createNewTestSuite(t *testing.T) *TestSuite { suite := NewTestSuite() if suite.Client == nil || suite.SessionEngine == nil { t.Error("Unable to create a testsuite") } return &suite } func testHandle(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { if r.URL.Path == "/" { _, _ = w.Write([]byte(`this is testcase homepage`)) return } } if r.Method == "POST" { if r.URL.Path == "/login" { http.SetCookie(w, &http.Cookie{ Name: session.SessionCookieSuffix, Value: "This is simple session value", Path: "/", HttpOnly: true, Secure: false, Expires: time.Now().Add(time.Minute * 5).UTC(), }) w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{ "id": "success", "message": "login successful" }`)) return } handleFileUpload(w, r) return } if r.Method == "DELETE" { if r.URL.Path == "/purchases/10001" { w.WriteHeader(http.StatusOK) return } } if r.Method == "PUT" { if r.URL.Path == "/purchases/10002" { w.WriteHeader(http.StatusNoContent) return } if r.URL.Path == "/send" { w.WriteHeader(http.StatusNoContent) return } } if r.Method == "PATCH" { if r.URL.Path == "/purchases/10003" { w.WriteHeader(http.StatusNoContent) return } } w.WriteHeader(http.StatusNotFound) } func handleFileUpload(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/upload" { _ = r.ParseMultipartForm(10e6) var buf bytes.Buffer for _, fhdrs := range r.MultipartForm.File { for _, hdr := range fhdrs { dotPos := strings.LastIndex(hdr.Filename, ".") fname := fmt.Sprintf("%s-%v%s", hdr.Filename[:dotPos], time.Now().Unix(), hdr.Filename[dotPos:]) _, _ = buf.WriteString(fmt.Sprintf( "Firstname: %v\nLastname: %v\nFile: %v\nHeader: %v\nUploaded as: %v\n", r.FormValue("first_name"), r.FormValue("last_name"), hdr.Filename, hdr.Header, fname)) } } _, _ = w.Write(buf.Bytes()) return } } func createTestServer(fn func(w http.ResponseWriter, r *http.Request)) *httptest.Server { testServer := httptest.NewServer(http.HandlerFunc(fn)) revel.ServerEngineInit.Address = testServer.URL[7:] return testServer } func init() { if revel.ServerEngineInit == nil { revel.ServerEngineInit = &revel.EngineInit{ Address: ":9001", Network: "http", Port: 9001, } } }