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
280 lines
7.9 KiB
Go
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,
|
|
®ularWorkspaceResponse,
|
|
)
|
|
|
|
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,
|
|
})
|
|
}
|