133 lines
3.0 KiB
Go
133 lines
3.0 KiB
Go
// Package that contains a lib to easily create everything for running a virtual api and test the microservice
|
|
package test
|
|
|
|
// Import an easy manager to test the REST-API
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/genofire/hs_master-kss-monolith/lib/database"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
goji "goji.io"
|
|
)
|
|
|
|
// Pointer to the server
|
|
var mock *MockTransport
|
|
|
|
type MockTransport struct {
|
|
Handler http.Handler
|
|
running bool
|
|
}
|
|
|
|
// Function to use the http handler
|
|
func (t *MockTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
if !t.running {
|
|
return nil, errors.New("mock a error")
|
|
}
|
|
w := httptest.NewRecorder()
|
|
t.Handler.ServeHTTP(w, req)
|
|
return w.Result(), nil
|
|
}
|
|
|
|
// Function to start the http handler
|
|
func (t *MockTransport) Start() {
|
|
t.running = true
|
|
}
|
|
|
|
// Function to close/stop the http handler
|
|
func (t *MockTransport) Close() {
|
|
t.running = false
|
|
}
|
|
|
|
var lastTestDB int
|
|
|
|
// Function to initialize a test api (with test files of depending microservice)
|
|
func Init(t *testing.T) (assertion *assert.Assertions, router *goji.Mux) {
|
|
assertion = assert.New(t)
|
|
|
|
lastTestDB++
|
|
//database.Close()
|
|
database.Open(database.Config{
|
|
Type: "sqlite3",
|
|
Logging: true,
|
|
Connection: fmt.Sprintf("file:database%s?mode=memory", lastTestDB),
|
|
})
|
|
router = goji.NewMux()
|
|
|
|
mockBackend := http.FileServer(http.Dir("../webroot"))
|
|
mock = &MockTransport{Handler: mockBackend, running: true}
|
|
http.DefaultClient.Transport = mock
|
|
|
|
return
|
|
}
|
|
|
|
// Function to close the static webserver
|
|
func CloseServer() {
|
|
mock.Close()
|
|
}
|
|
|
|
// Function to close and stop the whole microservice
|
|
func Close() {
|
|
database.Close()
|
|
mock.Close()
|
|
}
|
|
|
|
// Struct to dandle a test session with cookies
|
|
type Request struct {
|
|
req *http.Request
|
|
cookies []*http.Cookie
|
|
router *goji.Mux
|
|
Header map[string]string
|
|
}
|
|
|
|
// Function to create a NewSession with the easy manager
|
|
func NewSession(router *goji.Mux) *Request {
|
|
return &Request{router: router, Header: make(map[string]string)}
|
|
}
|
|
|
|
// Function to send a request to the router and receive the api's answer
|
|
func (r *Request) JSONRequest(method string, url string, body interface{}) (jsonResult interface{}, res *http.Response) {
|
|
jsonObj, _ := json.Marshal(body)
|
|
req, _ := http.NewRequest(method, url, bytes.NewReader(jsonObj))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
if len(r.Header) > 0 {
|
|
for k, h := range r.Header {
|
|
req.Header.Set(k, h)
|
|
}
|
|
}
|
|
for _, c := range r.cookies {
|
|
req.AddCookie(c)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
r.router.ServeHTTP(w, req)
|
|
res = w.Result()
|
|
cookies := res.Cookies()
|
|
if len(cookies) > 0 {
|
|
r.cookies = cookies
|
|
}
|
|
json.NewDecoder(w.Body).Decode(&jsonResult)
|
|
return
|
|
}
|
|
|
|
// Function to log the current session
|
|
func (r *Request) Login() {
|
|
r.Header["session"] = "testsessionkey"
|
|
}
|
|
|
|
// Function to logout/quit the current session
|
|
func (r *Request) Logout() {
|
|
r.Header["session"] = "trashkey"
|
|
}
|
|
|
|
// Function to clean the current session
|
|
func (r *Request) Clean() {
|
|
r.cookies = nil
|
|
}
|