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  }