github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/favorite_test.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package engine
     5  
     6  import (
     7  	"fmt"
     8  	"sort"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/keybase/client/go/libkb"
    13  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    14  )
    15  
    16  func makeFave(u1, u2 string) string {
    17  	return strings.Join([]string{u1, u2}, ",")
    18  }
    19  
    20  func TestFavoriteAdd(t *testing.T) {
    21  	tc := SetupEngineTest(t, "template")
    22  	defer tc.Cleanup()
    23  	u := CreateAndSignupFakeUser(tc, "fav")
    24  	expectedFaves := newFavorites(u.Username)
    25  
    26  	idUI := &FakeIdentifyUI{}
    27  	fave := makeFave(u.Username, "t_bob")
    28  	addfav(fave, keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
    29  	if !listfav(tc).Equal(*expectedFaves) {
    30  		t.Errorf("bad favorites")
    31  	}
    32  
    33  	// Add the same share again. The number shouldn't change.
    34  	addfav(fave, keybase1.FolderType_PRIVATE, true, idUI, tc, nil)
    35  	if !listfav(tc).Equal(*expectedFaves) {
    36  		t.Errorf("bad favorites")
    37  	}
    38  
    39  	// Add a public share of the same name, make sure both are represented.
    40  	addfav(fave, keybase1.FolderType_PUBLIC, true, idUI, tc, expectedFaves)
    41  	if !listfav(tc).Equal(*expectedFaves) {
    42  		t.Errorf("bad favorites")
    43  	}
    44  }
    45  
    46  // Test adding a favorite with a social assertion.
    47  // Sharing before signup, social assertion user doesn't
    48  // exist yet.
    49  func TestFavoriteAddSocial(t *testing.T) {
    50  	tc := SetupEngineTest(t, "template")
    51  	defer tc.Cleanup()
    52  	u := CreateAndSignupFakeUser(tc, "fav")
    53  	expectedFaves := newFavorites(u.Username)
    54  
    55  	idUI := &FakeIdentifyUI{}
    56  	addfav(fmt.Sprintf("bob@twitter,%s", u.Username), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
    57  	if !listfav(tc).Equal(*expectedFaves) {
    58  		t.Errorf("bad favorites")
    59  	}
    60  
    61  	if idUI.DisplayTLFCount != 1 {
    62  		t.Errorf("DisplayTLFCount: %d, expected 1", idUI.DisplayTLFCount)
    63  	}
    64  	// There's no way to give invites to a user via API, so the
    65  	// only case we can test automatically is the user being
    66  	// out of invites.
    67  	if !idUI.DisplayTLFArg.Throttled {
    68  		t.Errorf("DisplayTLFArg.Throttled not set, expected it to be since user has no invites.")
    69  	}
    70  	if !idUI.DisplayTLFArg.IsPrivate {
    71  		t.Errorf("DisplayTLFArg.IsPrivate not set on a private folder")
    72  	}
    73  
    74  	idUI = &FakeIdentifyUI{}
    75  	// Test adding a favorite when not the creator.  Should not call ui for
    76  	// displaying tlf + invite.
    77  	// created flag == false
    78  	addfav(fmt.Sprintf("bobdog@twitter,%s", u.Username), keybase1.FolderType_PRIVATE, false, idUI, tc, expectedFaves)
    79  	if newFaves := listfav(tc); !newFaves.Equal(*expectedFaves) {
    80  		t.Errorf("bad favorites: %s != %s", newFaves, expectedFaves)
    81  	}
    82  	if idUI.DisplayTLFCount != 0 {
    83  		t.Errorf("DisplayTLFCount: %d, expected 0", idUI.DisplayTLFCount)
    84  	}
    85  
    86  	idUI = &FakeIdentifyUI{}
    87  	// Make sure ui for displaying tlf + invite not called for non-social
    88  	// assertion TLF.
    89  	addfav(fmt.Sprintf("%s,t_alice", u.Username), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
    90  	if newFaves := listfav(tc); !newFaves.Equal(*expectedFaves) {
    91  		t.Errorf("bad favorites: %s != %s", newFaves, expectedFaves)
    92  	}
    93  	if idUI.DisplayTLFCount != 0 {
    94  		t.Errorf("DisplayTLFCount: %d, expected 0", idUI.DisplayTLFCount)
    95  	}
    96  
    97  	idUI = &FakeIdentifyUI{}
    98  	// Test adding a public favorite with SBS social assertion
    99  	addfav(fmt.Sprintf("bobdog@twitter,%s", u.Username), keybase1.FolderType_PUBLIC, true, idUI, tc, expectedFaves)
   100  	if newFaves := listfav(tc); !newFaves.Equal(*expectedFaves) {
   101  		t.Errorf("bad favorites: %s != %s", newFaves, expectedFaves)
   102  	}
   103  	if idUI.DisplayTLFCount != 1 {
   104  		t.Errorf("DisplayTLFCount: %d, expected 1", idUI.DisplayTLFCount)
   105  	}
   106  	if idUI.DisplayTLFArg.IsPrivate {
   107  		t.Errorf("DisplayTLFArg.IsPrivate set on a public folder")
   108  	}
   109  }
   110  
   111  func TestFavoriteIgnore(t *testing.T) {
   112  	tc := SetupEngineTest(t, "template")
   113  	defer tc.Cleanup()
   114  	u := CreateAndSignupFakeUser(tc, "fav")
   115  
   116  	expectedFaves := newFavorites(u.Username)
   117  
   118  	idUI := &FakeIdentifyUI{}
   119  	addfav(makeFave(u.Username, "t_bob"), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
   120  	addfav(makeFave(u.Username, "t_charlie"), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
   121  	if !listfav(tc).Equal(*expectedFaves) {
   122  		t.Errorf("bad favorites")
   123  	}
   124  	rmfav(makeFave(u.Username, "t_bob"), keybase1.FolderType_PRIVATE, tc, expectedFaves)
   125  	if !listfav(tc).Equal(*expectedFaves) {
   126  		t.Errorf("bad favorites")
   127  	}
   128  }
   129  
   130  func TestFavoriteList(t *testing.T) {
   131  	tc := SetupEngineTest(t, "template")
   132  	defer tc.Cleanup()
   133  	u := CreateAndSignupFakeUser(tc, "fav")
   134  	expectedFaves := newFavorites(u.Username)
   135  
   136  	idUI := &FakeIdentifyUI{}
   137  	addfav(makeFave(u.Username, "t_charlie"), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
   138  	addfav(makeFave(u.Username, "t_bob"), keybase1.FolderType_PRIVATE, true, idUI, tc, expectedFaves)
   139  
   140  	eng := NewFavoriteList(tc.G)
   141  	m := NewMetaContextForTest(tc)
   142  	if err := RunEngine2(m, eng); err != nil {
   143  		t.Fatal(err)
   144  	}
   145  	favs := eng.Result().FavoriteFolders
   146  	if !newFavoritesFromServer(favs).Equal(*expectedFaves) {
   147  		t.Errorf("bad favorites")
   148  	}
   149  }
   150  
   151  func addfav(name string, folderType keybase1.FolderType, created bool, idUI libkb.IdentifyUI, tc libkb.TestContext, expectedFaves *favorites) {
   152  	uis := libkb.UIs{
   153  		IdentifyUI: idUI,
   154  	}
   155  	arg := keybase1.FavoriteAddArg{
   156  		Folder: keybase1.FolderHandle{Name: name, FolderType: folderType, Created: created},
   157  	}
   158  	eng := NewFavoriteAdd(tc.G, &arg)
   159  	m := NewMetaContextForTest(tc).WithUIs(uis)
   160  	err := RunEngine2(m, eng)
   161  	if err != nil {
   162  		tc.T.Fatal(err)
   163  	}
   164  	eng.Wait()
   165  	if expectedFaves != nil {
   166  		expectedFaves.Push(keybase1.Folder{Name: name, FolderType: folderType})
   167  	}
   168  }
   169  
   170  func rmfav(name string, folderType keybase1.FolderType, tc libkb.TestContext, expectedFaves *favorites) {
   171  	arg := keybase1.FavoriteIgnoreArg{
   172  		Folder: keybase1.FolderHandle{Name: name, FolderType: folderType},
   173  	}
   174  	eng := NewFavoriteIgnore(tc.G, &arg)
   175  	m := libkb.NewMetaContextForTest(tc)
   176  	err := RunEngine2(m, eng)
   177  	if err != nil {
   178  		tc.T.Fatal(err)
   179  	}
   180  	if expectedFaves != nil {
   181  		expectedFaves.Remove(keybase1.Folder{Name: name, FolderType: folderType})
   182  	}
   183  }
   184  
   185  func listfav(tc libkb.TestContext) *favorites {
   186  	eng := NewFavoriteList(tc.G)
   187  	m := libkb.NewMetaContextForTest(tc)
   188  	err := RunEngine2(m, eng)
   189  	if err != nil {
   190  		tc.T.Fatal(err)
   191  	}
   192  	return newFavoritesFromServer(eng.Result().FavoriteFolders)
   193  }
   194  
   195  type favorites struct {
   196  	m map[string]bool
   197  }
   198  
   199  func newFavorites(un string) *favorites {
   200  	ret := &favorites{
   201  		m: make(map[string]bool),
   202  	}
   203  	for _, f := range defaultFaves(un) {
   204  		ret.Push(f)
   205  	}
   206  	return ret
   207  }
   208  
   209  func newFavoritesFromServer(v []keybase1.Folder) *favorites {
   210  	ret := &favorites{
   211  		m: make(map[string]bool),
   212  	}
   213  	for _, f := range v {
   214  		ret.Push(f)
   215  	}
   216  	return ret
   217  }
   218  
   219  func (v *favorites) Push(f keybase1.Folder) {
   220  	k := makeKey(f)
   221  	if !v.m[k] {
   222  		v.m[k] = true
   223  	}
   224  }
   225  
   226  func (v *favorites) Remove(f keybase1.Folder) {
   227  	delete(v.m, makeKey(f))
   228  }
   229  
   230  func (v favorites) Equal(b favorites) bool {
   231  	for k := range v.m {
   232  		if !b.m[k] {
   233  			return false
   234  		}
   235  	}
   236  	for k := range b.m {
   237  		if !v.m[k] {
   238  			return false
   239  		}
   240  	}
   241  	return true
   242  }
   243  
   244  func makeKey(f keybase1.Folder) string {
   245  	return fmt.Sprintf("%s:%v", f.Name, f.FolderType)
   246  }
   247  
   248  func defaultFaves(un string) []keybase1.Folder {
   249  	return []keybase1.Folder{
   250  		{Name: un, FolderType: keybase1.FolderType_PRIVATE},
   251  		{Name: un, FolderType: keybase1.FolderType_PUBLIC},
   252  	}
   253  }
   254  
   255  func (v *favorites) String() string {
   256  	var s []string
   257  	for f := range v.m {
   258  		s = append(s, f)
   259  	}
   260  	sort.Strings(s)
   261  	return strings.Join(s, ";")
   262  }