From ab06233f287c859abe8c5cb775b15a419926c5d5 Mon Sep 17 00:00:00 2001 From: cblgh Date: Sun, 25 Apr 2021 15:59:17 +0200 Subject: [PATCH] test invite creation under community & restricted for admin, mod & member Update web/handlers/admin/setup_test.go Co-authored-by: Henry <111202+cryptix@users.noreply.github.com> --- web/handlers/admin/invites.go | 4 +-- web/handlers/admin/invites_test.go | 55 ++++++++++++++++++++++++++---- web/handlers/admin/setup_test.go | 19 +++++++---- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/web/handlers/admin/invites.go b/web/handlers/admin/invites.go index d1e4ae3..ea92822 100644 --- a/web/handlers/admin/invites.go +++ b/web/handlers/admin/invites.go @@ -76,11 +76,11 @@ func (h invitesHandler) create(w http.ResponseWriter, req *http.Request) (interf case roomdb.ModeOpen: case roomdb.ModeCommunity: if member.Role == roomdb.RoleUnknown { - return nil, fmt.Errorf("warning: member with unknown role tried to create an invite") + return nil, weberrors.ErrNotAuthorized } case roomdb.ModeRestricted: if member.Role == roomdb.RoleMember || member.Role == roomdb.RoleUnknown { - return nil, fmt.Errorf("warning: non-admin/mod user tried to create an invite") + return nil, weberrors.ErrNotAuthorized } } diff --git a/web/handlers/admin/invites_test.go b/web/handlers/admin/invites_test.go index c074060..95a4327 100644 --- a/web/handlers/admin/invites_test.go +++ b/web/handlers/admin/invites_test.go @@ -2,6 +2,7 @@ package admin import ( "net/http" + "net/http/httptest" "net/url" "testing" @@ -143,17 +144,29 @@ func TestInvitesCreate(t *testing.T) { a := assert.New(t) r := require.New(t) - urlRemove := ts.URLTo(router.AdminInvitesCreate) + urlCreate := ts.URLTo(router.AdminInvitesCreate) testInvite := "your-fake-test-invite" ts.InvitesDB.CreateReturns(testInvite, nil) - rec := ts.Client.PostForm(urlRemove, url.Values{}) - a.Equal(http.StatusOK, rec.Code) + totalCreateCallCount := 0 + createInviteShouldWork := func(works bool) *httptest.ResponseRecorder { + rec := ts.Client.PostForm(urlCreate, url.Values{}) + if works { + totalCreateCallCount += 1 + a.Equal(http.StatusOK, rec.Code) + r.Equal(totalCreateCallCount, ts.InvitesDB.CreateCallCount()) + _, userID := ts.InvitesDB.CreateArgsForCall(totalCreateCallCount - 1) + a.EqualValues(ts.User.ID, userID) + } else { + // TODO: status should be http.StatusForbidden? see invites.go:79 + a.Equal(http.StatusInternalServerError, rec.Code) + r.Equal(totalCreateCallCount, ts.InvitesDB.CreateCallCount()) + } + return rec + } - r.Equal(1, ts.InvitesDB.CreateCallCount(), "expected one invites.Create call") - _, userID := ts.InvitesDB.CreateArgsForCall(0) - a.EqualValues(ts.User.ID, userID) + rec := createInviteShouldWork(true) doc, err := goquery.NewDocumentFromReader(rec.Body) require.NoError(t, err, "failed to parse response") @@ -167,4 +180,34 @@ func TestInvitesCreate(t *testing.T) { shownLink := doc.Find("#invite-facade-link").Text() a.Equal(wantURL.String(), shownLink) + + memberUser := roomdb.Member{ + ID: 7331, + Role: roomdb.RoleMember, + PubKey: generatePubKey(), + } + modUser := roomdb.Member{ + ID: 9001, + Role: roomdb.RoleModerator, + PubKey: generatePubKey(), + } + adminUser := roomdb.Member{ + ID: 1337, + Role: roomdb.RoleAdmin, + PubKey: generatePubKey(), + } + + /* test invite creation under various restricted mode with the roles member, mod, admin */ + modes := []roomdb.PrivacyMode{roomdb.ModeRestricted, roomdb.ModeCommunity} + for _, mode := range modes { + ts.ConfigDB.GetPrivacyModeReturns(mode, nil) + ts.User = memberUser + // members can only invite in community rooms + createInviteShouldWork(mode == roomdb.ModeCommunity) + // mods & admins can always invite + ts.User = modUser + createInviteShouldWork(true) + ts.User = adminUser + createInviteShouldWork(true) + } } diff --git a/web/handlers/admin/setup_test.go b/web/handlers/admin/setup_test.go index 60b7968..871e46b 100644 --- a/web/handlers/admin/setup_test.go +++ b/web/handlers/admin/setup_test.go @@ -56,6 +56,14 @@ type testSession struct { RoomState *roomstate.Manager } +var pubKeyCount byte + +func generatePubKey() refs.FeedRef { + pk := refs.FeedRef{Algo: "ed25519", ID: bytes.Repeat([]byte{pubKeyCount}, 32)} + pubKeyCount++ + return pk +} + func newSession(t *testing.T) *testSession { var ts testSession @@ -76,7 +84,7 @@ func newSession(t *testing.T) *testSession { ts.netInfo = network.ServerEndpointDetails{ Domain: randutil.String(10), - RoomID: refs.FeedRef{Algo: "ed25519", ID: bytes.Repeat([]byte{0}, 32)}, + RoomID: generatePubKey(), UseSubdomainForAliases: true, } @@ -97,12 +105,9 @@ func newSession(t *testing.T) *testSession { // fake user ts.User = roomdb.Member{ - ID: 1234, - Role: roomdb.RoleModerator, - PubKey: refs.FeedRef{ - ID: bytes.Repeat([]byte("0"), 32), - Algo: "ed25519", - }, + ID: 1234, + Role: roomdb.RoleModerator, + PubKey: generatePubKey(), } testPath := filepath.Join("testrun", t.Name())