github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/it/impl_deactivateworkspace_test.go (about) 1 /* 2 * Copyright (c) 2020-present unTill Pro, Ltd. 3 * @author Denis Gribanov 4 */ 5 6 package sys_it 7 8 import ( 9 "encoding/json" 10 "fmt" 11 "testing" 12 "time" 13 14 "github.com/stretchr/testify/require" 15 16 "github.com/voedger/voedger/pkg/appdef" 17 "github.com/voedger/voedger/pkg/iauthnz" 18 "github.com/voedger/voedger/pkg/istructs" 19 "github.com/voedger/voedger/pkg/sys/authnz" 20 "github.com/voedger/voedger/pkg/sys/invite" 21 coreutils "github.com/voedger/voedger/pkg/utils" 22 it "github.com/voedger/voedger/pkg/vit" 23 ) 24 25 func TestBasicUsage_InitiateDeactivateWorkspace(t *testing.T) { 26 vit := it.NewVIT(t, &it.SharedConfig_App1) 27 defer vit.TearDown() 28 29 wsName := vit.NextName() 30 31 prn1 := vit.GetPrincipal(istructs.AppQName_test1_app1, it.TestEmail) 32 wsp := it.SimpleWSParams(wsName) 33 34 ws := vit.CreateWorkspace(wsp, prn1) 35 36 // initiate deactivate workspace 37 vit.PostWS(ws, "c.sys.InitiateDeactivateWorkspace", "{}") 38 waitForDeactivate(vit, ws) 39 40 // 410 Gone on work in an inactive workspace 41 bodyCmd := `{"cuds":[{"fields":{"sys.QName":"app1pkg.computers","sys.ID":1}}]}` 42 vit.PostWS(ws, "c.sys.CUD", bodyCmd, coreutils.Expect410()).Println() 43 bodyQry := `{"args":{"Schema":"sys.WorkspaceDescriptor"},"elements":[{"fields":["Status"]}]}` 44 vit.PostWS(ws, "q.sys.Collection", bodyQry, coreutils.Expect410()).Println() 45 46 // still able to work in an inactive workspace with the system token 47 sysToken := vit.GetSystemPrincipal(istructs.AppQName_test1_app1) 48 vit.PostWS(ws, "q.sys.Collection", bodyQry, coreutils.WithAuthorizeBy(sysToken.Token)) 49 vit.PostWS(ws, "c.sys.CUD", bodyCmd, coreutils.WithAuthorizeBy(sysToken.Token)) 50 51 // 409 conflict on deactivate an already deactivated worksace 52 vit.PostWS(ws, "c.sys.InitiateDeactivateWorkspace", "{}", coreutils.WithAuthorizeBy(sysToken.Token), coreutils.Expect409()) 53 } 54 55 func waitForDeactivate(vit *it.VIT, ws *it.AppWorkspace) { 56 deadline := it.TestDeadline() 57 for time.Now().Before(deadline) { 58 resp := vit.PostWSSys(ws, "q.sys.Collection", `{"args":{"Schema":"sys.WorkspaceDescriptor"},"elements":[{"fields":["Status"]}]}`) 59 if int32(resp.SectionRow()[0].(float64)) == int32(authnz.WorkspaceStatus_Inactive) { 60 return 61 } 62 time.Sleep(awaitTime) 63 } 64 vit.T.Fatal("workspace", ws.Name, "is not deactivated in an acceptable time") 65 } 66 67 func TestDeactivateJoinedWorkspace(t *testing.T) { 68 require := require.New(t) 69 vit := it.NewVIT(t, &it.SharedConfig_App1) 70 defer vit.TearDown() 71 72 wsName1 := vit.NextName() 73 prn1 := vit.GetPrincipal(istructs.AppQName_test1_app1, it.TestEmail) 74 prn2 := vit.GetPrincipal(istructs.AppQName_test1_app1, it.TestEmail2) 75 wsp := it.SimpleWSParams(wsName1) 76 77 newWS := vit.CreateWorkspace(wsp, prn1) 78 79 // check prn2 could not work in ws1 80 body := `{"cuds":[{"fields":{"sys.QName":"app1pkg.computers","sys.ID":1}}]}` 81 vit.PostWS(newWS, "c.sys.CUD", body, coreutils.WithAuthorizeBy(prn2.Token), coreutils.Expect403()) 82 83 // join login TestEmail2 to ws1 84 expireDatetime := vit.Now().UnixMilli() 85 roleOwner := iauthnz.QNameRoleWorkspaceOwner.String() 86 updateRolesEmailSubject := "your roles are updated" 87 inviteID := InitiateInvitationByEMail(vit, newWS, expireDatetime, it.TestEmail2, roleOwner, inviteEmailTemplate, updateRolesEmailSubject) 88 email := vit.CaptureEmail() 89 verificationCode := email.Body[:6] 90 WaitForInviteState(vit, newWS, inviteID, invite.State_ToBeJoined, invite.State_Invited) 91 testEmail2Prn := vit.GetPrincipal(istructs.AppQName_test1_app1, it.TestEmail2) 92 InitiateJoinWorkspace(vit, newWS, inviteID, testEmail2Prn, verificationCode) 93 WaitForInviteState(vit, newWS, inviteID, invite.State_ToBeJoined, invite.State_Joined) 94 95 // check prn2 could work in ws1 96 body = `{"cuds":[{"fields":{"sys.QName":"app1pkg.computers","sys.ID":1}}]}` 97 vit.PostWS(newWS, "c.sys.CUD", body, coreutils.WithAuthorizeBy(prn2.Token)) 98 99 // deactivate 100 vit.PostWS(newWS, "c.sys.InitiateDeactivateWorkspace", "{}") 101 waitForDeactivate(vit, newWS) 102 103 // check cdoc.sys.JoinedWorkspace.IsActive == false 104 joinedWorkspace := FindCDocJoinedWorkspaceByInvitingWorkspaceWSIDAndLogin(vit, newWS.WSID, testEmail2Prn) 105 require.False(joinedWorkspace.isActive) 106 107 // check appWS/cdoc.sys.WorkspaceID.IsActive == false 108 wsidOfCDocWorkspaceID := coreutils.GetPseudoWSID(prn1.ProfileWSID, newWS.Name, istructs.MainClusterID) 109 body = fmt.Sprintf(`{"args":{"Query":"select IDOfCDocWorkspaceID from sys.WorkspaceIDIdx where OwnerWSID = %d and WSName = '%s'"}, "elements":[{"fields":["Result"]}]}`, 110 prn1.ProfileWSID, newWS.Name) 111 sysToken := vit.GetSystemPrincipal(istructs.AppQName_test1_app1) 112 resp := vit.PostApp(istructs.AppQName_test1_app1, wsidOfCDocWorkspaceID, "q.sys.SqlQuery", body, coreutils.WithAuthorizeBy(sysToken.Token)) 113 viewWorkspaceIDIdx := map[string]interface{}{} 114 require.NoError(json.Unmarshal([]byte(resp.SectionRow()[0].(string)), &viewWorkspaceIDIdx)) 115 idOfCDocWorkspaceID := int64(viewWorkspaceIDIdx["IDOfCDocWorkspaceID"].(float64)) 116 body = fmt.Sprintf(`{"args":{"ID": %d},"elements":[{"fields": ["Result"]}]}`, idOfCDocWorkspaceID) 117 resp = vit.PostApp(istructs.AppQName_test1_app1, wsidOfCDocWorkspaceID, "q.sys.GetCDoc", body, coreutils.WithAuthorizeBy(sysToken.Token)) 118 jsonBytes := []byte(resp.SectionRow()[0].(string)) 119 cdocWorkspaceID := map[string]interface{}{} 120 require.NoError(json.Unmarshal(jsonBytes, &cdocWorkspaceID)) 121 require.False(cdocWorkspaceID[appdef.SystemField_IsActive].(bool)) 122 }