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  }