Files
wehub-resource-sync 75f3dd141c
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CI and Release / lint-frontend (push) Has been cancelled
CI and Release / dockerfile-scan (push) Has been cancelled
CI and Release / test-frontend (push) Has been cancelled
CI and Release / lint-verification-agent (push) Has been cancelled
CI and Release / test-verification-agent (push) Has been cancelled
CI and Release / e2e-verification-agent (push) Has been cancelled
CI and Release / test-backend (push) Has been cancelled
CI and Release / build-dev-image (push) Has been cancelled
CI and Release / push-dev-image (push) Has been cancelled
CI and Release / build-image (push) Has been cancelled
CI and Release / build-verification-image (push) Has been cancelled
CI and Release / determine-version (push) Has been cancelled
CI and Release / push-image (push) Has been cancelled
CI and Release / push-verification-image (12) (push) Has been cancelled
CI and Release / lint-backend (push) Has been cancelled
CI and Release / push-verification-image (17) (push) Has been cancelled
CI and Release / push-verification-image (18) (push) Has been cancelled
CI and Release / release (push) Has been cancelled
CI and Release / publish-helm-chart (push) Has been cancelled
CI and Release / push-verification-image (13) (push) Has been cancelled
CI and Release / push-verification-image (14) (push) Has been cancelled
CI and Release / push-verification-image (15) (push) Has been cancelled
CI and Release / push-verification-image (16) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:11:07 +08:00

280 lines
7.9 KiB
Go

package workspaces_controllers
import (
"net/http"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
users_enums "databasus-backend/internal/features/users/enums"
users_testing "databasus-backend/internal/features/users/testing"
workspaces_dto "databasus-backend/internal/features/workspaces/dto"
workspaces_models "databasus-backend/internal/features/workspaces/models"
workspaces_testing "databasus-backend/internal/features/workspaces/testing"
test_utils "databasus-backend/internal/util/testing"
)
func Test_WorkspaceLifecycleE2E_CompletesSuccessfully(t *testing.T) {
router := workspaces_testing.CreateTestRouter(
GetWorkspaceController(),
GetMembershipController(),
)
users_testing.EnableMemberWorkspaceCreation()
defer users_testing.ResetSettingsToDefaults()
// 1. Create workspace owner
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
// 2. Owner creates workspace
createRequest := workspaces_dto.CreateWorkspaceRequestDTO{
Name: "E2E Test Workspace",
}
var workspaceResponse workspaces_dto.WorkspaceResponseDTO
test_utils.MakePostRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces",
"Bearer "+owner.Token,
createRequest,
http.StatusOK,
&workspaceResponse,
)
assert.Equal(t, "E2E Test Workspace", workspaceResponse.Name)
assert.Equal(t, users_enums.WorkspaceRoleOwner, *workspaceResponse.UserRole)
workspaceID := workspaceResponse.ID
// 3. Owner invites a new user
inviteRequest := workspaces_dto.AddMemberRequestDTO{
Email: "invited" + uuid.New().String() + "@example.com",
Role: users_enums.WorkspaceRoleViewer,
}
var inviteResponse workspaces_dto.AddMemberResponseDTO
test_utils.MakePostRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/memberships/"+workspaceID.String()+"/members",
"Bearer "+owner.Token,
inviteRequest,
http.StatusOK,
&inviteResponse,
)
assert.True(t, inviteResponse.Status == workspaces_dto.AddStatusInvited)
// 4. Add existing user to workspace
existingMember := users_testing.CreateTestUser(users_enums.UserRoleMember)
addMemberRequest := workspaces_dto.AddMemberRequestDTO{
Email: existingMember.Email,
Role: users_enums.WorkspaceRoleViewer,
}
var addMemberResponse workspaces_dto.AddMemberResponseDTO
test_utils.MakePostRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/memberships/"+workspaceID.String()+"/members",
"Bearer "+owner.Token,
addMemberRequest,
http.StatusOK,
&addMemberResponse,
)
assert.True(t, addMemberResponse.Status == workspaces_dto.AddStatusAdded)
// 5. List workspace members
var membersResponse workspaces_dto.GetMembersResponseDTO
test_utils.MakeGetRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/memberships/"+workspaceID.String()+"/members",
"Bearer "+owner.Token,
http.StatusOK,
&membersResponse,
)
assert.GreaterOrEqual(t, len(membersResponse.Members), 2) // owner + added member
roles := make([]users_enums.WorkspaceRole, len(membersResponse.Members))
for i, m := range membersResponse.Members {
roles[i] = m.Role
}
assert.Contains(t, roles, users_enums.WorkspaceRoleOwner)
assert.Contains(t, roles, users_enums.WorkspaceRoleViewer)
// 6. Promote member to admin
promoteRequest := workspaces_dto.ChangeMemberRoleRequestDTO{
Role: users_enums.WorkspaceRoleMember,
}
resp := test_utils.MakePutRequest(
t,
router,
"/api/v1/workspaces/memberships/"+workspaceID.String()+"/members/"+existingMember.UserID.String()+"/role",
"Bearer "+owner.Token,
promoteRequest,
http.StatusOK,
)
assert.Contains(t, string(resp.Body), "Member role changed successfully")
// 7. Update workspace settings
updateRequest := workspaces_models.Workspace{
Name: "Updated E2E Workspace",
}
var updateResponse workspaces_models.Workspace
test_utils.MakePutRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/"+workspaceID.String(),
"Bearer "+owner.Token,
updateRequest,
http.StatusOK,
&updateResponse,
)
assert.Equal(t, "Updated E2E Workspace", updateResponse.Name)
// 8. Transfer ownership
transferRequest := workspaces_dto.TransferOwnershipRequestDTO{
NewOwnerEmail: existingMember.Email,
}
resp = test_utils.MakePostRequest(
t,
router,
"/api/v1/workspaces/memberships/"+workspaceID.String()+"/transfer-ownership",
"Bearer "+owner.Token,
transferRequest,
http.StatusOK,
)
assert.Contains(t, string(resp.Body), "Ownership transferred successfully")
// 9. New owner can now manage workspace
var finalWorkspace workspaces_models.Workspace
test_utils.MakeGetRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/"+workspaceID.String(),
"Bearer "+existingMember.Token,
http.StatusOK,
&finalWorkspace,
)
assert.Equal(t, workspaceID, finalWorkspace.ID)
assert.Equal(t, "Updated E2E Workspace", finalWorkspace.Name)
// 10. New owner can delete workspace
resp = test_utils.MakeRequest(t, router, test_utils.RequestOptions{
Method: "DELETE",
URL: "/api/v1/workspaces/" + workspaceID.String(),
AuthToken: "Bearer " + existingMember.Token,
ExpectedStatus: http.StatusOK,
})
assert.Contains(t, string(resp.Body), "Workspace deleted successfully")
}
func Test_AdminWorkspaceManagementE2E_CompletesSuccessfully(t *testing.T) {
router := workspaces_testing.CreateTestRouter(
GetWorkspaceController(),
GetMembershipController(),
)
// 1. Create admin and regular user
admin := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
regularUser := users_testing.CreateTestUser(users_enums.UserRoleMember)
// 2. Regular user creates workspace (with member creation disabled)
users_testing.DisableMemberWorkspaceCreation()
defer users_testing.ResetSettingsToDefaults()
// Regular user cannot create workspace
createRequest := workspaces_dto.CreateWorkspaceRequestDTO{
Name: "Regular User Workspace",
}
test_utils.MakePostRequest(
t,
router,
"/api/v1/workspaces",
"Bearer "+regularUser.Token,
createRequest,
http.StatusForbidden,
)
// 3. Admin can create workspace regardless of settings
adminCreateRequest := workspaces_dto.CreateWorkspaceRequestDTO{
Name: "Admin Workspace",
}
var adminWorkspaceResponse workspaces_dto.WorkspaceResponseDTO
test_utils.MakePostRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces",
"Bearer "+admin.Token,
adminCreateRequest,
http.StatusOK,
&adminWorkspaceResponse,
)
assert.Equal(t, "Admin Workspace", adminWorkspaceResponse.Name)
adminWorkspaceID := adminWorkspaceResponse.ID
// 4. Admin can view any workspace (even not a member)
regularUser2 := users_testing.CreateTestUser(users_enums.UserRoleMember)
users_testing.EnableMemberWorkspaceCreation()
regularUserCreateRequest := workspaces_dto.CreateWorkspaceRequestDTO{
Name: "Regular User Workspace 2",
}
var regularWorkspaceResponse workspaces_dto.WorkspaceResponseDTO
test_utils.MakePostRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces",
"Bearer "+regularUser2.Token,
regularUserCreateRequest,
http.StatusOK,
&regularWorkspaceResponse,
)
regularWorkspaceID := regularWorkspaceResponse.ID
// Admin can view regular user's workspace
var adminViewResponse workspaces_models.Workspace
test_utils.MakeGetRequestAndUnmarshal(
t,
router,
"/api/v1/workspaces/"+regularWorkspaceID.String(),
"Bearer "+admin.Token,
http.StatusOK,
&adminViewResponse,
)
assert.Equal(t, regularWorkspaceID, adminViewResponse.ID)
// 5. Admin can delete any workspace
resp := test_utils.MakeRequest(t, router, test_utils.RequestOptions{
Method: "DELETE",
URL: "/api/v1/workspaces/" + regularWorkspaceID.String(),
AuthToken: "Bearer " + admin.Token,
ExpectedStatus: http.StatusOK,
})
assert.Contains(t, string(resp.Body), "Workspace deleted successfully")
// 6. Clean up admin's workspace
test_utils.MakeRequest(t, router, test_utils.RequestOptions{
Method: "DELETE",
URL: "/api/v1/workspaces/" + adminWorkspaceID.String(),
AuthToken: "Bearer " + admin.Token,
ExpectedStatus: http.StatusOK,
})
}