github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/shared_channel_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"strconv"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/mattermost/mattermost-server/v5/model"
    15  	"github.com/mattermost/mattermost-server/v5/store"
    16  )
    17  
    18  func TestSharedChannelStore(t *testing.T, ss store.Store, s SqlStore) {
    19  	t.Run("SaveSharedChannel", func(t *testing.T) { testSaveSharedChannel(t, ss) })
    20  	t.Run("GetSharedChannel", func(t *testing.T) { testGetSharedChannel(t, ss) })
    21  	t.Run("HasSharedChannel", func(t *testing.T) { testHasSharedChannel(t, ss) })
    22  	t.Run("GetSharedChannels", func(t *testing.T) { testGetSharedChannels(t, ss) })
    23  	t.Run("UpdateSharedChannel", func(t *testing.T) { testUpdateSharedChannel(t, ss) })
    24  	t.Run("DeleteSharedChannel", func(t *testing.T) { testDeleteSharedChannel(t, ss) })
    25  
    26  	t.Run("SaveSharedChannelRemote", func(t *testing.T) { testSaveSharedChannelRemote(t, ss) })
    27  	t.Run("UpdateSharedChannelRemote", func(t *testing.T) { testUpdateSharedChannelRemote(t, ss) })
    28  	t.Run("GetSharedChannelRemote", func(t *testing.T) { testGetSharedChannelRemote(t, ss) })
    29  	t.Run("GetSharedChannelRemoteByIds", func(t *testing.T) { testGetSharedChannelRemoteByIds(t, ss) })
    30  	t.Run("GetSharedChannelRemotes", func(t *testing.T) { testGetSharedChannelRemotes(t, ss) })
    31  	t.Run("HasRemote", func(t *testing.T) { testHasRemote(t, ss) })
    32  	t.Run("GetRemoteForUser", func(t *testing.T) { testGetRemoteForUser(t, ss) })
    33  	t.Run("UpdateSharedChannelRemoteNextSyncAt", func(t *testing.T) { testUpdateSharedChannelRemoteCursor(t, ss) })
    34  	t.Run("DeleteSharedChannelRemote", func(t *testing.T) { testDeleteSharedChannelRemote(t, ss) })
    35  
    36  	t.Run("SaveSharedChannelUser", func(t *testing.T) { testSaveSharedChannelUser(t, ss) })
    37  	t.Run("GetSharedChannelSingleUser", func(t *testing.T) { testGetSingleSharedChannelUser(t, ss) })
    38  	t.Run("GetSharedChannelUser", func(t *testing.T) { testGetSharedChannelUser(t, ss) })
    39  	t.Run("GetSharedChannelUsersForSync", func(t *testing.T) { testGetSharedChannelUsersForSync(t, ss) })
    40  	t.Run("UpdateSharedChannelUserLastSyncAt", func(t *testing.T) { testUpdateSharedChannelUserLastSyncAt(t, ss) })
    41  
    42  	t.Run("SaveSharedChannelAttachment", func(t *testing.T) { testSaveSharedChannelAttachment(t, ss) })
    43  	t.Run("UpsertSharedChannelAttachment", func(t *testing.T) { testUpsertSharedChannelAttachment(t, ss) })
    44  	t.Run("GetSharedChannelAttachment", func(t *testing.T) { testGetSharedChannelAttachment(t, ss) })
    45  	t.Run("UpdateSharedChannelAttachmentLastSyncAt", func(t *testing.T) { testUpdateSharedChannelAttachmentLastSyncAt(t, ss) })
    46  }
    47  
    48  func testSaveSharedChannel(t *testing.T, ss store.Store) {
    49  	t.Run("Save shared channel (home)", func(t *testing.T) {
    50  		channel, err := createTestChannel(ss, "test_save")
    51  		require.NoError(t, err)
    52  
    53  		sc := &model.SharedChannel{
    54  			ChannelId: channel.Id,
    55  			TeamId:    channel.TeamId,
    56  			CreatorId: model.NewId(),
    57  			ShareName: "testshare",
    58  			Home:      true,
    59  		}
    60  
    61  		scSaved, err := ss.SharedChannel().Save(sc)
    62  		require.NoError(t, err, "couldn't save shared channel")
    63  
    64  		require.Equal(t, sc.ChannelId, scSaved.ChannelId)
    65  		require.Equal(t, sc.TeamId, scSaved.TeamId)
    66  		require.Equal(t, sc.CreatorId, scSaved.CreatorId)
    67  
    68  		// ensure channel's Shared flag is set
    69  		channelMod, err := ss.Channel().Get(channel.Id, false)
    70  		require.NoError(t, err)
    71  		require.True(t, channelMod.IsShared())
    72  	})
    73  
    74  	t.Run("Save shared channel (remote)", func(t *testing.T) {
    75  		channel, err := createTestChannel(ss, "test_save2")
    76  		require.NoError(t, err)
    77  
    78  		sc := &model.SharedChannel{
    79  			ChannelId: channel.Id,
    80  			TeamId:    channel.TeamId,
    81  			CreatorId: model.NewId(),
    82  			ShareName: "testshare",
    83  			RemoteId:  model.NewId(),
    84  		}
    85  
    86  		scSaved, err := ss.SharedChannel().Save(sc)
    87  		require.NoError(t, err, "couldn't save shared channel", err)
    88  
    89  		require.Equal(t, sc.ChannelId, scSaved.ChannelId)
    90  		require.Equal(t, sc.TeamId, scSaved.TeamId)
    91  		require.Equal(t, sc.CreatorId, scSaved.CreatorId)
    92  
    93  		// ensure channel's Shared flag is set
    94  		channelMod, err := ss.Channel().Get(channel.Id, false)
    95  		require.NoError(t, err)
    96  		require.True(t, channelMod.IsShared())
    97  	})
    98  
    99  	t.Run("Save invalid shared channel", func(t *testing.T) {
   100  		sc := &model.SharedChannel{
   101  			ChannelId: "",
   102  			TeamId:    model.NewId(),
   103  			CreatorId: model.NewId(),
   104  			ShareName: "testshare",
   105  			Home:      true,
   106  		}
   107  
   108  		_, err := ss.SharedChannel().Save(sc)
   109  		require.Error(t, err, "should error saving invalid shared channel", err)
   110  	})
   111  
   112  	t.Run("Save with invalid channel id", func(t *testing.T) {
   113  		sc := &model.SharedChannel{
   114  			ChannelId: model.NewId(),
   115  			TeamId:    model.NewId(),
   116  			CreatorId: model.NewId(),
   117  			ShareName: "testshare",
   118  			RemoteId:  model.NewId(),
   119  		}
   120  
   121  		_, err := ss.SharedChannel().Save(sc)
   122  		require.Error(t, err, "expected error for invalid channel id")
   123  	})
   124  }
   125  
   126  func testGetSharedChannel(t *testing.T, ss store.Store) {
   127  	channel, err := createTestChannel(ss, "test_get")
   128  	require.NoError(t, err)
   129  
   130  	sc := &model.SharedChannel{
   131  		ChannelId: channel.Id,
   132  		TeamId:    channel.TeamId,
   133  		CreatorId: model.NewId(),
   134  		ShareName: "testshare",
   135  		Home:      true,
   136  	}
   137  
   138  	scSaved, err := ss.SharedChannel().Save(sc)
   139  	require.NoError(t, err, "couldn't save shared channel", err)
   140  
   141  	t.Run("Get existing shared channel", func(t *testing.T) {
   142  		sc, err := ss.SharedChannel().Get(scSaved.ChannelId)
   143  		require.NoError(t, err, "couldn't get shared channel", err)
   144  
   145  		require.Equal(t, sc.ChannelId, scSaved.ChannelId)
   146  		require.Equal(t, sc.TeamId, scSaved.TeamId)
   147  		require.Equal(t, sc.CreatorId, scSaved.CreatorId)
   148  	})
   149  
   150  	t.Run("Get non-existent shared channel", func(t *testing.T) {
   151  		sc, err := ss.SharedChannel().Get(model.NewId())
   152  		require.Error(t, err)
   153  		require.Nil(t, sc)
   154  	})
   155  }
   156  
   157  func testHasSharedChannel(t *testing.T, ss store.Store) {
   158  	channel, err := createTestChannel(ss, "test_get")
   159  	require.NoError(t, err)
   160  
   161  	sc := &model.SharedChannel{
   162  		ChannelId: channel.Id,
   163  		TeamId:    channel.TeamId,
   164  		CreatorId: model.NewId(),
   165  		ShareName: "testshare",
   166  		Home:      true,
   167  	}
   168  
   169  	scSaved, err := ss.SharedChannel().Save(sc)
   170  	require.NoError(t, err, "couldn't save shared channel", err)
   171  
   172  	t.Run("Get existing shared channel", func(t *testing.T) {
   173  		exists, err := ss.SharedChannel().HasChannel(scSaved.ChannelId)
   174  		require.NoError(t, err, "couldn't get shared channel", err)
   175  		assert.True(t, exists)
   176  	})
   177  
   178  	t.Run("Get non-existent shared channel", func(t *testing.T) {
   179  		exists, err := ss.SharedChannel().HasChannel(model.NewId())
   180  		require.NoError(t, err)
   181  		assert.False(t, exists)
   182  	})
   183  }
   184  
   185  func testGetSharedChannels(t *testing.T, ss store.Store) {
   186  	require.NoError(t, clearSharedChannels(ss))
   187  
   188  	creator := model.NewId()
   189  	team1 := model.NewId()
   190  	team2 := model.NewId()
   191  	rid := model.NewId()
   192  
   193  	data := []model.SharedChannel{
   194  		{CreatorId: creator, TeamId: team1, ShareName: "test1", Home: true},
   195  		{CreatorId: creator, TeamId: team1, ShareName: "test2", Home: false, RemoteId: rid},
   196  		{CreatorId: creator, TeamId: team1, ShareName: "test3", Home: false, RemoteId: rid},
   197  		{CreatorId: creator, TeamId: team1, ShareName: "test4", Home: true},
   198  		{CreatorId: creator, TeamId: team2, ShareName: "test5", Home: true},
   199  		{CreatorId: creator, TeamId: team2, ShareName: "test6", Home: false, RemoteId: rid},
   200  		{CreatorId: creator, TeamId: team2, ShareName: "test7", Home: false, RemoteId: rid},
   201  		{CreatorId: creator, TeamId: team2, ShareName: "test8", Home: true},
   202  		{CreatorId: creator, TeamId: team2, ShareName: "test9", Home: true},
   203  	}
   204  
   205  	for i, sc := range data {
   206  		channel, err := createTestChannel(ss, "test_get2_"+strconv.Itoa(i))
   207  		require.NoError(t, err)
   208  
   209  		sc.ChannelId = channel.Id
   210  
   211  		_, err = ss.SharedChannel().Save(&sc)
   212  		require.NoError(t, err, "error saving shared channel")
   213  	}
   214  
   215  	t.Run("Get shared channels home only", func(t *testing.T) {
   216  		opts := model.SharedChannelFilterOpts{
   217  			ExcludeRemote: true,
   218  			CreatorId:     creator,
   219  		}
   220  
   221  		count, err := ss.SharedChannel().GetAllCount(opts)
   222  		require.NoError(t, err, "error getting shared channels count")
   223  
   224  		home, err := ss.SharedChannel().GetAll(0, 100, opts)
   225  		require.NoError(t, err, "error getting shared channels")
   226  
   227  		require.Equal(t, int(count), len(home))
   228  		require.Len(t, home, 5, "should be 5 home channels")
   229  		for _, sc := range home {
   230  			require.True(t, sc.Home, "should be home channel")
   231  		}
   232  	})
   233  
   234  	t.Run("Get shared channels remote only", func(t *testing.T) {
   235  		opts := model.SharedChannelFilterOpts{
   236  			ExcludeHome: true,
   237  		}
   238  
   239  		count, err := ss.SharedChannel().GetAllCount(opts)
   240  		require.NoError(t, err, "error getting shared channels count")
   241  
   242  		remotes, err := ss.SharedChannel().GetAll(0, 100, opts)
   243  		require.NoError(t, err, "error getting shared channels")
   244  
   245  		require.Equal(t, int(count), len(remotes))
   246  		require.Len(t, remotes, 4, "should be 4 remote channels")
   247  		for _, sc := range remotes {
   248  			require.False(t, sc.Home, "should be remote channel")
   249  		}
   250  	})
   251  
   252  	t.Run("Get shared channels bad opts", func(t *testing.T) {
   253  		opts := model.SharedChannelFilterOpts{
   254  			ExcludeHome:   true,
   255  			ExcludeRemote: true,
   256  		}
   257  		_, err := ss.SharedChannel().GetAll(0, 100, opts)
   258  		require.Error(t, err, "error expected")
   259  	})
   260  
   261  	t.Run("Get shared channels by team", func(t *testing.T) {
   262  		opts := model.SharedChannelFilterOpts{
   263  			TeamId: team1,
   264  		}
   265  
   266  		count, err := ss.SharedChannel().GetAllCount(opts)
   267  		require.NoError(t, err, "error getting shared channels count")
   268  
   269  		remotes, err := ss.SharedChannel().GetAll(0, 100, opts)
   270  		require.NoError(t, err, "error getting shared channels")
   271  
   272  		require.Equal(t, int(count), len(remotes))
   273  		require.Len(t, remotes, 4, "should be 4 matching channels")
   274  		for _, sc := range remotes {
   275  			require.Equal(t, team1, sc.TeamId)
   276  		}
   277  	})
   278  
   279  	t.Run("Get shared channels invalid pagnation", func(t *testing.T) {
   280  		opts := model.SharedChannelFilterOpts{
   281  			TeamId: team1,
   282  		}
   283  
   284  		_, err := ss.SharedChannel().GetAll(-1, 100, opts)
   285  		require.Error(t, err)
   286  
   287  		_, err = ss.SharedChannel().GetAll(0, -100, opts)
   288  		require.Error(t, err)
   289  	})
   290  }
   291  
   292  func testUpdateSharedChannel(t *testing.T, ss store.Store) {
   293  	channel, err := createTestChannel(ss, "test_update")
   294  	require.NoError(t, err)
   295  
   296  	sc := &model.SharedChannel{
   297  		ChannelId: channel.Id,
   298  		TeamId:    channel.TeamId,
   299  		CreatorId: model.NewId(),
   300  		ShareName: "testshare",
   301  		Home:      true,
   302  	}
   303  
   304  	scSaved, err := ss.SharedChannel().Save(sc)
   305  	require.NoError(t, err, "couldn't save shared channel", err)
   306  
   307  	t.Run("Update existing shared channel", func(t *testing.T) {
   308  		id := model.NewId()
   309  		scMod := scSaved // copy struct (contains basic types only)
   310  		scMod.ShareName = "newname"
   311  		scMod.ShareDisplayName = "For testing"
   312  		scMod.ShareHeader = "This is a header."
   313  		scMod.RemoteId = id
   314  
   315  		scUpdated, err := ss.SharedChannel().Update(scMod)
   316  		require.NoError(t, err, "couldn't update shared channel", err)
   317  
   318  		require.Equal(t, "newname", scUpdated.ShareName)
   319  		require.Equal(t, "For testing", scUpdated.ShareDisplayName)
   320  		require.Equal(t, "This is a header.", scUpdated.ShareHeader)
   321  		require.Equal(t, id, scUpdated.RemoteId)
   322  	})
   323  
   324  	t.Run("Update non-existent shared channel", func(t *testing.T) {
   325  		sc := &model.SharedChannel{
   326  			ChannelId: model.NewId(),
   327  			TeamId:    model.NewId(),
   328  			CreatorId: model.NewId(),
   329  			ShareName: "missingshare",
   330  		}
   331  		_, err := ss.SharedChannel().Update(sc)
   332  		require.Error(t, err, "should error when updating non-existent shared channel", err)
   333  	})
   334  }
   335  
   336  func testDeleteSharedChannel(t *testing.T, ss store.Store) {
   337  	channel, err := createTestChannel(ss, "test_delete")
   338  	require.NoError(t, err)
   339  
   340  	sc := &model.SharedChannel{
   341  		ChannelId: channel.Id,
   342  		TeamId:    channel.TeamId,
   343  		CreatorId: model.NewId(),
   344  		ShareName: "testshare",
   345  		RemoteId:  model.NewId(),
   346  	}
   347  
   348  	_, err = ss.SharedChannel().Save(sc)
   349  	require.NoError(t, err, "couldn't save shared channel", err)
   350  
   351  	// add some remotes
   352  	for i := 0; i < 10; i++ {
   353  		remote := &model.SharedChannelRemote{
   354  			ChannelId: channel.Id,
   355  			CreatorId: model.NewId(),
   356  			RemoteId:  model.NewId(),
   357  		}
   358  		_, err := ss.SharedChannel().SaveRemote(remote)
   359  		require.NoError(t, err, "couldn't add remote", err)
   360  	}
   361  
   362  	t.Run("Delete existing shared channel", func(t *testing.T) {
   363  		deleted, err := ss.SharedChannel().Delete(channel.Id)
   364  		require.NoError(t, err, "delete existing shared channel should not error", err)
   365  		require.True(t, deleted, "expected true from delete shared channel")
   366  
   367  		sc, err := ss.SharedChannel().Get(channel.Id)
   368  		require.Error(t, err)
   369  		require.Nil(t, sc)
   370  
   371  		// make sure the remotes were deleted.
   372  		remotes, err := ss.SharedChannel().GetRemotes(model.SharedChannelRemoteFilterOpts{ChannelId: channel.Id})
   373  		require.NoError(t, err)
   374  		require.Len(t, remotes, 0, "expected empty remotes list")
   375  
   376  		// ensure channel's Shared flag is unset
   377  		channelMod, err := ss.Channel().Get(channel.Id, false)
   378  		require.NoError(t, err)
   379  		require.False(t, channelMod.IsShared())
   380  	})
   381  
   382  	t.Run("Delete non-existent shared channel", func(t *testing.T) {
   383  		deleted, err := ss.SharedChannel().Delete(model.NewId())
   384  		require.NoError(t, err, "delete non-existent shared channel should not error", err)
   385  		require.False(t, deleted, "expected false from delete shared channel")
   386  	})
   387  }
   388  
   389  func testSaveSharedChannelRemote(t *testing.T, ss store.Store) {
   390  	t.Run("Save shared channel remote", func(t *testing.T) {
   391  		channel, err := createTestChannel(ss, "test_save_remote")
   392  		require.NoError(t, err)
   393  
   394  		remote := &model.SharedChannelRemote{
   395  			ChannelId: channel.Id,
   396  			CreatorId: model.NewId(),
   397  			RemoteId:  model.NewId(),
   398  		}
   399  
   400  		remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   401  		require.NoError(t, err, "couldn't save shared channel remote", err)
   402  
   403  		require.Equal(t, remote.ChannelId, remoteSaved.ChannelId)
   404  		require.Equal(t, remote.CreatorId, remoteSaved.CreatorId)
   405  	})
   406  
   407  	t.Run("Save invalid shared channel remote", func(t *testing.T) {
   408  		remote := &model.SharedChannelRemote{
   409  			ChannelId: "",
   410  			CreatorId: model.NewId(),
   411  			RemoteId:  model.NewId(),
   412  		}
   413  
   414  		_, err := ss.SharedChannel().SaveRemote(remote)
   415  		require.Error(t, err, "should error saving invalid remote", err)
   416  	})
   417  
   418  	t.Run("Save shared channel remote with invalid channel id", func(t *testing.T) {
   419  		remote := &model.SharedChannelRemote{
   420  			ChannelId: model.NewId(),
   421  			CreatorId: model.NewId(),
   422  			RemoteId:  model.NewId(),
   423  		}
   424  
   425  		_, err := ss.SharedChannel().SaveRemote(remote)
   426  		require.Error(t, err, "expected error for invalid channel id")
   427  	})
   428  }
   429  
   430  func testUpdateSharedChannelRemote(t *testing.T, ss store.Store) {
   431  	t.Run("Update shared channel remote", func(t *testing.T) {
   432  		channel, err := createTestChannel(ss, "test_update_remote")
   433  		require.NoError(t, err)
   434  
   435  		remote := &model.SharedChannelRemote{
   436  			ChannelId: channel.Id,
   437  			CreatorId: model.NewId(),
   438  			RemoteId:  model.NewId(),
   439  		}
   440  
   441  		remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   442  		require.NoError(t, err, "couldn't save shared channel remote", err)
   443  
   444  		remoteSaved.IsInviteAccepted = true
   445  		remoteSaved.IsInviteConfirmed = true
   446  
   447  		remoteUpdated, err := ss.SharedChannel().UpdateRemote(remoteSaved)
   448  		require.NoError(t, err, "couldn't update shared channel remote", err)
   449  
   450  		require.Equal(t, true, remoteUpdated.IsInviteAccepted)
   451  		require.Equal(t, true, remoteUpdated.IsInviteConfirmed)
   452  	})
   453  
   454  	t.Run("Update invalid shared channel remote", func(t *testing.T) {
   455  		remote := &model.SharedChannelRemote{
   456  			ChannelId: "",
   457  			CreatorId: model.NewId(),
   458  			RemoteId:  model.NewId(),
   459  		}
   460  
   461  		_, err := ss.SharedChannel().UpdateRemote(remote)
   462  		require.Error(t, err, "should error updating invalid remote", err)
   463  	})
   464  
   465  	t.Run("Update shared channel remote with invalid channel id", func(t *testing.T) {
   466  		remote := &model.SharedChannelRemote{
   467  			ChannelId: model.NewId(),
   468  			CreatorId: model.NewId(),
   469  			RemoteId:  model.NewId(),
   470  		}
   471  
   472  		_, err := ss.SharedChannel().UpdateRemote(remote)
   473  		require.Error(t, err, "expected error for invalid channel id")
   474  	})
   475  }
   476  
   477  func testGetSharedChannelRemote(t *testing.T, ss store.Store) {
   478  	channel, err := createTestChannel(ss, "test_remote_get")
   479  	require.NoError(t, err)
   480  
   481  	remote := &model.SharedChannelRemote{
   482  		ChannelId: channel.Id,
   483  		CreatorId: model.NewId(),
   484  		RemoteId:  model.NewId(),
   485  	}
   486  
   487  	remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   488  	require.NoError(t, err, "couldn't save remote", err)
   489  
   490  	t.Run("Get existing shared channel remote", func(t *testing.T) {
   491  		r, err := ss.SharedChannel().GetRemote(remoteSaved.Id)
   492  		require.NoError(t, err, "could not get shared channel remote", err)
   493  
   494  		require.Equal(t, remoteSaved.Id, r.Id)
   495  		require.Equal(t, remoteSaved.ChannelId, r.ChannelId)
   496  		require.Equal(t, remoteSaved.CreatorId, r.CreatorId)
   497  		require.Equal(t, remoteSaved.RemoteId, r.RemoteId)
   498  	})
   499  
   500  	t.Run("Get non-existent shared channel remote", func(t *testing.T) {
   501  		r, err := ss.SharedChannel().GetRemote(model.NewId())
   502  		require.Error(t, err)
   503  		require.Nil(t, r)
   504  	})
   505  }
   506  
   507  func testGetSharedChannelRemoteByIds(t *testing.T, ss store.Store) {
   508  	channel, err := createTestChannel(ss, "test_remote_get_by_ids")
   509  	require.NoError(t, err)
   510  
   511  	remote := &model.SharedChannelRemote{
   512  		ChannelId: channel.Id,
   513  		CreatorId: model.NewId(),
   514  		RemoteId:  model.NewId(),
   515  	}
   516  
   517  	remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   518  	require.NoError(t, err, "could not save remote", err)
   519  
   520  	t.Run("Get existing shared channel remote by ids", func(t *testing.T) {
   521  		r, err := ss.SharedChannel().GetRemoteByIds(remoteSaved.ChannelId, remoteSaved.RemoteId)
   522  		require.NoError(t, err, "couldn't get shared channel remote by ids", err)
   523  
   524  		require.Equal(t, remoteSaved.Id, r.Id)
   525  		require.Equal(t, remoteSaved.ChannelId, r.ChannelId)
   526  		require.Equal(t, remoteSaved.CreatorId, r.CreatorId)
   527  		require.Equal(t, remoteSaved.RemoteId, r.RemoteId)
   528  	})
   529  
   530  	t.Run("Get non-existent shared channel remote by ids", func(t *testing.T) {
   531  		r, err := ss.SharedChannel().GetRemoteByIds(model.NewId(), model.NewId())
   532  		require.Error(t, err)
   533  		require.Nil(t, r)
   534  	})
   535  }
   536  
   537  func testGetSharedChannelRemotes(t *testing.T, ss store.Store) {
   538  	channel, err := createTestChannel(ss, "test_remotes_get2")
   539  	require.NoError(t, err)
   540  
   541  	creator := model.NewId()
   542  	remoteId := model.NewId()
   543  
   544  	data := []model.SharedChannelRemote{
   545  		{ChannelId: channel.Id, CreatorId: creator, RemoteId: model.NewId(), IsInviteConfirmed: true},
   546  		{ChannelId: channel.Id, CreatorId: creator, RemoteId: model.NewId(), IsInviteConfirmed: true},
   547  		{ChannelId: channel.Id, CreatorId: creator, RemoteId: model.NewId(), IsInviteConfirmed: true},
   548  		{CreatorId: creator, RemoteId: remoteId, IsInviteConfirmed: true},
   549  		{CreatorId: creator, RemoteId: remoteId, IsInviteConfirmed: true},
   550  		{CreatorId: creator, RemoteId: remoteId},
   551  	}
   552  
   553  	for i, r := range data {
   554  		if r.ChannelId == "" {
   555  			c, err := createTestChannel(ss, "test_remotes_get2_"+strconv.Itoa(i))
   556  			require.NoError(t, err)
   557  			r.ChannelId = c.Id
   558  		}
   559  		_, err := ss.SharedChannel().SaveRemote(&r)
   560  		require.NoError(t, err, "error saving shared channel remote")
   561  	}
   562  
   563  	t.Run("Get shared channel remotes by channel_id", func(t *testing.T) {
   564  		opts := model.SharedChannelRemoteFilterOpts{
   565  			ChannelId: channel.Id,
   566  		}
   567  		remotes, err := ss.SharedChannel().GetRemotes(opts)
   568  		require.NoError(t, err, "should not error", err)
   569  		require.Len(t, remotes, 3)
   570  		for _, r := range remotes {
   571  			require.Equal(t, channel.Id, r.ChannelId)
   572  		}
   573  	})
   574  
   575  	t.Run("Get shared channel remotes by invalid channel_id", func(t *testing.T) {
   576  		opts := model.SharedChannelRemoteFilterOpts{
   577  			ChannelId: model.NewId(),
   578  		}
   579  		remotes, err := ss.SharedChannel().GetRemotes(opts)
   580  		require.NoError(t, err, "should not error", err)
   581  		require.Len(t, remotes, 0)
   582  	})
   583  
   584  	t.Run("Get shared channel remotes by remote_id", func(t *testing.T) {
   585  		opts := model.SharedChannelRemoteFilterOpts{
   586  			RemoteId: remoteId,
   587  		}
   588  		remotes, err := ss.SharedChannel().GetRemotes(opts)
   589  		require.NoError(t, err, "should not error", err)
   590  		require.Len(t, remotes, 2) // only confirmed invitations
   591  		for _, r := range remotes {
   592  			require.Equal(t, remoteId, r.RemoteId)
   593  			require.True(t, r.IsInviteConfirmed)
   594  		}
   595  	})
   596  
   597  	t.Run("Get shared channel remotes by invalid remote_id", func(t *testing.T) {
   598  		opts := model.SharedChannelRemoteFilterOpts{
   599  			RemoteId: model.NewId(),
   600  		}
   601  		remotes, err := ss.SharedChannel().GetRemotes(opts)
   602  		require.NoError(t, err, "should not error", err)
   603  		require.Len(t, remotes, 0)
   604  	})
   605  
   606  	t.Run("Get shared channel remotes by remote_id including unconfirmed", func(t *testing.T) {
   607  		opts := model.SharedChannelRemoteFilterOpts{
   608  			RemoteId:        remoteId,
   609  			InclUnconfirmed: true,
   610  		}
   611  		remotes, err := ss.SharedChannel().GetRemotes(opts)
   612  		require.NoError(t, err, "should not error", err)
   613  		require.Len(t, remotes, 3)
   614  		for _, r := range remotes {
   615  			require.Equal(t, remoteId, r.RemoteId)
   616  		}
   617  	})
   618  }
   619  
   620  func testHasRemote(t *testing.T, ss store.Store) {
   621  	channel, err := createTestChannel(ss, "test_remotes_get2")
   622  	require.NoError(t, err)
   623  
   624  	remote1 := model.NewId()
   625  	remote2 := model.NewId()
   626  
   627  	creator := model.NewId()
   628  	data := []model.SharedChannelRemote{
   629  		{ChannelId: channel.Id, CreatorId: creator, RemoteId: remote1},
   630  		{ChannelId: channel.Id, CreatorId: creator, RemoteId: remote2},
   631  	}
   632  
   633  	for _, r := range data {
   634  		_, err := ss.SharedChannel().SaveRemote(&r)
   635  		require.NoError(t, err, "error saving shared channel remote")
   636  	}
   637  
   638  	t.Run("has remote", func(t *testing.T) {
   639  		has, err := ss.SharedChannel().HasRemote(channel.Id, remote1)
   640  		require.NoError(t, err)
   641  		assert.True(t, has)
   642  
   643  		has, err = ss.SharedChannel().HasRemote(channel.Id, remote2)
   644  		require.NoError(t, err)
   645  		assert.True(t, has)
   646  	})
   647  
   648  	t.Run("wrong channel id ", func(t *testing.T) {
   649  		has, err := ss.SharedChannel().HasRemote(model.NewId(), remote1)
   650  		require.NoError(t, err)
   651  		assert.False(t, has)
   652  	})
   653  
   654  	t.Run("wrong remote id", func(t *testing.T) {
   655  		has, err := ss.SharedChannel().HasRemote(channel.Id, model.NewId())
   656  		require.NoError(t, err)
   657  		assert.False(t, has)
   658  	})
   659  }
   660  
   661  func testGetRemoteForUser(t *testing.T, ss store.Store) {
   662  	// add remotes, and users to simulated shared channels.
   663  	teamId := model.NewId()
   664  	channel, err := createSharedTestChannel(ss, "share_test_channel", true)
   665  	require.NoError(t, err)
   666  	remotes := []*model.RemoteCluster{
   667  		{RemoteId: model.NewId(), SiteURL: model.NewId(), CreatorId: model.NewId(), RemoteTeamId: teamId, Name: "Test_Remote_1"},
   668  		{RemoteId: model.NewId(), SiteURL: model.NewId(), CreatorId: model.NewId(), RemoteTeamId: teamId, Name: "Test_Remote_2"},
   669  		{RemoteId: model.NewId(), SiteURL: model.NewId(), CreatorId: model.NewId(), RemoteTeamId: teamId, Name: "Test_Remote_3"},
   670  	}
   671  	var channelRemotes []*model.SharedChannelRemote
   672  	for _, rc := range remotes {
   673  		_, err := ss.RemoteCluster().Save(rc)
   674  		require.NoError(t, err)
   675  
   676  		scr := &model.SharedChannelRemote{Id: model.NewId(), CreatorId: rc.CreatorId, ChannelId: channel.Id, RemoteId: rc.RemoteId}
   677  		scr, err = ss.SharedChannel().SaveRemote(scr)
   678  		require.NoError(t, err)
   679  		channelRemotes = append(channelRemotes, scr)
   680  	}
   681  	users := []string{model.NewId(), model.NewId(), model.NewId()}
   682  	for _, id := range users {
   683  		member := &model.ChannelMember{
   684  			ChannelId:   channel.Id,
   685  			UserId:      id,
   686  			NotifyProps: model.GetDefaultChannelNotifyProps(),
   687  			SchemeGuest: false,
   688  			SchemeUser:  true,
   689  		}
   690  		_, err := ss.Channel().SaveMember(member)
   691  		require.NoError(t, err)
   692  	}
   693  
   694  	t.Run("user is member", func(t *testing.T) {
   695  		for _, rc := range remotes {
   696  			for _, userId := range users {
   697  				rcFound, err := ss.SharedChannel().GetRemoteForUser(rc.RemoteId, userId)
   698  				assert.NoError(t, err, "remote should be found for user")
   699  				assert.Equal(t, rc.RemoteId, rcFound.RemoteId, "remoteIds should match")
   700  			}
   701  		}
   702  	})
   703  
   704  	t.Run("user is not a member", func(t *testing.T) {
   705  		for _, rc := range remotes {
   706  			rcFound, err := ss.SharedChannel().GetRemoteForUser(rc.RemoteId, model.NewId())
   707  			assert.Error(t, err, "remote should not be found for user")
   708  			assert.Nil(t, rcFound)
   709  		}
   710  	})
   711  
   712  	t.Run("unknown remote id", func(t *testing.T) {
   713  		rcFound, err := ss.SharedChannel().GetRemoteForUser(model.NewId(), users[0])
   714  		assert.Error(t, err, "remote should not be found for unknown remote id")
   715  		assert.Nil(t, rcFound)
   716  	})
   717  }
   718  
   719  func testUpdateSharedChannelRemoteCursor(t *testing.T, ss store.Store) {
   720  	channel, err := createTestChannel(ss, "test_remote_update_next_sync_at")
   721  	require.NoError(t, err)
   722  
   723  	remote := &model.SharedChannelRemote{
   724  		ChannelId: channel.Id,
   725  		CreatorId: model.NewId(),
   726  		RemoteId:  model.NewId(),
   727  	}
   728  
   729  	remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   730  	require.NoError(t, err, "couldn't save remote", err)
   731  
   732  	future := model.GetMillis() + 3600000 // 1 hour in the future
   733  	postID := model.NewId()
   734  
   735  	cursor := model.GetPostsSinceForSyncCursor{
   736  		LastPostUpdateAt: future,
   737  		LastPostId:       postID,
   738  	}
   739  
   740  	t.Run("Update NextSyncAt for remote", func(t *testing.T) {
   741  		err := ss.SharedChannel().UpdateRemoteCursor(remoteSaved.Id, cursor)
   742  		require.NoError(t, err, "update NextSyncAt should not error", err)
   743  
   744  		r, err := ss.SharedChannel().GetRemote(remoteSaved.Id)
   745  		require.NoError(t, err)
   746  		require.Equal(t, future, r.LastPostUpdateAt)
   747  		require.Equal(t, postID, r.LastPostId)
   748  	})
   749  
   750  	t.Run("Update NextSyncAt for non-existent shared channel remote", func(t *testing.T) {
   751  		err := ss.SharedChannel().UpdateRemoteCursor(model.NewId(), cursor)
   752  		require.Error(t, err, "update non-existent remote should error", err)
   753  	})
   754  }
   755  
   756  func testDeleteSharedChannelRemote(t *testing.T, ss store.Store) {
   757  	channel, err := createTestChannel(ss, "test_remote_delete")
   758  	require.NoError(t, err)
   759  
   760  	remote := &model.SharedChannelRemote{
   761  		ChannelId: channel.Id,
   762  		CreatorId: model.NewId(),
   763  		RemoteId:  model.NewId(),
   764  	}
   765  
   766  	remoteSaved, err := ss.SharedChannel().SaveRemote(remote)
   767  	require.NoError(t, err, "couldn't save remote", err)
   768  
   769  	t.Run("Delete existing shared channel remote", func(t *testing.T) {
   770  		deleted, err := ss.SharedChannel().DeleteRemote(remoteSaved.Id)
   771  		require.NoError(t, err, "delete existing remote should not error", err)
   772  		require.True(t, deleted, "expected true from delete remote")
   773  
   774  		r, err := ss.SharedChannel().GetRemote(remoteSaved.Id)
   775  		require.Error(t, err)
   776  		require.Nil(t, r)
   777  	})
   778  
   779  	t.Run("Delete non-existent shared channel remote", func(t *testing.T) {
   780  		deleted, err := ss.SharedChannel().DeleteRemote(model.NewId())
   781  		require.NoError(t, err, "delete non-existent remote should not error", err)
   782  		require.False(t, deleted, "expected false from delete remote")
   783  	})
   784  }
   785  
   786  func createTestChannel(ss store.Store, name string) (*model.Channel, error) {
   787  	channel, err := createSharedTestChannel(ss, name, false)
   788  	return channel, err
   789  }
   790  
   791  func createSharedTestChannel(ss store.Store, name string, shared bool) (*model.Channel, error) {
   792  	channel := &model.Channel{
   793  		TeamId:      model.NewId(),
   794  		Type:        model.CHANNEL_OPEN,
   795  		Name:        name,
   796  		DisplayName: name + " display name",
   797  		Header:      name + " header",
   798  		Purpose:     name + "purpose",
   799  		CreatorId:   model.NewId(),
   800  		Shared:      model.NewBool(shared),
   801  	}
   802  	channel, err := ss.Channel().Save(channel, 10000)
   803  	if err != nil {
   804  		return nil, err
   805  	}
   806  
   807  	if shared {
   808  		sc := &model.SharedChannel{
   809  			ChannelId: channel.Id,
   810  			TeamId:    channel.TeamId,
   811  			CreatorId: channel.CreatorId,
   812  			ShareName: channel.Name,
   813  			Home:      true,
   814  		}
   815  		_, err = ss.SharedChannel().Save(sc)
   816  		if err != nil {
   817  			return nil, err
   818  		}
   819  	}
   820  	return channel, nil
   821  }
   822  
   823  func clearSharedChannels(ss store.Store) error {
   824  	opts := model.SharedChannelFilterOpts{}
   825  	all, err := ss.SharedChannel().GetAll(0, 1000, opts)
   826  	if err != nil {
   827  		return err
   828  	}
   829  
   830  	for _, sc := range all {
   831  		if _, err := ss.SharedChannel().Delete(sc.ChannelId); err != nil {
   832  			return err
   833  		}
   834  	}
   835  	return nil
   836  }
   837  
   838  func testSaveSharedChannelUser(t *testing.T, ss store.Store) {
   839  	t.Run("Save shared channel user", func(t *testing.T) {
   840  		scUser := &model.SharedChannelUser{
   841  			UserId:    model.NewId(),
   842  			RemoteId:  model.NewId(),
   843  			ChannelId: model.NewId(),
   844  		}
   845  
   846  		userSaved, err := ss.SharedChannel().SaveUser(scUser)
   847  		require.NoError(t, err, "couldn't save shared channel user", err)
   848  
   849  		require.Equal(t, scUser.UserId, userSaved.UserId)
   850  		require.Equal(t, scUser.RemoteId, userSaved.RemoteId)
   851  	})
   852  
   853  	t.Run("Save invalid shared channel user", func(t *testing.T) {
   854  		scUser := &model.SharedChannelUser{
   855  			UserId:   "",
   856  			RemoteId: model.NewId(),
   857  		}
   858  
   859  		_, err := ss.SharedChannel().SaveUser(scUser)
   860  		require.Error(t, err, "should error saving invalid user", err)
   861  	})
   862  
   863  	t.Run("Save shared channel user with invalid remote id", func(t *testing.T) {
   864  		scUser := &model.SharedChannelUser{
   865  			UserId:   model.NewId(),
   866  			RemoteId: "bogus",
   867  		}
   868  
   869  		_, err := ss.SharedChannel().SaveUser(scUser)
   870  		require.Error(t, err, "expected error for invalid remote id")
   871  	})
   872  }
   873  
   874  func testGetSingleSharedChannelUser(t *testing.T, ss store.Store) {
   875  	scUser := &model.SharedChannelUser{
   876  		UserId:    model.NewId(),
   877  		RemoteId:  model.NewId(),
   878  		ChannelId: model.NewId(),
   879  	}
   880  
   881  	userSaved, err := ss.SharedChannel().SaveUser(scUser)
   882  	require.NoError(t, err, "could not save user", err)
   883  
   884  	t.Run("Get existing shared channel user", func(t *testing.T) {
   885  		r, err := ss.SharedChannel().GetSingleUser(userSaved.UserId, userSaved.ChannelId, userSaved.RemoteId)
   886  		require.NoError(t, err, "couldn't get shared channel user", err)
   887  
   888  		require.Equal(t, userSaved.Id, r.Id)
   889  		require.Equal(t, userSaved.UserId, r.UserId)
   890  		require.Equal(t, userSaved.RemoteId, r.RemoteId)
   891  		require.Equal(t, userSaved.CreateAt, r.CreateAt)
   892  	})
   893  
   894  	t.Run("Get non-existent shared channel user", func(t *testing.T) {
   895  		u, err := ss.SharedChannel().GetSingleUser(model.NewId(), model.NewId(), model.NewId())
   896  		require.Error(t, err)
   897  		require.Nil(t, u)
   898  	})
   899  }
   900  
   901  func testGetSharedChannelUser(t *testing.T, ss store.Store) {
   902  	userId := model.NewId()
   903  	for i := 0; i < 10; i++ {
   904  		scUser := &model.SharedChannelUser{
   905  			UserId:    userId,
   906  			RemoteId:  model.NewId(),
   907  			ChannelId: model.NewId(),
   908  		}
   909  		_, err := ss.SharedChannel().SaveUser(scUser)
   910  		require.NoError(t, err, "could not save user", err)
   911  	}
   912  
   913  	t.Run("Get existing shared channel user", func(t *testing.T) {
   914  		scus, err := ss.SharedChannel().GetUsersForUser(userId)
   915  		require.NoError(t, err, "couldn't get shared channel user", err)
   916  
   917  		require.Len(t, scus, 10, "should be 10 shared channel user records")
   918  		require.Equal(t, userId, scus[0].UserId)
   919  	})
   920  
   921  	t.Run("Get non-existent shared channel user", func(t *testing.T) {
   922  		scus, err := ss.SharedChannel().GetUsersForUser(model.NewId())
   923  		require.NoError(t, err, "should not error when not found")
   924  		require.Empty(t, scus, "should be empty")
   925  	})
   926  }
   927  
   928  func testGetSharedChannelUsersForSync(t *testing.T, ss store.Store) {
   929  	channelID := model.NewId()
   930  	remoteID := model.NewId()
   931  	earlier := model.GetMillis() - 300000
   932  	later := model.GetMillis() + 300000
   933  
   934  	var users []*model.User
   935  	for i := 0; i < 10; i++ { // need real users
   936  		u := &model.User{
   937  			Username:          model.NewId(),
   938  			Email:             model.NewId() + "@example.com",
   939  			LastPictureUpdate: model.GetMillis(),
   940  		}
   941  		u, err := ss.User().Save(u)
   942  		require.NoError(t, err)
   943  		users = append(users, u)
   944  	}
   945  
   946  	data := []model.SharedChannelUser{
   947  		{UserId: users[0].Id, ChannelId: model.NewId(), RemoteId: model.NewId(), LastSyncAt: later},
   948  		{UserId: users[1].Id, ChannelId: model.NewId(), RemoteId: model.NewId(), LastSyncAt: earlier},
   949  		{UserId: users[1].Id, ChannelId: model.NewId(), RemoteId: model.NewId(), LastSyncAt: earlier},
   950  		{UserId: users[1].Id, ChannelId: channelID, RemoteId: remoteID, LastSyncAt: later},
   951  		{UserId: users[2].Id, ChannelId: channelID, RemoteId: model.NewId(), LastSyncAt: later},
   952  		{UserId: users[3].Id, ChannelId: channelID, RemoteId: model.NewId(), LastSyncAt: earlier},
   953  		{UserId: users[4].Id, ChannelId: channelID, RemoteId: model.NewId(), LastSyncAt: later},
   954  		{UserId: users[5].Id, ChannelId: channelID, RemoteId: remoteID, LastSyncAt: earlier},
   955  		{UserId: users[6].Id, ChannelId: channelID, RemoteId: remoteID, LastSyncAt: later},
   956  	}
   957  
   958  	for i, u := range data {
   959  		scu := &model.SharedChannelUser{
   960  			UserId:     u.UserId,
   961  			ChannelId:  u.ChannelId,
   962  			RemoteId:   u.RemoteId,
   963  			LastSyncAt: u.LastSyncAt,
   964  		}
   965  		_, err := ss.SharedChannel().SaveUser(scu)
   966  		require.NoError(t, err, "could not save user #", i, err)
   967  	}
   968  
   969  	t.Run("Filter by channelId", func(t *testing.T) {
   970  		filter := model.GetUsersForSyncFilter{
   971  			CheckProfileImage: false,
   972  			ChannelID:         channelID,
   973  		}
   974  		usersFound, err := ss.SharedChannel().GetUsersForSync(filter)
   975  		require.NoError(t, err, "shouldn't error getting users", err)
   976  		require.Len(t, usersFound, 2)
   977  		for _, user := range usersFound {
   978  			require.Contains(t, []string{users[3].Id, users[5].Id}, user.Id)
   979  		}
   980  	})
   981  
   982  	t.Run("Filter by channelId for profile image", func(t *testing.T) {
   983  		filter := model.GetUsersForSyncFilter{
   984  			CheckProfileImage: true,
   985  			ChannelID:         channelID,
   986  		}
   987  		usersFound, err := ss.SharedChannel().GetUsersForSync(filter)
   988  		require.NoError(t, err, "shouldn't error getting users", err)
   989  		require.Len(t, usersFound, 2)
   990  		for _, user := range usersFound {
   991  			require.Contains(t, []string{users[3].Id, users[5].Id}, user.Id)
   992  		}
   993  	})
   994  
   995  	t.Run("Filter by channelId with Limit", func(t *testing.T) {
   996  		filter := model.GetUsersForSyncFilter{
   997  			CheckProfileImage: true,
   998  			ChannelID:         channelID,
   999  			Limit:             1,
  1000  		}
  1001  		usersFound, err := ss.SharedChannel().GetUsersForSync(filter)
  1002  		require.NoError(t, err, "shouldn't error getting users", err)
  1003  		require.Len(t, usersFound, 1)
  1004  	})
  1005  }
  1006  
  1007  func testUpdateSharedChannelUserLastSyncAt(t *testing.T, ss store.Store) {
  1008  	u1 := &model.User{
  1009  		Username:          model.NewId(),
  1010  		Email:             model.NewId() + "@example.com",
  1011  		LastPictureUpdate: model.GetMillis() - 300000, // 5 mins
  1012  	}
  1013  	u1, err := ss.User().Save(u1)
  1014  	require.NoError(t, err)
  1015  
  1016  	u2 := &model.User{
  1017  		Username:          model.NewId(),
  1018  		Email:             model.NewId() + "@example.com",
  1019  		LastPictureUpdate: model.GetMillis() + 300000,
  1020  	}
  1021  	u2, err = ss.User().Save(u2)
  1022  	require.NoError(t, err)
  1023  
  1024  	channelID := model.NewId()
  1025  	remoteID := model.NewId()
  1026  
  1027  	scUser1 := &model.SharedChannelUser{
  1028  		UserId:    u1.Id,
  1029  		RemoteId:  remoteID,
  1030  		ChannelId: channelID,
  1031  	}
  1032  	_, err = ss.SharedChannel().SaveUser(scUser1)
  1033  	require.NoError(t, err, "couldn't save user", err)
  1034  
  1035  	scUser2 := &model.SharedChannelUser{
  1036  		UserId:    u2.Id,
  1037  		RemoteId:  remoteID,
  1038  		ChannelId: channelID,
  1039  	}
  1040  	_, err = ss.SharedChannel().SaveUser(scUser2)
  1041  	require.NoError(t, err, "couldn't save user", err)
  1042  
  1043  	t.Run("Update LastSyncAt for user via UpdateAt", func(t *testing.T) {
  1044  		err := ss.SharedChannel().UpdateUserLastSyncAt(u1.Id, channelID, remoteID)
  1045  		require.NoError(t, err, "updateLastSyncAt should not error", err)
  1046  
  1047  		scu, err := ss.SharedChannel().GetSingleUser(u1.Id, channelID, remoteID)
  1048  		require.NoError(t, err)
  1049  		require.Equal(t, u1.UpdateAt, scu.LastSyncAt)
  1050  	})
  1051  
  1052  	t.Run("Update LastSyncAt for user via LastPictureUpdate", func(t *testing.T) {
  1053  		err := ss.SharedChannel().UpdateUserLastSyncAt(u2.Id, channelID, remoteID)
  1054  		require.NoError(t, err, "updateLastSyncAt should not error", err)
  1055  
  1056  		scu, err := ss.SharedChannel().GetSingleUser(u2.Id, channelID, remoteID)
  1057  		require.NoError(t, err)
  1058  		require.Equal(t, u2.LastPictureUpdate, scu.LastSyncAt)
  1059  	})
  1060  
  1061  	t.Run("Update LastSyncAt for non-existent shared channel user", func(t *testing.T) {
  1062  		err := ss.SharedChannel().UpdateUserLastSyncAt(model.NewId(), channelID, remoteID)
  1063  		require.Error(t, err, "update non-existent user should error", err)
  1064  	})
  1065  }
  1066  
  1067  func testSaveSharedChannelAttachment(t *testing.T, ss store.Store) {
  1068  	t.Run("Save shared channel attachment", func(t *testing.T) {
  1069  		attachment := &model.SharedChannelAttachment{
  1070  			FileId:   model.NewId(),
  1071  			RemoteId: model.NewId(),
  1072  		}
  1073  
  1074  		saved, err := ss.SharedChannel().SaveAttachment(attachment)
  1075  		require.NoError(t, err, "couldn't save shared channel attachment", err)
  1076  
  1077  		require.Equal(t, attachment.FileId, saved.FileId)
  1078  		require.Equal(t, attachment.RemoteId, saved.RemoteId)
  1079  	})
  1080  
  1081  	t.Run("Save invalid shared channel attachment", func(t *testing.T) {
  1082  		attachment := &model.SharedChannelAttachment{
  1083  			FileId:   "",
  1084  			RemoteId: model.NewId(),
  1085  		}
  1086  
  1087  		_, err := ss.SharedChannel().SaveAttachment(attachment)
  1088  		require.Error(t, err, "should error saving invalid attachment", err)
  1089  	})
  1090  
  1091  	t.Run("Save shared channel attachment with invalid remote id", func(t *testing.T) {
  1092  		attachment := &model.SharedChannelAttachment{
  1093  			FileId:   model.NewId(),
  1094  			RemoteId: "bogus",
  1095  		}
  1096  
  1097  		_, err := ss.SharedChannel().SaveAttachment(attachment)
  1098  		require.Error(t, err, "expected error for invalid remote id")
  1099  	})
  1100  }
  1101  
  1102  func testUpsertSharedChannelAttachment(t *testing.T, ss store.Store) {
  1103  	t.Run("Upsert new shared channel attachment", func(t *testing.T) {
  1104  		attachment := &model.SharedChannelAttachment{
  1105  			FileId:   model.NewId(),
  1106  			RemoteId: model.NewId(),
  1107  		}
  1108  
  1109  		_, err := ss.SharedChannel().UpsertAttachment(attachment)
  1110  		require.NoError(t, err, "couldn't upsert shared channel attachment", err)
  1111  
  1112  		saved, err := ss.SharedChannel().GetAttachment(attachment.FileId, attachment.RemoteId)
  1113  		require.NoError(t, err, "couldn't get shared channel attachment", err)
  1114  
  1115  		require.NotZero(t, saved.CreateAt)
  1116  		require.Equal(t, saved.CreateAt, saved.LastSyncAt)
  1117  	})
  1118  
  1119  	t.Run("Upsert existing shared channel attachment", func(t *testing.T) {
  1120  		attachment := &model.SharedChannelAttachment{
  1121  			FileId:   model.NewId(),
  1122  			RemoteId: model.NewId(),
  1123  		}
  1124  
  1125  		saved, err := ss.SharedChannel().SaveAttachment(attachment)
  1126  		require.NoError(t, err, "couldn't save shared channel attachment", err)
  1127  
  1128  		// make sure enough time passed that GetMillis returns a different value
  1129  		time.Sleep(1 * time.Millisecond)
  1130  
  1131  		_, err = ss.SharedChannel().UpsertAttachment(saved)
  1132  		require.NoError(t, err, "couldn't upsert shared channel attachment", err)
  1133  
  1134  		updated, err := ss.SharedChannel().GetAttachment(attachment.FileId, attachment.RemoteId)
  1135  		require.NoError(t, err, "couldn't get shared channel attachment", err)
  1136  
  1137  		require.NotZero(t, updated.CreateAt)
  1138  		require.Greater(t, updated.LastSyncAt, updated.CreateAt)
  1139  	})
  1140  
  1141  	t.Run("Upsert invalid shared channel attachment", func(t *testing.T) {
  1142  		attachment := &model.SharedChannelAttachment{
  1143  			FileId:   "",
  1144  			RemoteId: model.NewId(),
  1145  		}
  1146  
  1147  		id, err := ss.SharedChannel().UpsertAttachment(attachment)
  1148  		require.Error(t, err, "should error upserting invalid attachment", err)
  1149  		require.Empty(t, id)
  1150  	})
  1151  
  1152  	t.Run("Upsert shared channel attachment with invalid remote id", func(t *testing.T) {
  1153  		attachment := &model.SharedChannelAttachment{
  1154  			FileId:   model.NewId(),
  1155  			RemoteId: "bogus",
  1156  		}
  1157  
  1158  		id, err := ss.SharedChannel().UpsertAttachment(attachment)
  1159  		require.Error(t, err, "expected error for invalid remote id")
  1160  		require.Empty(t, id)
  1161  	})
  1162  }
  1163  
  1164  func testGetSharedChannelAttachment(t *testing.T, ss store.Store) {
  1165  	attachment := &model.SharedChannelAttachment{
  1166  		FileId:   model.NewId(),
  1167  		RemoteId: model.NewId(),
  1168  	}
  1169  
  1170  	saved, err := ss.SharedChannel().SaveAttachment(attachment)
  1171  	require.NoError(t, err, "could not save attachment", err)
  1172  
  1173  	t.Run("Get existing shared channel attachment", func(t *testing.T) {
  1174  		r, err := ss.SharedChannel().GetAttachment(saved.FileId, saved.RemoteId)
  1175  		require.NoError(t, err, "couldn't get shared channel attachment", err)
  1176  
  1177  		require.Equal(t, saved.Id, r.Id)
  1178  		require.Equal(t, saved.FileId, r.FileId)
  1179  		require.Equal(t, saved.RemoteId, r.RemoteId)
  1180  		require.Equal(t, saved.CreateAt, r.CreateAt)
  1181  	})
  1182  
  1183  	t.Run("Get non-existent shared channel attachment", func(t *testing.T) {
  1184  		u, err := ss.SharedChannel().GetAttachment(model.NewId(), model.NewId())
  1185  		require.Error(t, err)
  1186  		require.Nil(t, u)
  1187  	})
  1188  }
  1189  
  1190  func testUpdateSharedChannelAttachmentLastSyncAt(t *testing.T, ss store.Store) {
  1191  	attachment := &model.SharedChannelAttachment{
  1192  		FileId:   model.NewId(),
  1193  		RemoteId: model.NewId(),
  1194  	}
  1195  
  1196  	saved, err := ss.SharedChannel().SaveAttachment(attachment)
  1197  	require.NoError(t, err, "couldn't save attachment", err)
  1198  
  1199  	future := model.GetMillis() + 3600000 // 1 hour in the future
  1200  
  1201  	t.Run("Update LastSyncAt for attachment", func(t *testing.T) {
  1202  		err := ss.SharedChannel().UpdateAttachmentLastSyncAt(saved.Id, future)
  1203  		require.NoError(t, err, "updateLastSyncAt should not error", err)
  1204  
  1205  		f, err := ss.SharedChannel().GetAttachment(saved.FileId, saved.RemoteId)
  1206  		require.NoError(t, err)
  1207  		require.Equal(t, future, f.LastSyncAt)
  1208  	})
  1209  
  1210  	t.Run("Update LastSyncAt for non-existent shared channel attachment", func(t *testing.T) {
  1211  		err := ss.SharedChannel().UpdateAttachmentLastSyncAt(model.NewId(), future)
  1212  		require.Error(t, err, "update non-existent attachment should error", err)
  1213  	})
  1214  }