package integrationtests import ( "fmt" "testing" "github.com/mattermost/focalboard/server/client" "github.com/mattermost/focalboard/server/model" "github.com/mattermost/focalboard/server/utils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func createTestSubscriptions(client *client.Client, num int) ([]*model.Subscription, string, error) { newSubs := make([]*model.Subscription, 0, num) user, resp := client.GetMe() if resp.Error != nil { return nil, "", fmt.Errorf("cannot get current user: %w", resp.Error) } board := &model.Board{ TeamID: "0", Type: model.BoardTypeOpen, CreateAt: 1, UpdateAt: 1, } board, resp = client.CreateBoard(board) if resp.Error != nil { return nil, "", fmt.Errorf("cannot insert test board block: %w", resp.Error) } for n := 0; n < num; n++ { newBlock := &model.Block{ ID: utils.NewID(utils.IDTypeCard), BoardID: board.ID, CreateAt: 1, UpdateAt: 1, Type: model.TypeCard, } newBlocks, resp := client.InsertBlocks(board.ID, []*model.Block{newBlock}, false) if resp.Error != nil { return nil, "", fmt.Errorf("cannot insert test card block: %w", resp.Error) } newBlock = newBlocks[0] sub := &model.Subscription{ BlockType: newBlock.Type, BlockID: newBlock.ID, SubscriberType: model.SubTypeUser, SubscriberID: user.ID, } subNew, resp := client.CreateSubscription(sub) if resp.Error != nil { return nil, "", resp.Error } newSubs = append(newSubs, subNew) } return newSubs, user.ID, nil } func TestCreateSubscription(t *testing.T) { th := SetupTestHelper(t).InitBasic() defer th.TearDown() t.Run("Create valid subscription", func(t *testing.T) { subs, userID, err := createTestSubscriptions(th.Client, 5) require.NoError(t, err) require.Len(t, subs, 5) // fetch the newly created subscriptions and compare subsFound, resp := th.Client.GetSubscriptions(userID) require.NoError(t, resp.Error) require.Len(t, subsFound, 5) assert.ElementsMatch(t, subs, subsFound) }) t.Run("Create invalid subscription", func(t *testing.T) { user, resp := th.Client.GetMe() require.NoError(t, resp.Error) sub := &model.Subscription{ SubscriberID: user.ID, } _, resp = th.Client.CreateSubscription(sub) require.Error(t, resp.Error) }) t.Run("Create subscription for another user", func(t *testing.T) { sub := &model.Subscription{ SubscriberID: utils.NewID(utils.IDTypeUser), } _, resp := th.Client.CreateSubscription(sub) require.Error(t, resp.Error) }) } func TestGetSubscriptions(t *testing.T) { th := SetupTestHelper(t).InitBasic() defer th.TearDown() t.Run("Get subscriptions for user", func(t *testing.T) { mySubs, user1ID, err := createTestSubscriptions(th.Client, 5) require.NoError(t, err) require.Len(t, mySubs, 5) // create more subscriptions with different user otherSubs, _, err := createTestSubscriptions(th.Client2, 10) require.NoError(t, err) require.Len(t, otherSubs, 10) // fetch the newly created subscriptions for current user, making sure only // the ones created for the current user are returned. subsFound, resp := th.Client.GetSubscriptions(user1ID) require.NoError(t, resp.Error) require.Len(t, subsFound, 5) assert.ElementsMatch(t, mySubs, subsFound) }) } func TestDeleteSubscription(t *testing.T) { th := SetupTestHelper(t).InitBasic() defer th.TearDown() t.Run("Delete valid subscription", func(t *testing.T) { subs, userID, err := createTestSubscriptions(th.Client, 3) require.NoError(t, err) require.Len(t, subs, 3) resp := th.Client.DeleteSubscription(subs[1].BlockID, userID) require.NoError(t, resp.Error) // fetch the subscriptions and ensure the list is correct subsFound, resp := th.Client.GetSubscriptions(userID) require.NoError(t, resp.Error) require.Len(t, subsFound, 2) assert.Contains(t, subsFound, subs[0]) assert.Contains(t, subsFound, subs[2]) assert.NotContains(t, subsFound, subs[1]) }) t.Run("Delete invalid subscription", func(t *testing.T) { user, resp := th.Client.GetMe() require.NoError(t, resp.Error) resp = th.Client.DeleteSubscription("bogus", user.ID) require.Error(t, resp.Error) }) }