influxdb/handler_test.go

728 lines
21 KiB
Go
Raw Normal View History

2014-11-19 17:12:46 +00:00
package influxdb_test
import (
"bytes"
"encoding/base64"
"fmt"
2014-11-20 11:25:08 +00:00
"io/ioutil"
2014-11-19 17:12:46 +00:00
"net/http"
"net/http/httptest"
2014-12-29 23:12:51 +00:00
"net/url"
2014-11-20 11:25:08 +00:00
"strings"
2014-11-19 17:12:46 +00:00
"testing"
2014-11-20 11:25:08 +00:00
"time"
2014-12-30 15:50:15 +00:00
2014-11-19 17:12:46 +00:00
"github.com/influxdb/influxdb"
)
2014-11-26 22:10:56 +00:00
func init() {
influxdb.BcryptCost = 4
}
2014-11-21 14:27:59 +00:00
func TestHandler_Databases(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
srvr.CreateDatabase("bar")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("GET", s.URL+`/db`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
2014-12-23 06:18:05 +00:00
} else if body != `["bar","foo"]` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateDatabase(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("POST", s.URL+`/db`, `{"name": "foo"}`)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusCreated {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateDatabase_BadRequest_NoName(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("POST", s.URL+`/db`, `{"BadRequest": 1}`)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `database name required` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateDatabase_BadRequest_InvalidJSON(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("POST", s.URL+`/db`, `"BadRequest": 1`)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `json: cannot unmarshal string into Go value of type struct { Name string "json:\"name\"" }` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateDatabase_Conflict(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("POST", s.URL+`/db`, `{"name": "foo"}`)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusConflict {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `database exists` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_DeleteDatabase(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("DELETE", s.URL+`/db/foo`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNoContent {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "" {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_DeleteDatabase_NotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("DELETE", s.URL+`/db/foo`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `database not found` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-11-19 17:12:46 +00:00
func TestHandler_Shards(t *testing.T) {
2014-11-20 11:25:08 +00:00
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
2014-12-23 06:18:05 +00:00
srvr.CreateRetentionPolicy("foo", influxdb.NewRetentionPolicy("bar"))
srvr.CreateShardsIfNotExists("foo", "bar", time.Time{})
2014-11-20 16:02:21 +00:00
s := NewHTTPServer(srvr)
2014-11-19 17:12:46 +00:00
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("GET", s.URL+`/db/foo/shards`, "")
2014-11-20 11:25:08 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `[{"id":3,"startTime":"0001-01-01T00:00:00Z","endTime":"0001-01-01T00:00:00Z"}]` {
2014-11-20 11:25:08 +00:00
t.Fatalf("unexpected body: %s", body)
2014-11-19 17:12:46 +00:00
}
}
2014-11-21 14:27:59 +00:00
func TestHandler_Shards_DatabaseNotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("GET", s.URL+`/db/foo/shards`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `database not found` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-11-20 11:25:08 +00:00
func TestHandler_RetentionPolicies(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
2014-12-23 06:18:05 +00:00
srvr.CreateRetentionPolicy("foo", influxdb.NewRetentionPolicy("bar"))
2014-11-20 16:02:21 +00:00
s := NewHTTPServer(srvr)
2014-11-19 18:30:39 +00:00
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("GET", s.URL+`/db/foo/retention_policies`, "")
2014-12-21 17:45:50 +00:00
2014-11-20 11:25:08 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `[{"name":"bar","replicaN":1,"splitN":1}]` {
2014-11-20 11:25:08 +00:00
t.Fatalf("unexpected body: %s", body)
2014-11-19 18:30:39 +00:00
}
}
2014-11-21 14:27:59 +00:00
func TestHandler_RetentionPolicies_DatabaseNotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("GET", s.URL+`/db/foo/retention_policies`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `database not found` {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateRetentionPolicy(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
policy := `{"name": "bar", "duration": 1000000, "replicaN": 1, "splitN": 2}`
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("POST", s.URL+`/db/foo/retention_policies`, policy)
2014-12-21 17:45:50 +00:00
if status != http.StatusCreated {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "" {
t.Fatalf("unexpected body: %s", body)
}
}
2014-11-21 14:27:59 +00:00
func TestHandler_CreateRetentionPolicy_DatabaseNotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
policy := `{"name": "bar", "duration": 1000000, "replicaN": 1, "splitN": 2}`
status, body := MustHTTP("POST", s.URL+`/db/foo/retention_policies`, policy)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "database not found" {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateRetentionPolicy_Conflict(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
policy := `{"name": "newName", "duration": 1000000, "replicaN": 1, "splitN": 2}`
2014-11-20 23:27:31 +00:00
MustHTTP("POST", s.URL+`/db/foo/retention_policies`, policy)
2014-12-21 17:45:50 +00:00
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("POST", s.URL+`/db/foo/retention_policies`, policy)
2014-12-21 17:45:50 +00:00
if status != http.StatusConflict {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "retention policy exists" {
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_CreateRetentionPolicy_BadRequest(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
policy := `{"name": "bar", "duration": "**BAD**", "replicaN": 1, "splitN": 2}`
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("POST", s.URL+`/db/foo/retention_policies`, policy)
2014-12-21 17:45:50 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "json: cannot unmarshal string into Go value of type time.Duration" {
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_UpdateRetentionPolicy(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
2014-12-23 06:18:05 +00:00
srvr.CreateRetentionPolicy("foo", influxdb.NewRetentionPolicy("bar"))
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("PUT", s.URL+`/db/foo/retention_policies/bar`,
`{"name": "newName", "duration": 1000000, "replicaN": 1, "splitN": 2}`)
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
// Verify updated policy.
p, _ := srvr.RetentionPolicy("foo", "newName")
if status != http.StatusNoContent {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "" {
t.Fatalf("unexpected body: %s", body)
2014-12-23 06:18:05 +00:00
} else if p.Name != "newName" {
t.Fatalf("unexpected policy name: %s", p.Name)
}
}
2014-11-21 14:27:59 +00:00
func TestHandler_UpdateRetentionPolicy_BadRequest(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
2014-12-23 06:18:05 +00:00
srvr.CreateRetentionPolicy("foo", influxdb.NewRetentionPolicy("bar"))
2014-11-21 14:27:59 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
newPolicy := `{"name": "newName", "duration": "BadRequest", "replicaN": 1, "splitN": 2}`
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("PUT", s.URL+`/db/foo/retention_policies/bar`, newPolicy)
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
// Verify response.
2014-11-21 14:27:59 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "json: cannot unmarshal string into Go value of type time.Duration" {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_UpdateRetentionPolicy_DatabaseNotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
newPolicy := `{"name": "newName", "duration": 1000000, "replicaN": 1, "splitN": 2}`
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("PUT", s.URL+`/db/foo/retention_policies/bar`, newPolicy)
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "database not found" {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_UpdateRetentionPolicy_NotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
newPolicy := `{"name": "newName", "duration": 1000000, "replicaN": 1, "splitN": 2}`
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("PUT", s.URL+`/db/foo/retention_policies/bar`, newPolicy)
2014-12-21 17:45:50 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "retention policy not found" {
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_DeleteRetentionPolicy(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
2014-12-23 06:18:05 +00:00
srvr.CreateRetentionPolicy("foo", influxdb.NewRetentionPolicy("bar"))
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("DELETE", s.URL+`/db/foo/retention_policies/bar`, "")
2014-11-21 14:27:59 +00:00
if status != http.StatusNoContent {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "" {
t.Fatalf("unexpected body: %s", body)
}
}
2014-11-21 14:27:59 +00:00
func TestHandler_DeleteRetentionPolicy_DatabaseNotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
status, body := MustHTTP("DELETE", s.URL+`/db/foo/retention_policies/bar`, "")
2014-12-21 17:45:50 +00:00
2014-11-21 14:27:59 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "database not found" {
2014-11-21 14:27:59 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_DeleteRetentionPolicy_NotFound(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-20 23:27:31 +00:00
status, body := MustHTTP("DELETE", s.URL+`/db/foo/retention_policies/bar`, "")
2014-12-21 17:45:50 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "retention policy not found" {
t.Fatalf("unexpected body: %s", body)
}
2014-11-20 11:25:08 +00:00
}
2014-11-20 23:50:15 +00:00
func TestHandler_Ping(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-11-20 23:50:15 +00:00
status, _ := MustHTTP("GET", s.URL+`/ping`, "")
2014-12-21 17:45:50 +00:00
2014-11-20 23:50:15 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
}
}
2014-12-08 18:39:33 +00:00
func TestHandler_Users_NoUsers(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("GET", s.URL+`/users`, "")
2014-12-21 17:45:50 +00:00
2014-12-08 18:39:33 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
} else if body != "[]" {
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_Users_OneUser(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
2014-12-23 06:18:05 +00:00
srvr.CreateUser("jdoe", "1337", true)
2014-12-08 18:39:33 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("GET", s.URL+`/users`, "")
2014-12-08 18:39:33 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
2014-12-23 06:18:05 +00:00
} else if body != `[{"name":"jdoe","admin":true}]` {
2014-12-08 18:39:33 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
func TestHandler_Users_MultipleUsers(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
2014-12-23 06:18:05 +00:00
srvr.CreateUser("jdoe", "1337", false)
srvr.CreateUser("mclark", "1337", true)
srvr.CreateUser("csmith", "1337", false)
2014-12-08 18:39:33 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("GET", s.URL+`/users`, "")
2014-12-08 18:39:33 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
2014-12-23 06:18:05 +00:00
} else if body != `[{"name":"csmith"},{"name":"jdoe"},{"name":"mclark","admin":true}]` {
2014-12-08 18:39:33 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_CreateUser(t *testing.T) {
2014-11-26 14:36:43 +00:00
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("POST", s.URL+`/users`, `{"name":"jdoe","password":"1337"}`)
if status != http.StatusCreated {
2014-11-26 14:36:43 +00:00
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != "" {
2014-11-26 14:36:43 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_CreateUser_BadRequest(t *testing.T) {
2014-11-26 14:36:43 +00:00
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("POST", s.URL+`/users`, `{"name":0xBAD,"password":"1337"}`)
2014-11-26 14:36:43 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `invalid character 'x' after object key:value pair` {
2014-11-26 14:36:43 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_CreateUser_InternalServerError(t *testing.T) {
2014-11-26 14:36:43 +00:00
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("POST", s.URL+`/users`, `{"name":""}`)
if status != http.StatusInternalServerError {
t.Fatalf("unexpected status: %d", status)
2014-11-26 22:10:56 +00:00
} else if body != `username required` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_UpdateUser(t *testing.T) {
2014-11-26 22:10:56 +00:00
srvr := OpenServer(NewMessagingClient())
2014-12-23 06:18:05 +00:00
srvr.CreateUser("jdoe", "1337", false)
2014-11-26 22:10:56 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
// Save original password hash.
hash := srvr.User("jdoe").Hash
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
// Update user password.
status, body := MustHTTP("PUT", s.URL+`/users/jdoe`, `{"password": "7331"}`)
if status != http.StatusNoContent {
2014-11-26 22:10:56 +00:00
t.Fatalf("unexpected status: %d", status)
} else if body != `` {
t.Fatalf("unexpected body: %s", body)
2014-12-23 06:18:05 +00:00
} else if srvr.User("jdoe").Hash == hash {
2014-11-26 22:10:56 +00:00
t.Fatalf("expected password hash to change")
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_UpdateUser_PasswordBadRequest(t *testing.T) {
2014-11-26 22:10:56 +00:00
srvr := OpenServer(NewMessagingClient())
2014-12-23 06:18:05 +00:00
srvr.CreateUser("jdoe", "1337", false)
2014-11-26 22:10:56 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("PUT", s.URL+`/users/jdoe`, `{"password": 10}`)
2014-11-26 22:10:56 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
2014-12-21 17:45:50 +00:00
} else if body != `json: cannot unmarshal number into Go value of type string` {
2014-11-26 22:10:56 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_DeleteUser(t *testing.T) {
2014-11-26 22:10:56 +00:00
srvr := OpenServer(NewMessagingClient())
2014-12-23 06:18:05 +00:00
srvr.CreateUser("jdoe", "1337", false)
2014-11-26 22:10:56 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("DELETE", s.URL+`/users/jdoe`, "")
2014-12-05 18:31:12 +00:00
if status != http.StatusNoContent {
t.Fatalf("unexpected status: %d", status)
} else if body != `` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-23 06:18:05 +00:00
func TestHandler_DeleteUser_UserNotFound(t *testing.T) {
2014-12-05 18:31:12 +00:00
srvr := OpenServer(NewMessagingClient())
srvr.CreateDatabase("foo")
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-21 17:45:50 +00:00
2014-12-23 06:18:05 +00:00
status, body := MustHTTP("DELETE", s.URL+`/users/jdoe`, "")
2014-12-05 18:31:12 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
} else if body != `user not found` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_DataNodes(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
2014-12-30 15:50:15 +00:00
srvr.CreateDataNode(MustParseURL("http://localhost:1000"))
srvr.CreateDataNode(MustParseURL("http://localhost:2000"))
srvr.CreateDataNode(MustParseURL("http://localhost:3000"))
2014-12-29 23:12:51 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("GET", s.URL+`/data_nodes`, "")
2014-12-29 23:12:51 +00:00
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
} else if body != `[{"id":1,"url":"http://localhost:1000"},{"id":2,"url":"http://localhost:2000"},{"id":3,"url":"http://localhost:3000"}]` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_CreateDataNode(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("POST", s.URL+`/data_nodes`, `{"url":"http://localhost:1000"}`)
2014-12-29 23:12:51 +00:00
if status != http.StatusCreated {
t.Fatalf("unexpected status: %d", status)
} else if body != `{"id":1,"url":"http://localhost:1000"}` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_CreateDataNode_BadRequest(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("POST", s.URL+`/data_nodes`, `{"name":`)
2014-12-29 23:12:51 +00:00
if status != http.StatusBadRequest {
t.Fatalf("unexpected status: %d", status)
} else if body != `unexpected EOF` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_CreateDataNode_InternalServerError(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("POST", s.URL+`/data_nodes`, `{"url":""}`)
2014-12-29 23:12:51 +00:00
if status != http.StatusInternalServerError {
2014-12-30 22:52:44 +00:00
t.Fatalf("unexpected status: %d, %s", status, body)
2014-12-30 15:50:15 +00:00
} else if body != `data node url required` {
2014-12-29 23:12:51 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_DeleteDataNode(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
2014-12-30 15:50:15 +00:00
srvr.CreateDataNode(MustParseURL("http://localhost:1000"))
2014-12-29 23:12:51 +00:00
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("DELETE", s.URL+`/data_nodes/1`, "")
2014-12-29 23:12:51 +00:00
if status != http.StatusNoContent {
t.Fatalf("unexpected status: %d", status)
} else if body != `` {
t.Fatalf("unexpected body: %s", body)
}
}
2014-12-30 15:50:15 +00:00
func TestHandler_DeleteUser_DataNodeNotFound(t *testing.T) {
2014-12-29 23:12:51 +00:00
srvr := OpenServer(NewMessagingClient())
s := NewHTTPServer(srvr)
defer s.Close()
2014-12-30 15:50:15 +00:00
status, body := MustHTTP("DELETE", s.URL+`/data_nodes/10000`, "")
2014-12-29 23:12:51 +00:00
if status != http.StatusNotFound {
t.Fatalf("unexpected status: %d", status)
2014-12-30 15:50:15 +00:00
} else if body != `data node not found` {
2014-12-29 23:12:51 +00:00
t.Fatalf("unexpected body: %s", body)
}
}
// Perform a subset of endpoint testing, with authentication enabled.
func TestHandler_AuthenticatedCreateAdminUser(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewAuthenticatedHTTPServer(srvr)
defer s.Close()
// Attempting to create a non-admin user should fail.
status, _ := MustHTTP("POST", s.URL+`/users`, `{"name": "maeve", "password": "pass", "Admin": false}`)
if status != http.StatusUnauthorized {
t.Fatalf("unexpected status: %d", status)
}
// Creating the first admin user, without supplying authentication
// credentials should be OK.
status, _ = MustHTTP("POST", s.URL+`/users`, `{"name": "orla", "password": "pass", "Admin": true}`)
if status != http.StatusCreated {
t.Fatalf("unexpected status: %d", status)
}
// Creating a second admin user, without supplying authentication
// credentials should fail.
status, _ = MustHTTP("POST", s.URL+`/users`, `{"name": "louise", "password": "pass", "Admin": true}`)
if status != http.StatusUnauthorized {
t.Fatalf("unexpected status: %d", status)
}
}
func TestHandler_AuthenticatedDatabases_Unauthorized(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
s := NewAuthenticatedHTTPServer(srvr)
defer s.Close()
status, _ := MustHTTP("GET", s.URL+`/db`, "")
if status != http.StatusUnauthorized {
t.Fatalf("unexpected status: %d", status)
}
}
func TestHandler_AuthenticatedDatabases_AuthorizedQueryParams(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateUser("lisa", "password", true)
s := NewAuthenticatedHTTPServer(srvr)
defer s.Close()
status, _ := MustHTTP("GET", s.URL+`/db?u=lisa&p=password`, "")
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
}
}
func TestHandler_AuthenticatedDatabases_AuthorizedBasicAuth(t *testing.T) {
srvr := OpenServer(NewMessagingClient())
srvr.CreateUser("lisa", "password", true)
s := NewAuthenticatedHTTPServer(srvr)
defer s.Close()
auth := make(map[string]string)
auth["Authorization"] = "Basic " + base64.StdEncoding.EncodeToString([]byte("lisa:password"))
fmt.Println(auth)
status, _ := MustHTTPWithHeaders("GET", s.URL+`/db`, auth, "")
if status != http.StatusOK {
t.Fatalf("unexpected status: %d", status)
}
}
// Utility functions for this test suite.
func MustHTTP(verb, url, body string) (int, string) {
return MustHTTPWithHeaders(verb, url, nil, body)
}
func MustHTTPWithHeaders(verb, url string, headers map[string]string, body string) (int, string) {
req, err := http.NewRequest(verb, url, bytes.NewBuffer([]byte(body)))
if err != nil {
panic(err)
}
for k, v := range headers {
req.Header.Set(k, v)
}
2015-01-06 00:01:24 +00:00
req.Header.Set("Content-Type", "application/json")
2014-12-23 06:18:05 +00:00
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
2014-12-23 06:18:05 +00:00
b, err := ioutil.ReadAll(resp.Body)
return resp.StatusCode, strings.TrimRight(string(b), "\n")
}
2014-12-29 23:12:51 +00:00
// MustParseURL parses a string into a URL. Panic on error.
func MustParseURL(s string) *url.URL {
u, err := url.Parse(s)
if err != nil {
panic(err.Error())
}
return u
}
2014-11-19 17:12:46 +00:00
// Server is a test HTTP server that wraps a handler
2014-11-20 16:02:21 +00:00
type HTTPServer struct {
2014-11-19 17:12:46 +00:00
*httptest.Server
Handler *influxdb.Handler
}
2014-11-20 16:02:21 +00:00
func NewHTTPServer(s *Server) *HTTPServer {
2014-11-19 17:12:46 +00:00
h := influxdb.NewHandler(s.Server)
2014-11-20 16:02:21 +00:00
return &HTTPServer{httptest.NewServer(h), h}
2014-11-19 17:12:46 +00:00
}
func NewAuthenticatedHTTPServer(s *Server) *HTTPServer {
h := influxdb.NewHandler(s.Server)
h.AuthenticationEnabled = true
return &HTTPServer{httptest.NewServer(h), h}
}
2014-11-20 16:02:21 +00:00
func (s *HTTPServer) Close() {
2014-11-19 17:12:46 +00:00
s.Server.Close()
}