github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/engine/login_load_user_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 "reflect" 8 "testing" 9 10 "github.com/keybase/client/go/libkb" 11 keybase1 "github.com/keybase/client/go/protocol/keybase1" 12 "github.com/stretchr/testify/require" 13 ) 14 15 type luTest struct { 16 name string 17 input string 18 err error 19 uid keybase1.UID 20 } 21 22 var lutests = []luTest{ 23 {name: "alice", input: "t_alice", uid: "295a7eea607af32040647123732bc819"}, 24 {name: "bob", input: "t_bob", uid: "afb5eda3154bc13c1df0189ce93ba119"}, 25 {name: "unknown user", input: "not_a_user", err: libkb.NotFoundError{}}, 26 {name: "invalid input", input: "spaces aren't allowed", err: libkb.BadUsernameError{}}, 27 {name: "bob@example.com", input: "email isn't allowed", err: libkb.BadUsernameError{}}, 28 {name: "bob=", input: "other not allowed chars", err: libkb.BadUsernameError{}}, 29 } 30 31 func TestLoginLoadUser(t *testing.T) { 32 tc := SetupEngineTest(t, "lu") 33 defer tc.Cleanup() 34 35 for _, test := range lutests { 36 uis := libkb.UIs{ 37 LoginUI: &libkb.TestLoginUI{}, 38 SecretUI: &libkb.TestSecretUI{}, 39 } 40 m := NewMetaContextForTest(tc).WithUIs(uis) 41 eng := newLoginLoadUser(tc.G, test.input) 42 if err := RunEngine2(m, eng); err != nil { 43 if test.err == nil { 44 t.Errorf("%s: run error %s", test.name, err) 45 continue 46 } else if reflect.TypeOf(test.err) != reflect.TypeOf(err) { 47 t.Errorf("%s: error type %T, expected %T", test.name, err, test.err) 48 continue 49 } else { 50 // error types matched 51 continue 52 } 53 } 54 55 if test.uid == "" { 56 continue 57 } 58 59 if eng.User() == nil { 60 t.Errorf("%s: %q generated nil user", test.name, test.input) 61 continue 62 } 63 64 if eng.User().GetUID() != test.uid { 65 t.Errorf("%s: uid %q, expected %q", test.name, eng.User().GetUID(), test.uid) 66 } 67 } 68 } 69 70 func TestLoginLoadUserPrompt(t *testing.T) { 71 tc := SetupEngineTest(t, "lu") 72 defer tc.Cleanup() 73 74 lutestsPrompt := make([]luTest, len(lutests)+1) 75 copy(lutestsPrompt, lutests) 76 lutestsPrompt[len(lutestsPrompt)-1] = luTest{name: "empty prompt input", input: "", err: libkb.NoUsernameError{}} 77 78 for _, test := range lutestsPrompt { 79 uis := libkb.UIs{ 80 LoginUI: &libkb.TestLoginUI{ 81 Username: test.input, 82 }, 83 SecretUI: &libkb.TestSecretUI{}, 84 } 85 eng := newLoginLoadUser(tc.G, "") 86 m := NewMetaContextForTest(tc).WithUIs(uis) 87 if err := RunEngine2(m, eng); err != nil { 88 if test.err == nil { 89 t.Errorf("%s: run error %s", test.name, err) 90 continue 91 } else if reflect.TypeOf(test.err) != reflect.TypeOf(err) { 92 t.Errorf("%s: error type %T, expected %T", test.name, err, test.err) 93 continue 94 } else { 95 // error types matched 96 continue 97 } 98 } 99 100 if test.uid == "" { 101 continue 102 } 103 104 if eng.User() == nil { 105 t.Errorf("%s: %q generated nil user", test.name, test.input) 106 } 107 108 if eng.User().GetUID() != test.uid { 109 t.Errorf("%s: uid %q, expected %q", test.name, eng.User().GetUID(), test.uid) 110 } 111 } 112 } 113 114 // test user canceling GetEmailOrUsername prompt: 115 func TestLoginLoadUserPromptCancel(t *testing.T) { 116 tc := SetupEngineTest(t, "lu") 117 defer tc.Cleanup() 118 uis := libkb.UIs{ 119 LoginUI: &libkb.TestLoginCancelUI{}, 120 SecretUI: &libkb.TestSecretUI{}, 121 } 122 eng := newLoginLoadUser(tc.G, "") 123 m := NewMetaContextForTest(tc).WithUIs(uis) 124 err := RunEngine2(m, eng) 125 if err == nil { 126 t.Fatal("expected an error") 127 } 128 if _, ok := err.(libkb.InputCanceledError); !ok { 129 t.Errorf("error: %s (%T), expected InputCanceledError", err, err) 130 } 131 } 132 133 func TestLoginLoadUserEmail(t *testing.T) { 134 tcX := SetupEngineTest(t, "other") 135 fu := CreateAndSignupFakeUser(tcX, "login") 136 Logout(tcX) 137 tcX.Cleanup() 138 139 checkEmailResult := func(user *libkb.User, err error) { 140 require.Error(t, err) 141 require.IsType(t, libkb.BadUsernameError{}, err) 142 require.Contains(t, err.Error(), "not supported") 143 require.Nil(t, user) 144 } 145 146 // own email address 147 user, err := testLoginLoadUserEmail(t, fu, fu.Email) 148 checkEmailResult(user, err) 149 150 // prompt for email address 151 user, err = testLoginLoadUserEmail(t, fu, "") 152 checkEmailResult(user, err) 153 154 // someone else's email address 155 user, err = testLoginLoadUserEmail(t, fu, "test+t_bob@test.keybase.io") 156 checkEmailResult(user, err) 157 158 // nobody's email address 159 user, err = testLoginLoadUserEmail(t, fu, "XXXYYYXXX@test.keybase.io") 160 checkEmailResult(user, err) 161 } 162 163 func testLoginLoadUserEmail(t *testing.T, fu *FakeUser, input string) (*libkb.User, error) { 164 tc := SetupEngineTest(t, "lu") 165 defer tc.Cleanup() 166 167 uis := libkb.UIs{ 168 LoginUI: &libkb.TestLoginUI{ 169 Username: fu.Email, 170 }, 171 SecretUI: fu.NewSecretUI(), 172 } 173 eng := newLoginLoadUser(tc.G, input) 174 m := NewMetaContextForTest(tc).WithUIs(uis).WithNewProvisionalLoginContext() 175 if err := RunEngine2(m, eng); err != nil { 176 return nil, err 177 } 178 return eng.User(), nil 179 }