fleet/server/service/endpoint_test.go
Zachary Wasserman adf87140a7
Add ability to prefix Fleet URLs (#2112)
- Add the server_url_prefix flag for configuring this functionality
- Add prefix handling to the server routes
- Refactor JS to use appropriate paths from modules
- Use JS template to get URL prefix into JS environment
- Update webpack config to support prefixing

Thanks to securityonion.net for sponsoring the development of this feature.

Closes #1661
2019-10-16 16:40:45 -07:00

125 lines
3.1 KiB
Go

package service
import (
"bytes"
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"reflect"
"runtime"
"strings"
"testing"
kitlog "github.com/go-kit/kit/log"
"github.com/kolide/fleet/server/config"
"github.com/kolide/fleet/server/datastore/inmem"
"github.com/kolide/fleet/server/kolide"
"github.com/stretchr/testify/require"
)
type testResource struct {
server *httptest.Server
adminToken string
userToken string
ds kolide.Datastore
}
type endpointService struct {
kolide.Service
}
func (svc endpointService) SendTestEmail(ctx context.Context, config *kolide.AppConfig) error {
return nil
}
func setupEndpointTest(t *testing.T) *testResource {
test := &testResource{}
var err error
test.ds, err = inmem.New(config.TestConfig())
require.Nil(t, err)
require.Nil(t, test.ds.MigrateData())
devOrgInfo := &kolide.AppConfig{
OrgName: "Kolide",
OrgLogoURL: "http://foo.bar/image.png",
SMTPPort: 465,
SMTPAuthenticationType: kolide.AuthTypeUserNamePassword,
SMTPEnableTLS: true,
SMTPVerifySSLCerts: true,
SMTPEnableStartTLS: true,
}
test.ds.NewAppConfig(devOrgInfo)
svc, _ := newTestService(test.ds, nil)
svc = endpointService{svc}
createTestUsers(t, test.ds)
logger := kitlog.NewLogfmtLogger(os.Stdout)
jwtKey := "CHANGEME"
routes := MakeHandler(svc, config.KolideConfig{Auth: config.AuthConfig{JwtKey: jwtKey}}, logger)
test.server = httptest.NewServer(routes)
userParam := loginRequest{
Username: "admin1",
Password: testUsers["admin1"].PlaintextPassword,
}
marshalledUser, _ := json.Marshal(&userParam)
requestBody := &nopCloser{bytes.NewBuffer(marshalledUser)}
resp, _ := http.Post(test.server.URL+"/api/v1/kolide/login", "application/json", requestBody)
var jsn = struct {
User *kolide.User `json:"user"`
Token string `json:"token"`
Err string `json:"error,omitempty"`
}{}
json.NewDecoder(resp.Body).Decode(&jsn)
test.adminToken = jsn.Token
// log in non admin user
userParam.Username = "user1"
userParam.Password = testUsers["user1"].PlaintextPassword
marshalledUser, _ = json.Marshal(userParam)
requestBody = &nopCloser{bytes.NewBuffer(marshalledUser)}
resp, err = http.Post(test.server.URL+"/api/v1/kolide/login", "application/json", requestBody)
require.Nil(t, err)
err = json.NewDecoder(resp.Body).Decode(&jsn)
require.Nil(t, err)
test.userToken = jsn.Token
return test
}
func functionName(f func(*testing.T, *testResource)) string {
fullName := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
elements := strings.Split(fullName, ".")
return elements[len(elements)-1]
}
var testFunctions = [...]func(*testing.T, *testResource){
testGetAppConfig,
testModifyAppConfig,
testModifyAppConfigWithValidationFail,
testGetOptions,
testModifyOptions,
testModifyOptionsValidationFail,
testOptionNotFound,
testAdminUserSetAdmin,
testNonAdminUserSetAdmin,
testAdminUserSetEnabled,
testNonAdminUserSetEnabled,
}
func TestEndpoints(t *testing.T) {
for _, f := range testFunctions {
r := setupEndpointTest(t)
defer r.server.Close()
t.Run(functionName(f), func(t *testing.T) {
f(t, r)
})
}
}