github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/contacts/mocks.go (about) 1 //go:build !production 2 // +build !production 3 4 package contacts 5 6 import ( 7 "errors" 8 "time" 9 10 "github.com/stretchr/testify/require" 11 12 "github.com/keybase/client/go/libkb" 13 "github.com/keybase/client/go/protocol/keybase1" 14 ) 15 16 // Contacts package things that are useful for testing within contacts package 17 // but also in other packages if necessary (mostly service/contacts_test.go). 18 19 type MockLookupUser struct { 20 UID keybase1.UID 21 Username string 22 Fullname string 23 ServiceMap libkb.UserServiceSummary 24 } 25 26 func MakeMockLookupUser(username, fullname string) MockLookupUser { 27 return MockLookupUser{ 28 Username: username, 29 UID: libkb.UsernameToUID(username), 30 Fullname: fullname, 31 } 32 } 33 34 type MockContactsProvider struct { 35 T libkb.TestingTB 36 PhoneNumbers map[keybase1.RawPhoneNumber]MockLookupUser 37 PhoneNumberErrors map[keybase1.RawPhoneNumber]string 38 Emails map[keybase1.EmailAddress]MockLookupUser 39 Following map[keybase1.UID]bool 40 } 41 42 func MakeMockProvider(t libkb.TestingTB) *MockContactsProvider { 43 return &MockContactsProvider{ 44 T: t, 45 PhoneNumbers: make(map[keybase1.RawPhoneNumber]MockLookupUser), 46 PhoneNumberErrors: make(map[keybase1.RawPhoneNumber]string), 47 Emails: make(map[keybase1.EmailAddress]MockLookupUser), 48 Following: make(map[keybase1.UID]bool), 49 } 50 } 51 52 func (c *MockContactsProvider) LookupAllWithToken(mctx libkb.MetaContext, emails []keybase1.EmailAddress, 53 numbers []keybase1.RawPhoneNumber, _ Token) (ContactLookupResults, error) { 54 return c.LookupAll(mctx, emails, numbers) 55 } 56 57 func (c *MockContactsProvider) LookupAll(mctx libkb.MetaContext, emails []keybase1.EmailAddress, 58 numbers []keybase1.RawPhoneNumber) (ContactLookupResults, error) { 59 60 ret := NewContactLookupResults() 61 for _, email := range emails { 62 if user, found := c.Emails[email]; found { 63 ret.Results[MakeEmailLookupKey(email)] = ContactLookupResult{UID: user.UID} 64 } 65 } 66 for _, number := range numbers { 67 if user, found := c.PhoneNumbers[number]; found { 68 ret.Results[MakePhoneLookupKey(number)] = ContactLookupResult{UID: user.UID} 69 } 70 if errStr, found := c.PhoneNumberErrors[number]; found { 71 ret.Results[MakePhoneLookupKey(number)] = ContactLookupResult{Error: errStr} 72 } 73 } 74 ret.ResolvedFreshness = 10 * 24 * time.Hour // approx 10 days 75 ret.UnresolvedFreshness = 1 * 24 * time.Hour // approx one day 76 return ret, nil 77 } 78 79 func (c *MockContactsProvider) FindUsernames(mctx libkb.MetaContext, uids []keybase1.UID) (map[keybase1.UID]ContactUsernameAndFullName, error) { 80 res := make(map[keybase1.UID]ContactUsernameAndFullName) 81 uidSet := make(map[keybase1.UID]struct{}, len(uids)) 82 for _, v := range uids { 83 uidSet[v] = struct{}{} 84 } 85 86 for _, v := range c.PhoneNumbers { 87 if _, found := uidSet[v.UID]; found { 88 res[v.UID] = ContactUsernameAndFullName{ 89 Username: v.Username, 90 Fullname: v.Fullname, 91 } 92 } 93 } 94 for _, v := range c.Emails { 95 if _, found := uidSet[v.UID]; found { 96 res[v.UID] = ContactUsernameAndFullName{ 97 Username: v.Username, 98 Fullname: v.Fullname, 99 } 100 } 101 } 102 return res, nil 103 } 104 105 func (c *MockContactsProvider) FindFollowing(mctx libkb.MetaContext, uids []keybase1.UID) (map[keybase1.UID]bool, error) { 106 res := make(map[keybase1.UID]bool) 107 for _, uid := range uids { 108 res[uid] = c.Following[uid] 109 } 110 return res, nil 111 } 112 113 func (c *MockContactsProvider) FindServiceMaps(mctx libkb.MetaContext, uids []keybase1.UID) (res map[keybase1.UID]libkb.UserServiceSummary, err error) { 114 res = make(map[keybase1.UID]libkb.UserServiceSummary) 115 uidSet := make(map[keybase1.UID]struct{}, len(uids)) 116 for _, v := range uids { 117 uidSet[v] = struct{}{} 118 } 119 120 for _, v := range c.PhoneNumbers { 121 if _, found := uidSet[v.UID]; found && v.ServiceMap != nil { 122 res[v.UID] = v.ServiceMap 123 } 124 } 125 for _, v := range c.Emails { 126 if _, found := uidSet[v.UID]; found && v.ServiceMap != nil { 127 res[v.UID] = v.ServiceMap 128 } 129 } 130 return res, nil 131 } 132 133 type ErrorContactsProvider struct { 134 NoFail bool 135 T libkb.TestingTB 136 } 137 138 func (c *ErrorContactsProvider) LookupAllWithToken(mctx libkb.MetaContext, emails []keybase1.EmailAddress, 139 numbers []keybase1.RawPhoneNumber, _ Token) (ret ContactLookupResults, err error) { 140 141 if !c.NoFail { 142 require.Fail(c.T, "Call to ErrorContactsProvider.LookupAllWithToken") 143 } 144 return ret, errors.New("error contacts provider") 145 } 146 147 func (c *ErrorContactsProvider) LookupAll(mctx libkb.MetaContext, emails []keybase1.EmailAddress, 148 numbers []keybase1.RawPhoneNumber) (ret ContactLookupResults, err error) { 149 if !c.NoFail { 150 require.Fail(c.T, "Call to ErrorContactsProvider.LookupAll") 151 } 152 return ret, errors.New("error contacts provider") 153 } 154 155 func (c *ErrorContactsProvider) FindUsernames(mctx libkb.MetaContext, uids []keybase1.UID) (map[keybase1.UID]ContactUsernameAndFullName, error) { 156 if !c.NoFail { 157 require.Fail(c.T, "Call to ErrorContactsProvider.FindUsernames") 158 } 159 return nil, errors.New("mock error") 160 } 161 162 func (c *ErrorContactsProvider) FindFollowing(mctx libkb.MetaContext, uids []keybase1.UID) (map[keybase1.UID]bool, error) { 163 if !c.NoFail { 164 require.Fail(c.T, "Call to ErrorContactsProvider.FindFollowing") 165 } 166 return nil, errors.New("mock error") 167 } 168 169 func (c *ErrorContactsProvider) FindServiceMaps(mctx libkb.MetaContext, uids []keybase1.UID) (map[keybase1.UID]libkb.UserServiceSummary, error) { 170 if !c.NoFail { 171 require.Fail(c.T, "Call to ErrorContactsProvider.FindServiceMaps") 172 } 173 return nil, errors.New("mock error") 174 } 175 176 func MakePhoneComponent(label string, phone string) keybase1.ContactComponent { 177 num := keybase1.RawPhoneNumber(phone) 178 return keybase1.ContactComponent{ 179 Label: label, 180 PhoneNumber: &num, 181 } 182 } 183 184 func MakeEmailComponent(label string, email string) keybase1.ContactComponent { 185 em := keybase1.EmailAddress(email) 186 return keybase1.ContactComponent{ 187 Label: label, 188 Email: &em, 189 } 190 } 191 192 func MakeContact(name string, args ...keybase1.ContactComponent) keybase1.Contact { 193 return keybase1.Contact{ 194 Name: name, 195 Components: args, 196 } 197 }