1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package sqlstore
5
6import (
7	"database/sql"
8	"testing"
9
10	"github.com/stretchr/testify/assert"
11	"github.com/stretchr/testify/require"
12
13	"github.com/mattermost/mattermost-server/v6/model"
14	"github.com/mattermost/mattermost-server/v6/store"
15	"github.com/mattermost/mattermost-server/v6/store/searchtest"
16	"github.com/mattermost/mattermost-server/v6/store/storetest"
17)
18
19func TestChannelStore(t *testing.T) {
20	StoreTestWithSqlStore(t, storetest.TestChannelStore)
21}
22
23func TestSearchChannelStore(t *testing.T) {
24	StoreTestWithSearchTestEngine(t, searchtest.TestSearchChannelStore)
25}
26
27func TestChannelSearchQuerySQLInjection(t *testing.T) {
28	for _, st := range storeTypes {
29		t.Run(st.Name, func(t *testing.T) {
30			s := &SqlChannelStore{
31				SqlStore: st.SqlStore,
32			}
33
34			opts := store.ChannelSearchOpts{Term: "'or'1'=sleep(3))); -- -"}
35			builder := s.channelSearchQuery(&opts)
36			query, _, err := builder.ToSql()
37			require.NoError(t, err)
38			assert.NotContains(t, query, "sleep")
39		})
40	}
41}
42
43func TestChannelStoreInternalDataTypes(t *testing.T) {
44	t.Run("NewChannelMemberFromModel", func(t *testing.T) { testNewChannelMemberFromModel(t) })
45	t.Run("ChannelMemberWithSchemeRolesToModel", func(t *testing.T) { testChannelMemberWithSchemeRolesToModel(t) })
46	t.Run("AllChannelMemberProcess", func(t *testing.T) { testAllChannelMemberProcess(t) })
47}
48
49func testNewChannelMemberFromModel(t *testing.T) {
50	m := model.ChannelMember{
51		ChannelId:     model.NewId(),
52		UserId:        model.NewId(),
53		Roles:         "channel_user channel_admin custom_role",
54		LastViewedAt:  12345,
55		MsgCount:      2,
56		MentionCount:  1,
57		NotifyProps:   model.StringMap{"key": "value"},
58		LastUpdateAt:  54321,
59		SchemeGuest:   false,
60		SchemeUser:    true,
61		SchemeAdmin:   true,
62		ExplicitRoles: "custom_role",
63	}
64
65	db := NewChannelMemberFromModel(&m)
66
67	assert.Equal(t, m.ChannelId, db.ChannelId)
68	assert.Equal(t, m.UserId, db.UserId)
69	assert.Equal(t, m.LastViewedAt, db.LastViewedAt)
70	assert.Equal(t, m.MsgCount, db.MsgCount)
71	assert.Equal(t, m.MentionCount, db.MentionCount)
72	assert.Equal(t, int64(0), m.MentionCountRoot)
73	assert.Equal(t, m.NotifyProps, db.NotifyProps)
74	assert.Equal(t, m.LastUpdateAt, db.LastUpdateAt)
75	assert.Equal(t, true, db.SchemeGuest.Valid)
76	assert.Equal(t, true, db.SchemeUser.Valid)
77	assert.Equal(t, true, db.SchemeAdmin.Valid)
78	assert.Equal(t, m.SchemeGuest, db.SchemeGuest.Bool)
79	assert.Equal(t, m.SchemeUser, db.SchemeUser.Bool)
80	assert.Equal(t, m.SchemeAdmin, db.SchemeAdmin.Bool)
81	assert.Equal(t, m.ExplicitRoles, db.Roles)
82}
83
84func testChannelMemberWithSchemeRolesToModel(t *testing.T) {
85	t.Run("BasicProperties", func(t *testing.T) {
86		// Test all the non-roles properties here.
87		db := channelMemberWithSchemeRoles{
88			ChannelId:                     model.NewId(),
89			UserId:                        model.NewId(),
90			Roles:                         "custom_role",
91			LastViewedAt:                  12345,
92			MsgCount:                      2,
93			MentionCount:                  1,
94			NotifyProps:                   model.StringMap{"key": "value"},
95			LastUpdateAt:                  54321,
96			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
97			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
98			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
99			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
100			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
101			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
102			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
103			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
104			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
105		}
106
107		m := db.ToModel()
108
109		assert.Equal(t, db.ChannelId, m.ChannelId)
110		assert.Equal(t, db.UserId, m.UserId)
111		assert.Equal(t, "custom_role channel_user channel_admin", m.Roles)
112		assert.Equal(t, db.LastViewedAt, m.LastViewedAt)
113		assert.Equal(t, db.MsgCount, m.MsgCount)
114		assert.Equal(t, db.MentionCount, m.MentionCount)
115		assert.Equal(t, db.MentionCountRoot, m.MentionCountRoot)
116		assert.Equal(t, db.NotifyProps, m.NotifyProps)
117		assert.Equal(t, db.LastUpdateAt, m.LastUpdateAt)
118		assert.Equal(t, db.SchemeGuest.Bool, m.SchemeGuest)
119		assert.Equal(t, db.SchemeUser.Bool, m.SchemeUser)
120		assert.Equal(t, db.SchemeAdmin.Bool, m.SchemeAdmin)
121		assert.Equal(t, db.Roles, m.ExplicitRoles)
122	})
123
124	// Example data *before* the Phase 2 migration has taken place.
125	t.Run("Unmigrated_NoScheme_User", func(t *testing.T) {
126		db := channelMemberWithSchemeRoles{
127			Roles:                         "channel_user",
128			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
129			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
130			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
131			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
132			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
133			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
134			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
135			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
136			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
137		}
138
139		cm := db.ToModel()
140
141		assert.Equal(t, "channel_user", cm.Roles)
142		assert.Equal(t, false, cm.SchemeGuest)
143		assert.Equal(t, true, cm.SchemeUser)
144		assert.Equal(t, false, cm.SchemeAdmin)
145		assert.Equal(t, "", cm.ExplicitRoles)
146	})
147
148	t.Run("Unmigrated_NoScheme_Admin", func(t *testing.T) {
149		db := channelMemberWithSchemeRoles{
150			Roles:                         "channel_admin channel_user",
151			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
152			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
153			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
154			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
155			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
156			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
157			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
158			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
159			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
160		}
161
162		cm := db.ToModel()
163
164		assert.Equal(t, "channel_user channel_admin", cm.Roles)
165		assert.Equal(t, false, cm.SchemeGuest)
166		assert.Equal(t, true, cm.SchemeUser)
167		assert.Equal(t, true, cm.SchemeAdmin)
168		assert.Equal(t, "", cm.ExplicitRoles)
169	})
170
171	t.Run("Unmigrated_NoScheme_CustomRole", func(t *testing.T) {
172		db := channelMemberWithSchemeRoles{
173			Roles:                         "custom_role",
174			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
175			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
176			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
177			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
178			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
179			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
180			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
181			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
182			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
183		}
184
185		cm := db.ToModel()
186
187		assert.Equal(t, "custom_role", cm.Roles)
188		assert.Equal(t, false, cm.SchemeUser)
189		assert.Equal(t, false, cm.SchemeAdmin)
190		assert.Equal(t, "custom_role", cm.ExplicitRoles)
191	})
192
193	t.Run("Unmigrated_NoScheme_UserAndCustomRole", func(t *testing.T) {
194		db := channelMemberWithSchemeRoles{
195			Roles:                         "channel_user custom_role",
196			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
197			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
198			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
199			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
200			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
201			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
202			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
203			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
204			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
205		}
206
207		cm := db.ToModel()
208
209		assert.Equal(t, "custom_role channel_user", cm.Roles)
210		assert.Equal(t, false, cm.SchemeGuest)
211		assert.Equal(t, true, cm.SchemeUser)
212		assert.Equal(t, false, cm.SchemeAdmin)
213		assert.Equal(t, "custom_role", cm.ExplicitRoles)
214	})
215
216	t.Run("Unmigrated_NoScheme_AdminAndCustomRole", func(t *testing.T) {
217		db := channelMemberWithSchemeRoles{
218			Roles:                         "channel_user channel_admin custom_role",
219			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
220			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
221			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
222			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
223			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
224			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
225			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
226			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
227			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
228		}
229
230		cm := db.ToModel()
231
232		assert.Equal(t, "custom_role channel_user channel_admin", cm.Roles)
233		assert.Equal(t, false, cm.SchemeGuest)
234		assert.Equal(t, true, cm.SchemeUser)
235		assert.Equal(t, true, cm.SchemeAdmin)
236		assert.Equal(t, "custom_role", cm.ExplicitRoles)
237	})
238
239	t.Run("Unmigrated_NoScheme_NoRoles", func(t *testing.T) {
240		db := channelMemberWithSchemeRoles{
241			Roles:                         "",
242			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
243			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
244			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
245			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
246			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
247			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
248			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
249			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
250			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
251		}
252
253		cm := db.ToModel()
254
255		assert.Equal(t, "", cm.Roles)
256		assert.Equal(t, false, cm.SchemeGuest)
257		assert.Equal(t, false, cm.SchemeUser)
258		assert.Equal(t, false, cm.SchemeAdmin)
259		assert.Equal(t, "", cm.ExplicitRoles)
260	})
261
262	// Example data *after* the Phase 2 migration has taken place.
263	t.Run("Migrated_NoScheme_User", func(t *testing.T) {
264		db := channelMemberWithSchemeRoles{
265			Roles:                         "",
266			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
267			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
268			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
269			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
270			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
271			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
272			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
273			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
274			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
275		}
276
277		cm := db.ToModel()
278
279		assert.Equal(t, "channel_user", cm.Roles)
280		assert.Equal(t, false, cm.SchemeGuest)
281		assert.Equal(t, true, cm.SchemeUser)
282		assert.Equal(t, false, cm.SchemeAdmin)
283		assert.Equal(t, "", cm.ExplicitRoles)
284	})
285
286	t.Run("Migrated_NoScheme_Admin", func(t *testing.T) {
287		db := channelMemberWithSchemeRoles{
288			Roles:                         "",
289			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
290			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
291			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
292			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
293			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
294			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
295			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
296			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
297			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
298		}
299
300		cm := db.ToModel()
301
302		assert.Equal(t, "channel_user channel_admin", cm.Roles)
303		assert.Equal(t, false, cm.SchemeGuest)
304		assert.Equal(t, true, cm.SchemeUser)
305		assert.Equal(t, true, cm.SchemeAdmin)
306		assert.Equal(t, "", cm.ExplicitRoles)
307	})
308
309	t.Run("Migrated_NoScheme_Guest", func(t *testing.T) {
310		db := channelMemberWithSchemeRoles{
311			Roles:                         "",
312			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
313			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
314			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
315			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
316			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
317			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
318			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
319			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
320			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
321		}
322
323		cm := db.ToModel()
324
325		assert.Equal(t, "channel_guest", cm.Roles)
326		assert.Equal(t, true, cm.SchemeGuest)
327		assert.Equal(t, false, cm.SchemeUser)
328		assert.Equal(t, false, cm.SchemeAdmin)
329		assert.Equal(t, "", cm.ExplicitRoles)
330	})
331
332	t.Run("Migrated_NoScheme_CustomRole", func(t *testing.T) {
333		db := channelMemberWithSchemeRoles{
334			Roles:                         "custom_role",
335			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
336			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
337			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
338			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
339			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
340			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
341			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
342			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
343			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
344		}
345
346		cm := db.ToModel()
347
348		assert.Equal(t, "custom_role", cm.Roles)
349		assert.Equal(t, false, cm.SchemeGuest)
350		assert.Equal(t, false, cm.SchemeUser)
351		assert.Equal(t, false, cm.SchemeAdmin)
352		assert.Equal(t, "custom_role", cm.ExplicitRoles)
353	})
354
355	t.Run("Migrated_NoScheme_UserAndCustomRole", func(t *testing.T) {
356		db := channelMemberWithSchemeRoles{
357			Roles:                         "custom_role",
358			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
359			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
360			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
361			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
362			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
363			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
364			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
365		}
366
367		cm := db.ToModel()
368
369		assert.Equal(t, "custom_role channel_user", cm.Roles)
370		assert.Equal(t, false, cm.SchemeGuest)
371		assert.Equal(t, true, cm.SchemeUser)
372		assert.Equal(t, false, cm.SchemeAdmin)
373		assert.Equal(t, "custom_role", cm.ExplicitRoles)
374	})
375
376	t.Run("Migrated_NoScheme_AdminAndCustomRole", func(t *testing.T) {
377		db := channelMemberWithSchemeRoles{
378			Roles:                         "custom_role",
379			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
380			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
381			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
382			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
383			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
384			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
385			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
386			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
387			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
388		}
389
390		cm := db.ToModel()
391
392		assert.Equal(t, "custom_role channel_user channel_admin", cm.Roles)
393		assert.Equal(t, false, cm.SchemeGuest)
394		assert.Equal(t, true, cm.SchemeUser)
395		assert.Equal(t, true, cm.SchemeAdmin)
396		assert.Equal(t, "custom_role", cm.ExplicitRoles)
397	})
398
399	t.Run("Migrated_NoScheme_GuestAndCustomRole", func(t *testing.T) {
400		db := channelMemberWithSchemeRoles{
401			Roles:                         "custom_role",
402			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
403			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
404			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
405			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
406			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
407			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
408			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
409			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
410			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
411		}
412
413		cm := db.ToModel()
414
415		assert.Equal(t, "custom_role channel_guest", cm.Roles)
416		assert.Equal(t, true, cm.SchemeGuest)
417		assert.Equal(t, false, cm.SchemeUser)
418		assert.Equal(t, false, cm.SchemeAdmin)
419		assert.Equal(t, "custom_role", cm.ExplicitRoles)
420	})
421
422	t.Run("Migrated_NoScheme_NoRoles", func(t *testing.T) {
423		db := channelMemberWithSchemeRoles{
424			Roles:                         "",
425			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
426			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
427			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
428			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
429			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
430			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
431			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
432			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
433			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
434		}
435
436		cm := db.ToModel()
437
438		assert.Equal(t, "", cm.Roles)
439		assert.Equal(t, false, cm.SchemeGuest)
440		assert.Equal(t, false, cm.SchemeUser)
441		assert.Equal(t, false, cm.SchemeAdmin)
442		assert.Equal(t, "", cm.ExplicitRoles)
443	})
444
445	// Example data with a channel scheme.
446	t.Run("Migrated_ChannelScheme_User", func(t *testing.T) {
447		db := channelMemberWithSchemeRoles{
448			Roles:                         "",
449			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
450			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
451			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
452			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
453			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
454			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
455			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
456			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
457			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
458		}
459
460		cm := db.ToModel()
461
462		assert.Equal(t, "cscheme_user", cm.Roles)
463		assert.Equal(t, false, cm.SchemeGuest)
464		assert.Equal(t, true, cm.SchemeUser)
465		assert.Equal(t, false, cm.SchemeAdmin)
466		assert.Equal(t, "", cm.ExplicitRoles)
467	})
468
469	t.Run("Migrated_ChannelScheme_Admin", func(t *testing.T) {
470		db := channelMemberWithSchemeRoles{
471			Roles:                         "",
472			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
473			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
474			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
475			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
476			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
477			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
478			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
479			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
480			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
481		}
482
483		cm := db.ToModel()
484
485		assert.Equal(t, "cscheme_user cscheme_admin", cm.Roles)
486		assert.Equal(t, false, cm.SchemeGuest)
487		assert.Equal(t, true, cm.SchemeUser)
488		assert.Equal(t, true, cm.SchemeAdmin)
489		assert.Equal(t, "", cm.ExplicitRoles)
490	})
491
492	t.Run("Migrated_ChannelScheme_Guest", func(t *testing.T) {
493		db := channelMemberWithSchemeRoles{
494			Roles:                         "",
495			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
496			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
497			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
498			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
499			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
500			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
501			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
502			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
503			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
504		}
505
506		cm := db.ToModel()
507
508		assert.Equal(t, "cscheme_guest", cm.Roles)
509		assert.Equal(t, true, cm.SchemeGuest)
510		assert.Equal(t, false, cm.SchemeUser)
511		assert.Equal(t, false, cm.SchemeAdmin)
512		assert.Equal(t, "", cm.ExplicitRoles)
513	})
514
515	t.Run("Migrated_ChannelScheme_CustomRole", func(t *testing.T) {
516		db := channelMemberWithSchemeRoles{
517			Roles:                         "custom_role",
518			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
519			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
520			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
521			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
522			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
523			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
524			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
525			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
526			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
527		}
528
529		cm := db.ToModel()
530
531		assert.Equal(t, "custom_role", cm.Roles)
532		assert.Equal(t, false, cm.SchemeGuest)
533		assert.Equal(t, false, cm.SchemeUser)
534		assert.Equal(t, false, cm.SchemeAdmin)
535		assert.Equal(t, "custom_role", cm.ExplicitRoles)
536	})
537
538	t.Run("Migrated_ChannelScheme_UserAndCustomRole", func(t *testing.T) {
539		db := channelMemberWithSchemeRoles{
540			Roles:                         "custom_role",
541			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
542			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
543			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
544			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
545			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
546			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
547			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
548			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
549			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
550		}
551
552		cm := db.ToModel()
553
554		assert.Equal(t, "custom_role cscheme_user", cm.Roles)
555		assert.Equal(t, false, cm.SchemeGuest)
556		assert.Equal(t, true, cm.SchemeUser)
557		assert.Equal(t, false, cm.SchemeAdmin)
558		assert.Equal(t, "custom_role", cm.ExplicitRoles)
559	})
560
561	t.Run("Migrated_ChannelScheme_AdminAndCustomRole", func(t *testing.T) {
562		db := channelMemberWithSchemeRoles{
563			Roles:                         "custom_role",
564			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
565			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
566			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
567			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
568			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
569			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
570			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
571			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
572			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
573		}
574
575		cm := db.ToModel()
576
577		assert.Equal(t, "custom_role cscheme_user cscheme_admin", cm.Roles)
578		assert.Equal(t, false, cm.SchemeGuest)
579		assert.Equal(t, true, cm.SchemeUser)
580		assert.Equal(t, true, cm.SchemeAdmin)
581		assert.Equal(t, "custom_role", cm.ExplicitRoles)
582	})
583
584	t.Run("Migrated_ChannelScheme_GuestAndCustomRole", func(t *testing.T) {
585		db := channelMemberWithSchemeRoles{
586			Roles:                         "custom_role",
587			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
588			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
589			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
590			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
591			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
592			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
593			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
594			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
595			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
596		}
597
598		cm := db.ToModel()
599
600		assert.Equal(t, "custom_role cscheme_guest", cm.Roles)
601		assert.Equal(t, true, cm.SchemeGuest)
602		assert.Equal(t, false, cm.SchemeUser)
603		assert.Equal(t, false, cm.SchemeAdmin)
604		assert.Equal(t, "custom_role", cm.ExplicitRoles)
605	})
606
607	t.Run("Migrated_ChannelScheme_NoRoles", func(t *testing.T) {
608		db := channelMemberWithSchemeRoles{
609			Roles:                         "",
610			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
611			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
612			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
613			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
614			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
615			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
616			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
617			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
618			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
619		}
620
621		cm := db.ToModel()
622
623		assert.Equal(t, "", cm.Roles)
624		assert.Equal(t, false, cm.SchemeGuest)
625		assert.Equal(t, false, cm.SchemeUser)
626		assert.Equal(t, false, cm.SchemeAdmin)
627		assert.Equal(t, "", cm.ExplicitRoles)
628	})
629
630	// Example data with a team scheme.
631	t.Run("Migrated_TeamScheme_User", func(t *testing.T) {
632		db := channelMemberWithSchemeRoles{
633			Roles:                         "",
634			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
635			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
636			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
637			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
638			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
639			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
640			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
641			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
642			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
643		}
644
645		cm := db.ToModel()
646
647		assert.Equal(t, "tscheme_channeluser", cm.Roles)
648		assert.Equal(t, false, cm.SchemeGuest)
649		assert.Equal(t, true, cm.SchemeUser)
650		assert.Equal(t, false, cm.SchemeAdmin)
651		assert.Equal(t, "", cm.ExplicitRoles)
652	})
653
654	t.Run("Migrated_TeamScheme_Admin", func(t *testing.T) {
655		db := channelMemberWithSchemeRoles{
656			Roles:                         "",
657			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
658			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
659			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
660			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
661			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
662			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
663			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
664			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
665			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
666		}
667
668		cm := db.ToModel()
669
670		assert.Equal(t, "tscheme_channeluser tscheme_channeladmin", cm.Roles)
671		assert.Equal(t, false, cm.SchemeGuest)
672		assert.Equal(t, true, cm.SchemeUser)
673		assert.Equal(t, true, cm.SchemeAdmin)
674		assert.Equal(t, "", cm.ExplicitRoles)
675	})
676
677	t.Run("Migrated_TeamScheme_Guest", func(t *testing.T) {
678		db := channelMemberWithSchemeRoles{
679			Roles:                         "",
680			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
681			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
682			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
683			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
684			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
685			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
686			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
687			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
688			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
689		}
690
691		cm := db.ToModel()
692
693		assert.Equal(t, "tscheme_channelguest", cm.Roles)
694		assert.Equal(t, true, cm.SchemeGuest)
695		assert.Equal(t, false, cm.SchemeUser)
696		assert.Equal(t, false, cm.SchemeAdmin)
697		assert.Equal(t, "", cm.ExplicitRoles)
698	})
699
700	t.Run("Migrated_TeamScheme_CustomRole", func(t *testing.T) {
701		db := channelMemberWithSchemeRoles{
702			Roles:                         "custom_role",
703			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
704			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
705			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
706			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
707			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
708			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
709			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
710			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
711			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
712		}
713
714		cm := db.ToModel()
715
716		assert.Equal(t, "custom_role", cm.Roles)
717		assert.Equal(t, false, cm.SchemeGuest)
718		assert.Equal(t, false, cm.SchemeUser)
719		assert.Equal(t, false, cm.SchemeAdmin)
720		assert.Equal(t, "custom_role", cm.ExplicitRoles)
721	})
722
723	t.Run("Migrated_TeamScheme_UserAndCustomRole", func(t *testing.T) {
724		db := channelMemberWithSchemeRoles{
725			Roles:                         "custom_role",
726			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
727			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
728			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
729			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
730			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
731			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
732			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
733			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
734			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
735		}
736
737		cm := db.ToModel()
738
739		assert.Equal(t, "custom_role tscheme_channeluser", cm.Roles)
740		assert.Equal(t, false, cm.SchemeGuest)
741		assert.Equal(t, true, cm.SchemeUser)
742		assert.Equal(t, false, cm.SchemeAdmin)
743		assert.Equal(t, "custom_role", cm.ExplicitRoles)
744	})
745
746	t.Run("Migrated_TeamScheme_AdminAndCustomRole", func(t *testing.T) {
747		db := channelMemberWithSchemeRoles{
748			Roles:                         "custom_role",
749			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
750			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
751			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
752			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
753			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
754			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
755			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
756			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
757			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
758		}
759
760		cm := db.ToModel()
761
762		assert.Equal(t, "custom_role tscheme_channeluser tscheme_channeladmin", cm.Roles)
763		assert.Equal(t, false, cm.SchemeGuest)
764		assert.Equal(t, true, cm.SchemeUser)
765		assert.Equal(t, true, cm.SchemeAdmin)
766		assert.Equal(t, "custom_role", cm.ExplicitRoles)
767	})
768
769	t.Run("Migrated_TeamScheme_GuestAndCustomRole", func(t *testing.T) {
770		db := channelMemberWithSchemeRoles{
771			Roles:                         "custom_role",
772			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
773			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
774			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
775			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
776			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
777			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
778			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
779			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
780			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
781		}
782
783		cm := db.ToModel()
784
785		assert.Equal(t, "custom_role tscheme_channelguest", cm.Roles)
786		assert.Equal(t, true, cm.SchemeGuest)
787		assert.Equal(t, false, cm.SchemeUser)
788		assert.Equal(t, false, cm.SchemeAdmin)
789		assert.Equal(t, "custom_role", cm.ExplicitRoles)
790	})
791
792	t.Run("Migrated_TeamScheme_NoRoles", func(t *testing.T) {
793		db := channelMemberWithSchemeRoles{
794			Roles:                         "",
795			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
796			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
797			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
798			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
799			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
800			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
801			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
802			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
803			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
804		}
805
806		cm := db.ToModel()
807
808		assert.Equal(t, "", cm.Roles)
809		assert.Equal(t, false, cm.SchemeGuest)
810		assert.Equal(t, false, cm.SchemeUser)
811		assert.Equal(t, false, cm.SchemeAdmin)
812		assert.Equal(t, "", cm.ExplicitRoles)
813	})
814
815	// Example data with a team and channel scheme.
816	t.Run("Migrated_TeamAndChannelScheme_User", func(t *testing.T) {
817		db := channelMemberWithSchemeRoles{
818			Roles:                         "",
819			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
820			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
821			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
822			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
823			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
824			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
825			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
826			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
827			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
828		}
829
830		cm := db.ToModel()
831
832		assert.Equal(t, "cscheme_user", cm.Roles)
833		assert.Equal(t, false, cm.SchemeGuest)
834		assert.Equal(t, true, cm.SchemeUser)
835		assert.Equal(t, false, cm.SchemeAdmin)
836		assert.Equal(t, "", cm.ExplicitRoles)
837	})
838
839	t.Run("Migrated_TeamAndChannelScheme_Admin", func(t *testing.T) {
840		db := channelMemberWithSchemeRoles{
841			Roles:                         "",
842			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
843			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
844			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
845			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
846			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
847			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
848			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
849			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
850			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
851		}
852
853		cm := db.ToModel()
854
855		assert.Equal(t, "cscheme_user cscheme_admin", cm.Roles)
856		assert.Equal(t, false, cm.SchemeGuest)
857		assert.Equal(t, true, cm.SchemeUser)
858		assert.Equal(t, true, cm.SchemeAdmin)
859		assert.Equal(t, "", cm.ExplicitRoles)
860	})
861
862	t.Run("Migrated_TeamAndChannelScheme_Guest", func(t *testing.T) {
863		db := channelMemberWithSchemeRoles{
864			Roles:                         "",
865			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
866			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
867			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
868			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
869			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
870			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
871			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
872			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
873			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
874		}
875
876		cm := db.ToModel()
877
878		assert.Equal(t, "cscheme_guest", cm.Roles)
879		assert.Equal(t, true, cm.SchemeGuest)
880		assert.Equal(t, false, cm.SchemeUser)
881		assert.Equal(t, false, cm.SchemeAdmin)
882		assert.Equal(t, "", cm.ExplicitRoles)
883	})
884
885	t.Run("Migrated_TeamAndChannelScheme_CustomRole", func(t *testing.T) {
886		db := channelMemberWithSchemeRoles{
887			Roles:                         "custom_role",
888			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
889			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
890			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
891			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
892			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
893			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
894			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
895			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
896			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
897		}
898
899		cm := db.ToModel()
900
901		assert.Equal(t, "custom_role", cm.Roles)
902		assert.Equal(t, false, cm.SchemeGuest)
903		assert.Equal(t, false, cm.SchemeUser)
904		assert.Equal(t, false, cm.SchemeAdmin)
905		assert.Equal(t, "custom_role", cm.ExplicitRoles)
906	})
907
908	t.Run("Migrated_TeamAndChannelScheme_UserAndCustomRole", func(t *testing.T) {
909		db := channelMemberWithSchemeRoles{
910			Roles:                         "custom_role",
911			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
912			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
913			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
914			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
915			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
916			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
917			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
918			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
919			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
920		}
921
922		cm := db.ToModel()
923
924		assert.Equal(t, "custom_role cscheme_user", cm.Roles)
925		assert.Equal(t, false, cm.SchemeGuest)
926		assert.Equal(t, true, cm.SchemeUser)
927		assert.Equal(t, false, cm.SchemeAdmin)
928		assert.Equal(t, "custom_role", cm.ExplicitRoles)
929	})
930
931	t.Run("Migrated_TeamAndChannelScheme_AdminAndCustomRole", func(t *testing.T) {
932		db := channelMemberWithSchemeRoles{
933			Roles:                         "custom_role",
934			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
935			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
936			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
937			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
938			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
939			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
940			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
941			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
942			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
943		}
944
945		cm := db.ToModel()
946
947		assert.Equal(t, "custom_role cscheme_user cscheme_admin", cm.Roles)
948		assert.Equal(t, false, cm.SchemeGuest)
949		assert.Equal(t, true, cm.SchemeUser)
950		assert.Equal(t, true, cm.SchemeAdmin)
951		assert.Equal(t, "custom_role", cm.ExplicitRoles)
952	})
953
954	t.Run("Migrated_TeamAndChannelScheme_GuestAndCustomRole", func(t *testing.T) {
955		db := channelMemberWithSchemeRoles{
956			Roles:                         "custom_role",
957			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
958			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
959			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
960			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
961			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
962			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
963			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
964			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
965			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
966		}
967
968		cm := db.ToModel()
969
970		assert.Equal(t, "custom_role cscheme_guest", cm.Roles)
971		assert.Equal(t, true, cm.SchemeGuest)
972		assert.Equal(t, false, cm.SchemeUser)
973		assert.Equal(t, false, cm.SchemeAdmin)
974		assert.Equal(t, "custom_role", cm.ExplicitRoles)
975	})
976
977	t.Run("Migrated_TeamAndChannelScheme_NoRoles", func(t *testing.T) {
978		db := channelMemberWithSchemeRoles{
979			Roles:                         "",
980			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
981			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
982			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
983			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
984			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
985			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
986			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
987			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
988			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
989		}
990
991		cm := db.ToModel()
992
993		assert.Equal(t, "", cm.Roles)
994		assert.Equal(t, false, cm.SchemeGuest)
995		assert.Equal(t, false, cm.SchemeUser)
996		assert.Equal(t, false, cm.SchemeAdmin)
997		assert.Equal(t, "", cm.ExplicitRoles)
998	})
999}
1000
1001func testAllChannelMemberProcess(t *testing.T) {
1002	t.Run("Unmigrated_User", func(t *testing.T) {
1003		db := allChannelMember{
1004			Roles:                         "channel_user",
1005			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
1006			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
1007			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
1008			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1009			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1010			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1011			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1012			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1013			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1014		}
1015
1016		_, roles := db.Process()
1017
1018		assert.Equal(t, "channel_user", roles)
1019	})
1020
1021	t.Run("Unmigrated_Admin", func(t *testing.T) {
1022		db := allChannelMember{
1023			Roles:                         "channel_user channel_admin",
1024			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
1025			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
1026			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
1027			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1028			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1029			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1030			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1031			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1032			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1033		}
1034
1035		_, roles := db.Process()
1036
1037		assert.Equal(t, "channel_user channel_admin", roles)
1038	})
1039
1040	t.Run("Unmigrated_None", func(t *testing.T) {
1041		db := allChannelMember{
1042			Roles:                         "",
1043			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
1044			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
1045			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
1046			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1047			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1048			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1049			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1050			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1051			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1052		}
1053
1054		_, roles := db.Process()
1055
1056		assert.Equal(t, "", roles)
1057	})
1058
1059	t.Run("Unmigrated_Custom", func(t *testing.T) {
1060		db := allChannelMember{
1061			Roles:                         "custom",
1062			SchemeGuest:                   sql.NullBool{Valid: false, Bool: false},
1063			SchemeUser:                    sql.NullBool{Valid: false, Bool: false},
1064			SchemeAdmin:                   sql.NullBool{Valid: false, Bool: false},
1065			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1066			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1067			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1068			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1069			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1070			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1071		}
1072
1073		_, roles := db.Process()
1074
1075		assert.Equal(t, "custom", roles)
1076	})
1077
1078	t.Run("MigratedNoScheme_User", func(t *testing.T) {
1079		db := allChannelMember{
1080			Roles:                         "",
1081			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1082			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1083			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1084			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1085			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1086			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1087			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1088			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1089			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1090		}
1091
1092		_, roles := db.Process()
1093
1094		assert.Equal(t, "channel_user", roles)
1095	})
1096
1097	t.Run("MigratedNoScheme_Admin", func(t *testing.T) {
1098		db := allChannelMember{
1099			Roles:                         "",
1100			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1101			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1102			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
1103			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1104			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1105			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1106			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1107			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1108			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1109		}
1110
1111		_, roles := db.Process()
1112
1113		assert.Equal(t, "channel_user channel_admin", roles)
1114	})
1115
1116	t.Run("MigratedNoScheme_Guest", func(t *testing.T) {
1117		db := allChannelMember{
1118			Roles:                         "",
1119			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
1120			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1121			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1122			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1123			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1124			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1125			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1126			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1127			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1128		}
1129
1130		_, roles := db.Process()
1131
1132		assert.Equal(t, "channel_guest", roles)
1133	})
1134
1135	t.Run("MigratedNoScheme_None", func(t *testing.T) {
1136		db := allChannelMember{
1137			Roles:                         "",
1138			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1139			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1140			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1141			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1142			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1143			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1144			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1145			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1146			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1147		}
1148
1149		_, roles := db.Process()
1150
1151		assert.Equal(t, "", roles)
1152	})
1153
1154	t.Run("MigratedChannelScheme_User", func(t *testing.T) {
1155		db := allChannelMember{
1156			Roles:                         "",
1157			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1158			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1159			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1160			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1161			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1162			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1163			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1164			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1165			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1166		}
1167
1168		_, roles := db.Process()
1169
1170		assert.Equal(t, "cscheme_user", roles)
1171	})
1172
1173	t.Run("MigratedChannelScheme_Admin", func(t *testing.T) {
1174		db := allChannelMember{
1175			Roles:                         "",
1176			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1177			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1178			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
1179			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1180			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1181			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1182			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1183			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1184			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1185		}
1186
1187		_, roles := db.Process()
1188
1189		assert.Equal(t, "cscheme_user cscheme_admin", roles)
1190	})
1191
1192	t.Run("MigratedChannelScheme_Guest", func(t *testing.T) {
1193		db := allChannelMember{
1194			Roles:                         "",
1195			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
1196			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1197			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1198			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1199			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1200			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1201			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1202			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1203			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1204		}
1205
1206		_, roles := db.Process()
1207
1208		assert.Equal(t, "cscheme_guest", roles)
1209	})
1210
1211	t.Run("MigratedChannelScheme_None", func(t *testing.T) {
1212		db := allChannelMember{
1213			Roles:                         "",
1214			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1215			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1216			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1217			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1218			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1219			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1220			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1221			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1222			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1223		}
1224
1225		_, roles := db.Process()
1226
1227		assert.Equal(t, "", roles)
1228	})
1229
1230	t.Run("MigratedTeamScheme_User", func(t *testing.T) {
1231		db := allChannelMember{
1232			Roles:                         "",
1233			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1234			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1235			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1236			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1237			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1238			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1239			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1240			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1241			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1242		}
1243
1244		_, roles := db.Process()
1245
1246		assert.Equal(t, "tscheme_channeluser", roles)
1247	})
1248
1249	t.Run("MigratedTeamScheme_Admin", func(t *testing.T) {
1250		db := allChannelMember{
1251			Roles:                         "",
1252			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1253			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1254			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
1255			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1256			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1257			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1258			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1259			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1260			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1261		}
1262
1263		_, roles := db.Process()
1264
1265		assert.Equal(t, "tscheme_channeluser tscheme_channeladmin", roles)
1266	})
1267
1268	t.Run("MigratedTeamScheme_Guest", func(t *testing.T) {
1269		db := allChannelMember{
1270			Roles:                         "",
1271			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
1272			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1273			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1274			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1275			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1276			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1277			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1278			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1279			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1280		}
1281
1282		_, roles := db.Process()
1283
1284		assert.Equal(t, "tscheme_channelguest", roles)
1285	})
1286
1287	t.Run("MigratedTeamScheme_None", func(t *testing.T) {
1288		db := allChannelMember{
1289			Roles:                         "",
1290			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1291			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1292			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1293			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1294			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1295			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1296			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1297			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1298			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1299		}
1300
1301		_, roles := db.Process()
1302
1303		assert.Equal(t, "", roles)
1304	})
1305
1306	t.Run("MigratedTeamAndChannelScheme_User", func(t *testing.T) {
1307		db := allChannelMember{
1308			Roles:                         "",
1309			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1310			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1311			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1312			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1313			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1314			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1315			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1316			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1317			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1318		}
1319
1320		_, roles := db.Process()
1321
1322		assert.Equal(t, "cscheme_user", roles)
1323	})
1324
1325	t.Run("MigratedTeamAndChannelScheme_Admin", func(t *testing.T) {
1326		db := allChannelMember{
1327			Roles:                         "",
1328			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1329			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1330			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: true},
1331			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1332			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1333			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1334			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1335			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1336			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1337		}
1338
1339		_, roles := db.Process()
1340
1341		assert.Equal(t, "cscheme_user cscheme_admin", roles)
1342	})
1343
1344	t.Run("MigratedTeamAndChannelScheme_Guest", func(t *testing.T) {
1345		db := allChannelMember{
1346			Roles:                         "",
1347			SchemeGuest:                   sql.NullBool{Valid: true, Bool: true},
1348			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1349			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1350			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1351			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1352			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1353			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1354			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1355			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1356		}
1357
1358		_, roles := db.Process()
1359
1360		assert.Equal(t, "cscheme_guest", roles)
1361	})
1362
1363	t.Run("MigratedTeamAndChannelScheme_None", func(t *testing.T) {
1364		db := allChannelMember{
1365			Roles:                         "",
1366			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1367			SchemeUser:                    sql.NullBool{Valid: true, Bool: false},
1368			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1369			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: true, String: "tscheme_channelguest"},
1370			TeamSchemeDefaultUserRole:     sql.NullString{Valid: true, String: "tscheme_channeluser"},
1371			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: true, String: "tscheme_channeladmin"},
1372			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: true, String: "cscheme_guest"},
1373			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: true, String: "cscheme_user"},
1374			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: true, String: "cscheme_admin"},
1375		}
1376
1377		_, roles := db.Process()
1378
1379		assert.Equal(t, "", roles)
1380	})
1381
1382	t.Run("DeduplicationCheck", func(t *testing.T) {
1383		db := allChannelMember{
1384			Roles:                         "channel_user",
1385			SchemeGuest:                   sql.NullBool{Valid: true, Bool: false},
1386			SchemeUser:                    sql.NullBool{Valid: true, Bool: true},
1387			SchemeAdmin:                   sql.NullBool{Valid: true, Bool: false},
1388			TeamSchemeDefaultGuestRole:    sql.NullString{Valid: false},
1389			TeamSchemeDefaultUserRole:     sql.NullString{Valid: false},
1390			TeamSchemeDefaultAdminRole:    sql.NullString{Valid: false},
1391			ChannelSchemeDefaultGuestRole: sql.NullString{Valid: false},
1392			ChannelSchemeDefaultUserRole:  sql.NullString{Valid: false},
1393			ChannelSchemeDefaultAdminRole: sql.NullString{Valid: false},
1394		}
1395
1396		_, roles := db.Process()
1397
1398		assert.Equal(t, "channel_user", roles)
1399	})
1400}
1401