go-ssb-room/roomdb/sqlite/members_test.go

284 lines
6.3 KiB
Go

// SPDX-FileCopyrightText: 2021 The NGI Pointer Secure-Scuttlebutt Team of 2020/2021
//
// SPDX-License-Identifier: MIT
package sqlite
import (
"bytes"
"context"
"os"
"path/filepath"
"testing"
refs "github.com/ssbc/go-ssb-refs"
"github.com/stretchr/testify/require"
"github.com/ssbc/go-ssb-room/v2/internal/repo"
"github.com/ssbc/go-ssb-room/v2/roomdb"
"github.com/ssbc/go-ssb-room/v2/roomdb/sqlite/models"
)
func TestMembers(t *testing.T) {
r := require.New(t)
ctx := context.Background()
testRepo := filepath.Join("testrun", t.Name())
os.RemoveAll(testRepo)
tr := repo.New(testRepo)
db, err := Open(tr)
require.NoError(t, err)
// broken feed (unknown algo)
tf, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("fooo"), 8), "nope")
if err != nil {
r.Error(err)
}
_, err = db.Members.Add(ctx, tf, roomdb.RoleMember)
r.Error(err)
// looks ok at least
okFeed, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("acab"), 8), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
mid, err := db.Members.Add(ctx, okFeed, roomdb.RoleMember)
r.NoError(err)
sqlDB := db.Members.db
count, err := models.Members().Count(ctx, sqlDB)
r.NoError(err)
r.EqualValues(count, 1)
lst, err := db.Members.List(ctx)
r.NoError(err)
r.Len(lst, 1)
_, yes := db.Members.GetByFeed(ctx, okFeed)
r.NoError(yes)
okMember, err := db.Members.GetByFeed(ctx, okFeed)
r.NoError(err)
r.Equal(okMember.ID, mid)
r.Equal(okMember.Role, roomdb.RoleMember)
r.True(okMember.PubKey.Equal(okFeed))
_, yes = db.Members.GetByFeed(ctx, tf)
r.Error(yes)
err = db.Members.RemoveFeed(ctx, okFeed)
r.NoError(err)
count, err = models.Members().Count(ctx, sqlDB)
r.NoError(err)
r.EqualValues(count, 0)
lst, err = db.Members.List(ctx)
r.NoError(err)
r.Len(lst, 0)
_, yes = db.Members.GetByFeed(ctx, okFeed)
r.Error(yes)
r.NoError(db.Close())
}
func TestMembersUnique(t *testing.T) {
r := require.New(t)
ctx := context.Background()
testRepo := filepath.Join("testrun", t.Name())
os.RemoveAll(testRepo)
tr := repo.New(testRepo)
db, err := Open(tr)
require.NoError(t, err)
feedA, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("1312"), 8), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
r.NoError(err)
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
r.Error(err)
lst, err := db.Members.List(ctx)
r.NoError(err)
r.Len(lst, 1)
r.NoError(db.Close())
}
func TestMembersByID(t *testing.T) {
r := require.New(t)
ctx := context.Background()
testRepo := filepath.Join("testrun", t.Name())
os.RemoveAll(testRepo)
tr := repo.New(testRepo)
db, err := Open(tr)
require.NoError(t, err)
feedA, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("1312"), 8), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
r.NoError(err)
lst, err := db.Members.List(ctx)
r.NoError(err)
r.Len(lst, 1)
_, yes := db.Members.GetByID(ctx, lst[0].ID)
r.NoError(yes)
_, yes = db.Members.GetByID(ctx, 666)
r.Error(yes)
err = db.Members.RemoveID(ctx, 666)
r.Error(err)
r.EqualError(err, roomdb.ErrNotFound.Error())
err = db.Members.RemoveID(ctx, lst[0].ID)
r.NoError(err)
_, yes = db.Members.GetByID(ctx, lst[0].ID)
r.Error(yes)
r.NoError(db.Close())
}
func TestMembersSetRole(t *testing.T) {
r := require.New(t)
ctx := context.Background()
testRepo := filepath.Join("testrun", t.Name())
os.RemoveAll(testRepo)
tr := repo.New(testRepo)
db, err := Open(tr)
require.NoError(t, err)
// create two users
feedA, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("1"), 32), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
idA, err := db.Members.Add(ctx, feedA, roomdb.RoleAdmin)
r.NoError(err)
t.Log("member A:", idA)
feedB, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("2"), 32), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
idB, err := db.Members.Add(ctx, feedB, roomdb.RoleModerator)
r.NoError(err)
t.Log("member B:", idB)
// list and check
members, err := db.Members.List(ctx)
r.NoError(err)
r.Len(members, 2)
findMemberWithRole(t, members, idA, roomdb.RoleAdmin)
findMemberWithRole(t, members, idB, roomdb.RoleModerator)
// upgrade B to admin
err = db.Members.SetRole(ctx, idB, roomdb.RoleAdmin)
r.NoError(err)
// list and check
members, err = db.Members.List(ctx)
r.NoError(err)
r.Len(members, 2)
findMemberWithRole(t, members, idA, roomdb.RoleAdmin)
findMemberWithRole(t, members, idB, roomdb.RoleAdmin)
// downgrade A to member
err = db.Members.SetRole(ctx, idA, roomdb.RoleMember)
r.NoError(err)
// list and check
members, err = db.Members.List(ctx)
r.NoError(err)
r.Len(members, 2)
findMemberWithRole(t, members, idA, roomdb.RoleMember)
findMemberWithRole(t, members, idB, roomdb.RoleAdmin)
// can't downgrade B to member (need one admin)
err = db.Members.SetRole(ctx, idB, roomdb.RoleMember)
r.Error(err)
// unchanged
members, err = db.Members.List(ctx)
r.NoError(err)
r.Len(members, 2)
findMemberWithRole(t, members, idA, roomdb.RoleMember)
findMemberWithRole(t, members, idB, roomdb.RoleAdmin)
r.NoError(db.Close())
}
func findMemberWithRole(t *testing.T, members []roomdb.Member, id int64, r roomdb.Role) {
var found = false
for _, m := range members {
if m.ID == id {
if m.Role != r {
t.Errorf("member %d has the wrong role (has %s)", m.ID, m.Role)
}
found = true
}
}
if !found {
t.Errorf("member %d not in the list", id)
}
}
func TestMembersAliases(t *testing.T) {
r := require.New(t)
ctx := context.Background()
testRepo := filepath.Join("testrun", t.Name())
os.RemoveAll(testRepo)
tr := repo.New(testRepo)
db, err := Open(tr)
require.NoError(t, err)
feedA, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("1312"), 8), refs.RefAlgoFeedSSB1)
if err != nil {
r.Error(err)
}
mid, err := db.Members.Add(ctx, feedA, roomdb.RoleMember)
r.NoError(err)
lst, err := db.Members.List(ctx)
r.NoError(err)
r.Len(lst, 1)
err = db.Aliases.Register(ctx, "foo", feedA, []byte("just-a-test"))
r.NoError(err)
err = db.Aliases.Register(ctx, "bar", feedA, []byte("just-a-test-two"))
r.NoError(err)
storedMember, err := db.Members.GetByID(ctx, mid)
r.NoError(err)
r.Len(storedMember.Aliases, 2)
storedMember, err = db.Members.GetByFeed(ctx, feedA)
r.NoError(err)
r.Len(storedMember.Aliases, 2)
}