github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/kbfsedits/user_history_test.go (about) 1 // Copyright 2018 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package kbfsedits 6 7 import ( 8 "strconv" 9 "testing" 10 "time" 11 12 "github.com/keybase/client/go/kbfs/tlf" 13 "github.com/keybase/client/go/libkb" 14 "github.com/keybase/client/go/logger" 15 "github.com/keybase/client/go/protocol/keybase1" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestUserHistorySimple(t *testing.T) { 20 aliceName, bobName := "alice", "bob" 21 aliceUID, bobUID := keybase1.MakeTestUID(1), keybase1.MakeTestUID(2) 22 23 privSharedTlfID, err := tlf.MakeRandomID(tlf.Private) 24 require.NoError(t, err) 25 privSharedNN := nextNotification{1, 0, privSharedTlfID, nil} 26 privSharedTH := NewTlfHistory() 27 privSharedName := tlf.CanonicalName("alice,bob") 28 29 privHomeTlfID, err := tlf.MakeRandomID(tlf.Private) 30 require.NoError(t, err) 31 privHomeNN := nextNotification{1, 0, privHomeTlfID, nil} 32 privHomeTH := NewTlfHistory() 33 privHomeName := tlf.CanonicalName("alice") 34 35 publicTlfID, err := tlf.MakeRandomID(tlf.Public) 36 require.NoError(t, err) 37 publicNN := nextNotification{1, 0, publicTlfID, nil} 38 publicTH := NewTlfHistory() 39 publicName := tlf.CanonicalName("alice") 40 41 now := time.Now() 42 // Alice writes to private shared TLF. 43 var privSharedAlice []string 44 for i := 0; i < 3; i++ { 45 now = now.Add(1 * time.Minute) 46 _ = privSharedNN.make( 47 strconv.Itoa(i), NotificationCreate, aliceUID, nil, now) 48 privSharedAlice = append(privSharedAlice, privSharedNN.encode(t)) 49 } 50 privSharedTimeAlice := keybase1.ToTime(now) 51 // Alice deletes something from private shared TLF (it shouldn't 52 // affect the overall server time for the TLF). 53 now = now.Add(1 * time.Minute) 54 _ = privSharedNN.make("a", NotificationDelete, aliceUID, nil, now) 55 privSharedAlice = append(privSharedAlice, privSharedNN.encode(t)) 56 57 // Alice writes to public TLF. 58 var publicAlice []string 59 for i := 0; i < 3; i++ { 60 now = now.Add(1 * time.Minute) 61 _ = publicNN.make( 62 strconv.Itoa(i), NotificationCreate, aliceUID, nil, now) 63 publicAlice = append(publicAlice, publicNN.encode(t)) 64 } 65 publicTime := keybase1.ToTime(now) 66 67 // Bob writes to private shared TLF. 68 var privSharedBob []string 69 for i := 3; i < 6; i++ { 70 now = now.Add(1 * time.Minute) 71 _ = privSharedNN.make( 72 strconv.Itoa(i), NotificationCreate, bobUID, nil, now) 73 privSharedBob = append(privSharedBob, privSharedNN.encode(t)) 74 } 75 privSharedTimeBob := keybase1.ToTime(now) 76 77 // Alice writes to private home TLF. 78 var privHomeAlice []string 79 for i := 0; i < 3; i++ { 80 now = now.Add(1 * time.Minute) 81 _ = privHomeNN.make( 82 strconv.Itoa(i), NotificationCreate, aliceUID, nil, now) 83 privHomeAlice = append(privHomeAlice, privHomeNN.encode(t)) 84 } 85 privHomeTime := keybase1.ToTime(now) 86 87 _, err = privSharedTH.AddNotifications(bobName, privSharedBob) 88 require.NoError(t, err) 89 _, err = privSharedTH.AddNotifications(aliceName, privSharedAlice) 90 require.NoError(t, err) 91 92 _, err = privHomeTH.AddNotifications(aliceName, privHomeAlice) 93 require.NoError(t, err) 94 95 _, err = publicTH.AddNotifications(aliceName, publicAlice) 96 require.NoError(t, err) 97 98 log := logger.New("UH") 99 uh := NewUserHistory(log, libkb.NewVDebugLog(log)) 100 uh.UpdateHistory(privSharedName, tlf.Private, privSharedTH, aliceName) 101 uh.UpdateHistory(privHomeName, tlf.Private, privHomeTH, aliceName) 102 uh.UpdateHistory(publicName, tlf.Public, publicTH, aliceName) 103 104 type expectInfo struct { 105 tlfName string 106 tlfType keybase1.FolderType 107 serverTime keybase1.Time 108 writer string 109 num int 110 numDeletes int 111 } 112 expected := []expectInfo{ 113 // private home alice 114 { 115 string(privHomeName), keybase1.FolderType_PRIVATE, 116 privHomeTime, aliceName, 3, 0, 117 }, 118 // private shared bob 119 { 120 string(privSharedName), keybase1.FolderType_PRIVATE, 121 privSharedTimeBob, bobName, 3, 0, 122 }, 123 // public alice 124 { 125 string(publicName), keybase1.FolderType_PUBLIC, 126 publicTime, aliceName, 3, 0, 127 }, 128 // private shared alice 129 { 130 string(privSharedName), keybase1.FolderType_PRIVATE, 131 privSharedTimeAlice, aliceName, 3, 1, 132 }, 133 } 134 135 check := func(expected []expectInfo) { 136 history := uh.Get(aliceName) 137 require.Len(t, history, len(expected)) 138 for i, wh := range history { 139 require.Len(t, wh.History, 1) 140 require.Equal(t, expected[i].tlfName, wh.Folder.Name) 141 require.Equal(t, expected[i].tlfType, wh.Folder.FolderType) 142 require.Equal(t, expected[i].serverTime, wh.ServerTime) 143 require.Equal(t, expected[i].writer, wh.History[0].WriterName) 144 require.Len(t, wh.History[0].Edits, expected[i].num) 145 require.Len(t, wh.History[0].Deletes, expected[i].numDeletes) 146 } 147 } 148 check(expected) 149 150 // Alice writes one more thing to the private shared folder. 151 now = now.Add(1 * time.Minute) 152 _ = privSharedNN.make("7", NotificationCreate, aliceUID, nil, now) 153 _, err = privSharedTH.AddNotifications( 154 aliceName, []string{privSharedNN.encode(t)}) 155 require.NoError(t, err) 156 uh.UpdateHistory(privSharedName, tlf.Private, privSharedTH, aliceName) 157 expected[3].serverTime = keybase1.ToTime(now) 158 expected[3].num++ 159 expected = append([]expectInfo{expected[3]}, expected[0:3]...) 160 check(expected) 161 }