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>
This commit is contained in:
cblgh 2021-04-25 15:59:17 +02:00
parent 80686dec26
commit ab06233f28
3 changed files with 63 additions and 15 deletions

View File

@ -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
}
}

View File

@ -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)
}
}

View File

@ -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())