feat(platform): align user payloads
This commit is contained in:
@@ -33,6 +33,14 @@ func unpackData(t *testing.T, body []byte) map[string]interface{} {
|
||||
return dataMap
|
||||
}
|
||||
|
||||
func unpackRawObject(t *testing.T, body []byte) map[string]interface{} {
|
||||
t.Helper()
|
||||
var data map[string]interface{}
|
||||
err := json.Unmarshal(body, &data)
|
||||
require.NoError(t, err, "response is not valid JSON: %s", string(body))
|
||||
return data
|
||||
}
|
||||
|
||||
// parseID extracts the numeric "id" from a data envelope and returns it as a string for URL paths.
|
||||
func parseID(t *testing.T, data map[string]interface{}) string {
|
||||
t.Helper()
|
||||
@@ -54,10 +62,12 @@ func setupPlatformTokenTestE2E(t *testing.T) (*gin.Engine, *repository.Permissib
|
||||
|
||||
userRepo := repository.NewUserRepo(db)
|
||||
accountRepo := repository.NewAccountRepo(db)
|
||||
accountUserRepo := repository.NewAccountUserRepo(db)
|
||||
accessTokenRepo := repository.NewAccessTokenRepo(db)
|
||||
agentBotRepo := repository.NewAgentBotRepo(db)
|
||||
permissibleRepo := repository.NewPermissibleRepo(db)
|
||||
accountService := service.NewAccountService(accountRepo)
|
||||
platformUserService := service.NewPlatformUserService(userRepo, permissibleRepo)
|
||||
platformUserService := service.NewPlatformUserService(userRepo, permissibleRepo, accessTokenRepo, accountUserRepo)
|
||||
|
||||
platformUser := v1.NewPlatformUserHandler(platformUserService)
|
||||
platformAccount := v1.NewPlatformAccountHandler(accountRepo, permissibleRepo, accountService)
|
||||
@@ -76,6 +86,7 @@ func setupPlatformTokenTestE2E(t *testing.T) (*gin.Engine, *repository.Permissib
|
||||
platformGroup.GET("/users", platformUser.List)
|
||||
platformGroup.GET("/users/:id", platformUser.Show)
|
||||
platformGroup.POST("/users", platformUser.Create)
|
||||
platformGroup.GET("/users/:id/login", platformUser.Login)
|
||||
platformGroup.POST("/users/:id/login", platformUser.Login)
|
||||
platformGroup.POST("/users/:id/token", platformUser.Token)
|
||||
platformGroup.PATCH("/users/:id", platformUser.Update)
|
||||
@@ -114,10 +125,32 @@ func TestPlatformUserE2E_Create(t *testing.T) {
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusCreated, w.Code)
|
||||
data := unpackData(t, w.Body.Bytes())
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
data := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.Equal(t, "Test User", data["name"])
|
||||
assert.Equal(t, "test@example.com", data["email"])
|
||||
assert.NotEmpty(t, data["access_token"])
|
||||
assert.Contains(t, data, "accounts")
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_CreateExistingUserReturnsExistingAndPermits(t *testing.T) {
|
||||
engine, permissibleRepo, userRepo, _ := setupPlatformTokenTestE2E(t)
|
||||
ctx := t.Context()
|
||||
existing := &model.User{Name: "Old Name", Email: "existing@example.com", Provider: "email", Active: true}
|
||||
require.NoError(t, userRepo.Create(ctx, existing))
|
||||
|
||||
body := `{"name": "New Name", "email": "existing@example.com", "password": "secret123"}`
|
||||
w := httptest.NewRecorder()
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
data := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.Equal(t, "Old Name", data["name"])
|
||||
assert.Equal(t, float64(existing.ID), data["id"])
|
||||
_, err := permissibleRepo.FindByPlatformAppAndResource(ctx, uint(1), model.PermissibleTypeUser, existing.ID)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_Show(t *testing.T) {
|
||||
@@ -129,8 +162,8 @@ func TestPlatformUserE2E_Show(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
createData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
createData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, createData)
|
||||
|
||||
// Show user
|
||||
@@ -139,7 +172,7 @@ func TestPlatformUserE2E_Show(t *testing.T) {
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
showData := unpackData(t, w.Body.Bytes())
|
||||
showData := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.Equal(t, "Show User", showData["name"])
|
||||
}
|
||||
|
||||
@@ -152,20 +185,22 @@ func TestPlatformUserE2E_Update(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
createData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
createData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, createData)
|
||||
|
||||
// Update user
|
||||
updateBody := `{"name": "Updated Name", "email": "updated@example.com"}`
|
||||
updateBody := `{"name": "Updated Name", "email": "updated@example.com", "custom_attributes": {"tier": "gold"}}`
|
||||
w = httptest.NewRecorder()
|
||||
req, _ = http.NewRequest("PATCH", "/platform/api/v1/users/"+userID, bytes.NewBufferString(updateBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
updateData := unpackData(t, w.Body.Bytes())
|
||||
updateData := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.Equal(t, "Updated Name", updateData["name"])
|
||||
attrs := updateData["custom_attributes"].(map[string]interface{})
|
||||
assert.Equal(t, "gold", attrs["tier"])
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_Destroy(t *testing.T) {
|
||||
@@ -177,8 +212,8 @@ func TestPlatformUserE2E_Destroy(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
createData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
createData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, createData)
|
||||
|
||||
// Delete user
|
||||
@@ -186,7 +221,7 @@ func TestPlatformUserE2E_Destroy(t *testing.T) {
|
||||
req, _ = http.NewRequest("DELETE", "/platform/api/v1/users/"+userID, nil)
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusNoContent, w.Code)
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_Login(t *testing.T) {
|
||||
@@ -198,16 +233,19 @@ func TestPlatformUserE2E_Login(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
createData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
createData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, createData)
|
||||
|
||||
// Login
|
||||
w = httptest.NewRecorder()
|
||||
req, _ = http.NewRequest("POST", "/platform/api/v1/users/"+userID+"/login", nil)
|
||||
req, _ = http.NewRequest("GET", "/platform/api/v1/users/"+userID+"/login", nil)
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
loginData := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.Contains(t, loginData["url"], "email=sso%40example.com")
|
||||
assert.Contains(t, loginData["url"], "sso_auth_token=")
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_Token(t *testing.T) {
|
||||
@@ -219,8 +257,8 @@ func TestPlatformUserE2E_Token(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
createData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
createData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, createData)
|
||||
|
||||
// Token
|
||||
@@ -229,6 +267,11 @@ func TestPlatformUserE2E_Token(t *testing.T) {
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
assert.Equal(t, http.StatusOK, w.Code)
|
||||
tokenData := unpackRawObject(t, w.Body.Bytes())
|
||||
assert.NotEmpty(t, tokenData["access_token"])
|
||||
assert.Nil(t, tokenData["expiry"])
|
||||
userInfo := tokenData["user"].(map[string]interface{})
|
||||
assert.Equal(t, "Token User", userInfo["name"])
|
||||
}
|
||||
|
||||
func TestPlatformUserE2E_List(t *testing.T) {
|
||||
@@ -241,7 +284,7 @@ func TestPlatformUserE2E_List(t *testing.T) {
|
||||
req, _ := http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
}
|
||||
|
||||
// List users
|
||||
@@ -393,8 +436,8 @@ func TestPlatformAccountUserE2E_Create(t *testing.T) {
|
||||
req, _ = http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(userBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
userData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
userData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, userData)
|
||||
|
||||
// Create AccountUser
|
||||
@@ -441,8 +484,8 @@ func TestPlatformAccountUserE2E_Index(t *testing.T) {
|
||||
req, _ = http.NewRequest("POST", "/platform/api/v1/users", bytes.NewBufferString(userBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
engine.ServeHTTP(w, req)
|
||||
require.Equal(t, http.StatusCreated, w.Code)
|
||||
userData := unpackData(t, w.Body.Bytes())
|
||||
require.Equal(t, http.StatusOK, w.Code)
|
||||
userData := unpackRawObject(t, w.Body.Bytes())
|
||||
userID := parseID(t, userData)
|
||||
|
||||
// Add user to account
|
||||
|
||||
Reference in New Issue
Block a user