|
|
@@ -7,30 +7,11 @@ import (
|
|
|
"reflect"
|
|
|
"strings"
|
|
|
"testing"
|
|
|
- "time"
|
|
|
|
|
|
- "github.com/go-chi/chi"
|
|
|
- "github.com/porter-dev/porter/internal/config"
|
|
|
"github.com/porter-dev/porter/internal/models"
|
|
|
- "github.com/porter-dev/porter/internal/repository"
|
|
|
- "github.com/porter-dev/porter/internal/repository/test"
|
|
|
- "github.com/porter-dev/porter/server/api"
|
|
|
- "github.com/porter-dev/porter/server/router"
|
|
|
-
|
|
|
- sessionstore "github.com/porter-dev/porter/internal/auth"
|
|
|
- lr "github.com/porter-dev/porter/internal/logger"
|
|
|
- vr "github.com/porter-dev/porter/internal/validator"
|
|
|
)
|
|
|
|
|
|
-type tester struct {
|
|
|
- app *api.App
|
|
|
- repo *repository.Repository
|
|
|
- store *sessionstore.PGStore
|
|
|
- router *chi.Mux
|
|
|
- req *http.Request
|
|
|
- rr *httptest.ResponseRecorder
|
|
|
- cookie *http.Cookie
|
|
|
-}
|
|
|
+// ------------------------- TEST TYPES AND MAIN LOOP ------------------------- //
|
|
|
|
|
|
type userTest struct {
|
|
|
initializers []func(t *tester)
|
|
|
@@ -44,86 +25,10 @@ type userTest struct {
|
|
|
validators []func(c *userTest, tester *tester, t *testing.T)
|
|
|
}
|
|
|
|
|
|
-func (t *tester) execute() {
|
|
|
- t.router.ServeHTTP(t.rr, t.req)
|
|
|
-}
|
|
|
-
|
|
|
-func (t *tester) reset() {
|
|
|
- t.rr = httptest.NewRecorder()
|
|
|
- t.req = nil
|
|
|
-}
|
|
|
-
|
|
|
-func (t *tester) createUserSession(email string, pw string) {
|
|
|
- req, _ := http.NewRequest(
|
|
|
- "POST",
|
|
|
- "/api/users",
|
|
|
- strings.NewReader(`{"email":"`+email+`","password":"`+pw+`"}`),
|
|
|
- )
|
|
|
-
|
|
|
- t.req = req
|
|
|
- t.execute()
|
|
|
-
|
|
|
- if cookies := t.rr.Result().Cookies(); len(cookies) > 0 {
|
|
|
- t.cookie = cookies[0]
|
|
|
- }
|
|
|
-
|
|
|
- t.reset()
|
|
|
-}
|
|
|
-
|
|
|
-func initUserDefault(tester *tester) {
|
|
|
- tester.createUserSession("belanger@getporter.dev", "hello")
|
|
|
-}
|
|
|
-
|
|
|
-func initUserWithContexts(tester *tester) {
|
|
|
- initUserDefault(tester)
|
|
|
-
|
|
|
- user, _ := tester.repo.User.ReadUserByEmail("belanger@getporter.dev")
|
|
|
- user.Contexts = []string{"context-test"}
|
|
|
-
|
|
|
- user.RawKubeConfig = []byte("apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin")
|
|
|
-
|
|
|
- tester.repo.User.UpdateUser(user)
|
|
|
-}
|
|
|
-
|
|
|
-func newTester(canQuery bool) *tester {
|
|
|
- appConf := config.Conf{
|
|
|
- Debug: true,
|
|
|
- Server: config.ServerConf{
|
|
|
- Port: 8080,
|
|
|
- CookieName: "porter",
|
|
|
- CookieSecret: []byte("secret"),
|
|
|
- TimeoutRead: time.Second * 5,
|
|
|
- TimeoutWrite: time.Second * 10,
|
|
|
- TimeoutIdle: time.Second * 15,
|
|
|
- },
|
|
|
- // unimportant here
|
|
|
- Db: config.DBConf{},
|
|
|
- }
|
|
|
-
|
|
|
- logger := lr.NewConsole(appConf.Debug)
|
|
|
- validator := vr.New()
|
|
|
-
|
|
|
- repo := test.NewRepository(canQuery)
|
|
|
-
|
|
|
- store, _ := sessionstore.NewStore(repo, appConf.Server)
|
|
|
- app := api.New(logger, repo, validator, store, appConf.Server.CookieName)
|
|
|
- r := router.New(app, store, appConf.Server.CookieName)
|
|
|
-
|
|
|
- return &tester{
|
|
|
- app: app,
|
|
|
- repo: repo,
|
|
|
- store: store,
|
|
|
- router: r,
|
|
|
- req: nil,
|
|
|
- rr: httptest.NewRecorder(),
|
|
|
- cookie: nil,
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
func testUserRequests(t *testing.T, tests []*userTest, canQuery bool) {
|
|
|
for _, c := range tests {
|
|
|
// create a new tester
|
|
|
- tester := newTester(canQuery)
|
|
|
+ tester := newTester(canQuery, nil)
|
|
|
|
|
|
// if there's an initializer, call it
|
|
|
for _, init := range c.initializers {
|
|
|
@@ -162,6 +67,8 @@ func testUserRequests(t *testing.T, tests []*userTest, canQuery bool) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// ------------------------- TEST FIXTURES AND FUNCTIONS ------------------------- //
|
|
|
+
|
|
|
var createUserTests = []*userTest{
|
|
|
&userTest{
|
|
|
msg: "Create user",
|
|
|
@@ -185,7 +92,7 @@ var createUserTests = []*userTest{
|
|
|
expStatus: http.StatusUnprocessableEntity,
|
|
|
expBody: `{"code":601,"errors":["email validation failed"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -198,7 +105,7 @@ var createUserTests = []*userTest{
|
|
|
expStatus: http.StatusUnprocessableEntity,
|
|
|
expBody: `{"code":601,"errors":["required validation failed"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -215,7 +122,7 @@ var createUserTests = []*userTest{
|
|
|
expStatus: http.StatusUnprocessableEntity,
|
|
|
expBody: `{"code":601,"errors":["email already taken"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -229,7 +136,7 @@ var createUserTests = []*userTest{
|
|
|
expStatus: http.StatusBadRequest,
|
|
|
expBody: `{"code":600,"errors":["could not process request"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -250,7 +157,7 @@ var createUserTestsWriteFail = []*userTest{
|
|
|
expStatus: http.StatusInternalServerError,
|
|
|
expBody: `{"code":500,"errors":["could not read from database"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -274,7 +181,7 @@ var loginUserTests = []*userTest{
|
|
|
expStatus: http.StatusOK,
|
|
|
expBody: ``,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -292,7 +199,7 @@ var loginUserTests = []*userTest{
|
|
|
expBody: ``,
|
|
|
useCookie: true,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -306,7 +213,7 @@ var loginUserTests = []*userTest{
|
|
|
expStatus: http.StatusUnauthorized,
|
|
|
expBody: `{"code":401,"errors":["email not registered"]}`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -324,7 +231,7 @@ var loginUserTests = []*userTest{
|
|
|
expBody: `{"code":401,"errors":["incorrect password"]}`,
|
|
|
useCookie: true,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -391,7 +298,7 @@ var readUserTests = []*userTest{
|
|
|
expBody: `{"id":1,"email":"belanger@getporter.dev","contexts":["context-test"],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`,
|
|
|
useCookie: true,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- UserModelBodyValidator,
|
|
|
+ userModelBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -405,7 +312,7 @@ var readUserTests = []*userTest{
|
|
|
expStatus: http.StatusForbidden,
|
|
|
expBody: http.StatusText(http.StatusForbidden) + "\n",
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -427,7 +334,7 @@ var readUserClustersTests = []*userTest{
|
|
|
useCookie: true,
|
|
|
expBody: `[{"name":"context-test","server":"https://localhost","cluster":"cluster-test","user":"test-admin","selected":true}]`,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- ContextBodyValidator,
|
|
|
+ userContextBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -612,7 +519,7 @@ var updateUserTests = []*userTest{
|
|
|
expStatus: http.StatusForbidden,
|
|
|
expBody: http.StatusText(http.StatusForbidden) + "\n",
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -627,7 +534,7 @@ var updateUserTests = []*userTest{
|
|
|
expBody: `{"code":600,"errors":["could not process request"]}`,
|
|
|
useCookie: true,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -695,7 +602,7 @@ var deleteUserTests = []*userTest{
|
|
|
expStatus: http.StatusForbidden,
|
|
|
expBody: http.StatusText(http.StatusForbidden) + "\n",
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
&userTest{
|
|
|
@@ -710,7 +617,7 @@ var deleteUserTests = []*userTest{
|
|
|
expBody: `{"code":601,"errors":["required validation failed"]}`,
|
|
|
useCookie: true,
|
|
|
validators: []func(c *userTest, tester *tester, t *testing.T){
|
|
|
- BasicBodyValidator,
|
|
|
+ userBasicBodyValidator,
|
|
|
},
|
|
|
},
|
|
|
}
|
|
|
@@ -719,14 +626,31 @@ func TestHandleDeleteUser(t *testing.T) {
|
|
|
testUserRequests(t, deleteUserTests, true)
|
|
|
}
|
|
|
|
|
|
-func BasicBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
+// ------------------------- INITIALIZERS AND VALIDATORS ------------------------- //
|
|
|
+
|
|
|
+func initUserDefault(tester *tester) {
|
|
|
+ tester.createUserSession("belanger@getporter.dev", "hello")
|
|
|
+}
|
|
|
+
|
|
|
+func initUserWithContexts(tester *tester) {
|
|
|
+ initUserDefault(tester)
|
|
|
+
|
|
|
+ user, _ := tester.repo.User.ReadUserByEmail("belanger@getporter.dev")
|
|
|
+ user.Contexts = []string{"context-test"}
|
|
|
+
|
|
|
+ user.RawKubeConfig = []byte("apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin")
|
|
|
+
|
|
|
+ tester.repo.User.UpdateUser(user)
|
|
|
+}
|
|
|
+
|
|
|
+func userBasicBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
if body := tester.rr.Body.String(); body != c.expBody {
|
|
|
t.Errorf("%s, handler returned wrong body: got %v want %v",
|
|
|
c.msg, body, c.expBody)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func UserModelBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
+func userModelBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
gotBody := &models.UserExternal{}
|
|
|
expBody := &models.UserExternal{}
|
|
|
|
|
|
@@ -739,7 +663,7 @@ func UserModelBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func ContextBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
+func userContextBodyValidator(c *userTest, tester *tester, t *testing.T) {
|
|
|
gotBody := &[]models.Context{}
|
|
|
expBody := &[]models.Context{}
|
|
|
|