Files
fn-serverless/api/server/server_test.go
2018-09-26 16:04:55 -07:00

91 lines
2.4 KiB
Go

package server
import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"strconv"
"testing"
"github.com/fnproject/fn/api/agent"
_ "github.com/fnproject/fn/api/agent/drivers/docker"
_ "github.com/fnproject/fn/api/datastore/sql/sqlite"
"github.com/fnproject/fn/api/models"
"github.com/gin-gonic/gin"
)
func testServer(ds models.Datastore, mq models.MessageQueue, logDB models.LogStore, rnr agent.Agent, nodeType NodeType, opts ...Option) *Server {
return New(context.Background(), append(opts,
WithLogFormat("text"),
WithLogLevel("debug"),
WithDatastore(ds),
WithMQ(mq),
WithLogstore(logDB),
WithAgent(rnr),
WithType(nodeType),
WithTriggerAnnotator(NewRequestBasedTriggerAnnotator()),
WithFnAnnotator(NewRequestBasedFnAnnotator()),
)...)
}
func createRequest(t *testing.T, method, path string, body io.Reader) *http.Request {
bodyLen := int64(0)
// HACK: derive content-length since protocol/http does not add content-length
// if it's not present.
if body != nil {
buf := &bytes.Buffer{}
nRead, err := io.Copy(buf, body)
if err != nil {
t.Fatalf("Test: Could not copy %s request body to %s: %v", method, path, err)
}
bodyLen = nRead
body = buf
}
req, err := http.NewRequest(method, "http://127.0.0.1:8080"+path, body)
if err != nil {
t.Fatalf("Test: Could not create %s request to %s: %v", method, path, err)
}
if body != nil {
req.ContentLength = bodyLen
req.Header.Set("Content-Length", strconv.FormatInt(bodyLen, 10))
}
return req
}
func routerRequest(t *testing.T, router *gin.Engine, method, path string, body io.Reader) (*http.Request, *httptest.ResponseRecorder) {
req := createRequest(t, method, path, body)
return routerRequest2(t, router, req)
}
func routerRequest2(_ *testing.T, router *gin.Engine, req *http.Request) (*http.Request, *httptest.ResponseRecorder) {
rec := httptest.NewRecorder()
rec.Body = new(bytes.Buffer)
router.ServeHTTP(rec, req)
return req, rec
}
func newRouterRequest(t *testing.T, method, path string, body io.Reader) (*http.Request, *httptest.ResponseRecorder) {
req := createRequest(t, method, path, body)
rec := httptest.NewRecorder()
rec.Body = new(bytes.Buffer)
return req, rec
}
func getErrorResponse(t *testing.T, rec *httptest.ResponseRecorder) *models.Error {
var err models.Error
decodeErr := json.NewDecoder(rec.Body).Decode(&err)
if decodeErr != nil {
t.Error("Test: Expected not empty response body")
}
return &err
}