Test mgmt http handler (#240)

This commit is contained in:
shatoboar
2022-02-22 18:18:05 +01:00
committed by GitHub
parent 41c6af6b6f
commit 5f5cbf7e20
8 changed files with 282 additions and 9 deletions

View File

@@ -15,6 +15,7 @@ import (
type Peers struct {
accountManager server.AccountManager
authAudience string
jwtExtractor JWTClaimsExtractor
}
//PeerResponse is a response sent to the client
@@ -36,6 +37,7 @@ func NewPeers(accountManager server.AccountManager, authAudience string) *Peers
return &Peers{
accountManager: accountManager,
authAudience: authAudience,
jwtExtractor: *NewJWTClaimsExtractor(nil),
}
}
@@ -55,6 +57,7 @@ func (h *Peers) updatePeer(accountId string, peer *server.Peer, w http.ResponseW
}
writeJSONObject(w, toPeerResponse(peer))
}
func (h *Peers) deletePeer(accountId string, peer *server.Peer, w http.ResponseWriter, r *http.Request) {
_, err := h.accountManager.DeletePeer(accountId, peer.Key)
if err != nil {
@@ -66,7 +69,7 @@ func (h *Peers) deletePeer(accountId string, peer *server.Peer, w http.ResponseW
}
func (h *Peers) getPeerAccount(r *http.Request) (*server.Account, error) {
jwtClaims := extractClaimsFromRequestContext(r, h.authAudience)
jwtClaims := h.jwtExtractor.extractClaimsFromRequestContext(r, h.authAudience)
account, err := h.accountManager.GetAccountByUserOrAccountId(jwtClaims.UserId, jwtClaims.AccountId, jwtClaims.Domain)
if err != nil {

View File

@@ -0,0 +1,107 @@
package handler
import (
"encoding/json"
"io"
"net"
"net/http"
"net/http/httptest"
"testing"
"github.com/magiconair/properties/assert"
"github.com/wiretrustee/wiretrustee/management/server"
"github.com/wiretrustee/wiretrustee/management/server/mock_server"
)
func initTestMetaData(peer ...*server.Peer) *Peers {
return &Peers{
accountManager: &mock_server.MockAccountManager{
GetAccountByUserOrAccountIdFunc: func(userId, accountId, domain string) (*server.Account, error) {
return &server.Account{
Id: accountId,
Domain: "hotmail.com",
Peers: map[string]*server.Peer{
"test_peer": peer[0],
},
}, nil
},
},
authAudience: "",
jwtExtractor: JWTClaimsExtractor{
extractClaimsFromRequestContext: func(r *http.Request, authAudiance string) JWTClaims {
return JWTClaims{
UserId: "test_user",
Domain: "hotmail.com",
AccountId: "test_id",
}
},
},
}
}
// Tests the GetPeers endpoint reachable in the route /api/peers
// Use the metadata generated by initTestMetaData() to check for values
func TestGetPeers(t *testing.T) {
var tt = []struct {
name string
expectedStatus int
requestType string
requestPath string
requestBody io.Reader
}{
{name: "GetPeersMetaData", requestType: http.MethodGet, requestPath: "/api/peers/", expectedStatus: http.StatusOK},
}
rr := httptest.NewRecorder()
peer := &server.Peer{
Key: "key",
SetupKey: "setupkey",
IP: net.ParseIP("100.64.0.1"),
Status: &server.PeerStatus{},
Name: "PeerName",
Meta: server.PeerSystemMeta{
Hostname: "hostname",
GoOS: "GoOS",
Kernel: "kernel",
Core: "core",
Platform: "platform",
OS: "OS",
WtVersion: "development",
},
}
p := initTestMetaData(peer)
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
req := httptest.NewRequest(tc.requestType, tc.requestPath, tc.requestBody)
p.GetPeers(rr, req)
res := rr.Result()
defer res.Body.Close()
if status := rr.Code; status != tc.expectedStatus {
t.Fatalf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
content, err := io.ReadAll(res.Body)
if err != nil {
t.Fatalf("I don't know what I expected; %v", err)
}
respBody := []*PeerResponse{}
err = json.Unmarshal(content, &respBody)
if err != nil {
t.Fatalf("Sent content is not in correct json format; %v", err)
}
got := respBody[0]
assert.Equal(t, got.Name, peer.Name)
assert.Equal(t, got.Version, peer.Meta.WtVersion)
assert.Equal(t, got.IP, peer.IP.String())
assert.Equal(t, got.OS, "OS core")
})
}
}

View File

@@ -122,7 +122,8 @@ func (h *SetupKeys) createKey(accountId string, w http.ResponseWriter, r *http.R
}
func (h *SetupKeys) getSetupKeyAccount(r *http.Request) (*server.Account, error) {
jwtClaims := extractClaimsFromRequestContext(r, h.authAudience)
extractor := NewJWTClaimsExtractor(nil)
jwtClaims := extractor.extractClaimsFromRequestContext(r, h.authAudience)
account, err := h.accountManager.GetAccountByUserOrAccountId(jwtClaims.UserId, jwtClaims.AccountId, jwtClaims.Domain)
if err != nil {

View File

@@ -3,9 +3,10 @@ package handler
import (
"encoding/json"
"errors"
"github.com/golang-jwt/jwt"
"net/http"
"time"
"github.com/golang-jwt/jwt"
)
// JWTClaims stores information from JWTs
@@ -15,6 +16,25 @@ type JWTClaims struct {
Domain string
}
type extractJWTClaims func(r *http.Request, authAudiance string) JWTClaims
type JWTClaimsExtractor struct {
extractClaimsFromRequestContext extractJWTClaims
}
// NewJWTClaimsExtractor returns an extractor, and if provided with a function with extractJWTClaims signature,
// then it will use that logic. Uses extractClaimsFromRequestContext by default
func NewJWTClaimsExtractor(e extractJWTClaims) *JWTClaimsExtractor {
var extractFunc extractJWTClaims
if extractFunc = e; extractFunc == nil {
extractFunc = extractClaimsFromRequestContext
}
return &JWTClaimsExtractor{
extractClaimsFromRequestContext: extractFunc,
}
}
// extractClaimsFromRequestContext extracts claims from the request context previously filled by the JWT token (after auth)
func extractClaimsFromRequestContext(r *http.Request, authAudiance string) JWTClaims {
token := r.Context().Value("user").(*jwt.Token)
@@ -34,7 +54,7 @@ func extractClaimsFromRequestContext(r *http.Request, authAudiance string) JWTCl
//writeJSONObject simply writes object to the HTTP reponse in JSON format
func writeJSONObject(w http.ResponseWriter, obj interface{}) {
w.WriteHeader(200)
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
err := json.NewEncoder(w).Encode(obj)
if err != nil {