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

     1  package teams
     2  
     3  import (
     4  	"encoding/hex"
     5  	"testing"
     6  	"time"
     7  
     8  	"golang.org/x/net/context"
     9  
    10  	"github.com/keybase/client/go/kbtest"
    11  	"github.com/keybase/client/go/libkb"
    12  	"github.com/keybase/client/go/protocol/keybase1"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestTeamGet(t *testing.T) {
    17  	tc := SetupTest(t, "team", 1)
    18  	defer tc.Cleanup()
    19  
    20  	_, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
    21  	require.NoError(t, err)
    22  
    23  	name := createTeam(tc)
    24  
    25  	_, err = GetForTestByStringName(context.TODO(), tc.G, name)
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  }
    30  
    31  func TestTeamApplicationKey(t *testing.T) {
    32  	tc := SetupTest(t, "team", 1)
    33  	defer tc.Cleanup()
    34  
    35  	_, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
    36  	require.NoError(t, err)
    37  
    38  	name := createTeam(tc)
    39  
    40  	team, err := Load(context.TODO(), tc.G, keybase1.LoadTeamArg{
    41  		Name: name,
    42  	})
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  
    47  	chatKey, err := team.ChatKey(context.TODO())
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	if chatKey.Application != keybase1.TeamApplication_CHAT {
    52  		t.Errorf("key application: %d, expected %d", chatKey.Application, keybase1.TeamApplication_CHAT)
    53  	}
    54  	if chatKey.Generation() != 1 {
    55  		t.Errorf("key generation: %d, expected 1", chatKey.Generation())
    56  	}
    57  	if len(chatKey.Key) != 32 {
    58  		t.Errorf("key length: %d, expected 32", len(chatKey.Key))
    59  	}
    60  }
    61  
    62  func TestTeamGetRepeat(t *testing.T) {
    63  	t.Skip("not needed")
    64  	// in order to try to repro in CI, run this 10 times
    65  	for i := 0; i < 10; i++ {
    66  		tc := SetupTest(t, "team", 1)
    67  		defer tc.Cleanup()
    68  
    69  		_, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
    70  		require.NoError(t, err)
    71  
    72  		name := createTeam(tc)
    73  
    74  		_, err = GetForTestByStringName(context.TODO(), tc.G, name)
    75  		if err != nil {
    76  			t.Fatal(err)
    77  		}
    78  	}
    79  }
    80  
    81  func TestTeamGetWhileCreate(t *testing.T) {
    82  	t.Skip("this found create team bug")
    83  	tc := SetupTest(t, "team", 1)
    84  	defer tc.Cleanup()
    85  
    86  	_, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
    87  	require.NoError(t, err)
    88  
    89  	name := createTeam(tc)
    90  
    91  	for i := 0; i < 100; i++ {
    92  		go createTeam(tc)
    93  		time.Sleep(10 * time.Millisecond)
    94  	}
    95  
    96  	for i := 0; i < 100; i++ {
    97  		_, err := GetForTestByStringName(context.TODO(), tc.G, name)
    98  		if err != nil {
    99  			t.Fatal(err)
   100  		}
   101  	}
   102  }
   103  
   104  func TestTeamGetConcurrent(t *testing.T) {
   105  	t.Skip("this is slow but it passes")
   106  	work := make(chan bool)
   107  
   108  	for i := 0; i < 10; i++ {
   109  		go func() {
   110  			for x := range work {
   111  				_ = x
   112  				teamGet(t)
   113  			}
   114  		}()
   115  	}
   116  
   117  	for j := 0; j < 100; j++ {
   118  		work <- true
   119  	}
   120  }
   121  
   122  // Test TeamGet on a team that you implicitly admin but
   123  // are not an explicit member of.
   124  func TestTeamDetailsAsImplicitAdmin(t *testing.T) {
   125  	_, tcs, cleanup := setupNTests(t, 1)
   126  	defer cleanup()
   127  
   128  	t.Logf("creates a team")
   129  	teamName, _ := createTeam2(*tcs[0])
   130  
   131  	t.Logf("creates a subteam")
   132  	_, err := CreateSubteam(context.Background(), tcs[0].G, "bbb", teamName, keybase1.TeamRole_NONE /* addSelfAs */)
   133  	require.NoError(t, err)
   134  
   135  	t.Logf("loads the subteam")
   136  	team, err := GetAnnotatedTeamByName(context.Background(), tcs[0].G, teamName.String()+".bbb")
   137  	require.NoError(t, err)
   138  	require.Len(t, team.Members, 0, "should be no team members in subteam")
   139  }
   140  
   141  // Test loading when you have become an admin after
   142  // having already cached the team as a non-admin.
   143  func TestGetMaybeAdminByStringName(t *testing.T) {
   144  	fus, tcs, cleanup := setupNTests(t, 2)
   145  	defer cleanup()
   146  
   147  	t.Logf("U0 creates a team")
   148  	teamName, _ := createTeam2(*tcs[0])
   149  
   150  	t.Logf("U0 creates a subteam")
   151  	_, err := CreateSubteam(context.TODO(), tcs[0].G, "abc", teamName, keybase1.TeamRole_NONE /* addSelfAs */)
   152  	require.NoError(t, err)
   153  
   154  	t.Logf("U0 adds U1 as a reader")
   155  	_, err = AddMember(context.TODO(), tcs[0].G, teamName.String(), fus[1].Username, keybase1.TeamRole_READER, nil)
   156  	require.NoError(t, err)
   157  
   158  	t.Logf("U1 loads and is a reader")
   159  	team, err := Load(context.TODO(), tcs[1].G, keybase1.LoadTeamArg{
   160  		Name: teamName.String(),
   161  	})
   162  	require.NoError(t, err)
   163  	role, err := team.MemberRole(context.TODO(), fus[1].GetUserVersion())
   164  	require.NoError(t, err)
   165  	require.Equal(t, keybase1.TeamRole_READER, role, "still a reader")
   166  	require.Equal(t, 0, len(team.chain().inner.SubteamLog), "doesn't know about any subteams")
   167  
   168  	t.Logf("U0 makes U1 an admin")
   169  	err = SetRoleAdmin(context.TODO(), tcs[0].G, teamName.String(), fus[1].Username)
   170  	require.NoError(t, err)
   171  
   172  	t.Logf("U1 loads from the cache, and doesn't realize they're an admin")
   173  	team, err = Load(context.TODO(), tcs[1].G, keybase1.LoadTeamArg{
   174  		Name: teamName.String(),
   175  	})
   176  	require.NoError(t, err)
   177  	role, err = team.MemberRole(context.TODO(), fus[1].GetUserVersion())
   178  	require.NoError(t, err)
   179  	require.Equal(t, keybase1.TeamRole_READER, role, "cached as a reader")
   180  	require.Equal(t, 0, len(team.chain().inner.SubteamLog), "still doesn't know about any subteams")
   181  
   182  	t.Logf("U1 loads and realizes they're an admin")
   183  	team, err = GetMaybeAdminByStringName(context.TODO(), tcs[1].G, teamName.String(), false /*isPublic*/)
   184  	require.NoError(t, err)
   185  	role, err = team.MemberRole(context.TODO(), fus[1].GetUserVersion())
   186  	require.NoError(t, err)
   187  	require.Equal(t, keybase1.TeamRole_ADMIN, role, "still an admin")
   188  	require.Equal(t, 1, len(team.chain().inner.SubteamLog), "has loaded previously-stubbed admin links")
   189  }
   190  
   191  func TestGetTeamIDByName(t *testing.T) {
   192  	fus, tcs, cleanup := setupNTests(t, 2)
   193  	defer cleanup()
   194  
   195  	teamName, teamID := createTeam2(*tcs[0])
   196  	subteamName, subteamID := createSubteam(tcs[0], teamName, "hello")
   197  
   198  	// Test as owner of team and subteam
   199  	mctx := libkb.NewMetaContextForTest(*tcs[0])
   200  	res, err := GetTeamIDByNameRPC(mctx, teamName.String())
   201  	require.NoError(t, err)
   202  	require.Equal(t, teamID, res)
   203  
   204  	res, err = GetTeamIDByNameRPC(mctx, subteamName.String())
   205  	require.NoError(t, err)
   206  	require.Equal(t, subteamID, res)
   207  
   208  	// Test as unrelated user
   209  	mctx = libkb.NewMetaContextForTest(*tcs[1])
   210  	_, err = GetTeamIDByNameRPC(mctx, teamName.String())
   211  	require.Error(t, err)
   212  
   213  	_, err = GetTeamIDByNameRPC(mctx, subteamName.String())
   214  	require.Error(t, err)
   215  
   216  	// Add user 1 as a reader to root team
   217  	_, err = AddMember(context.Background(), tcs[0].G, teamName.String(), fus[1].Username, keybase1.TeamRole_READER, nil)
   218  	require.NoError(t, err)
   219  
   220  	res, err = GetTeamIDByNameRPC(mctx, teamName.String())
   221  	require.NoError(t, err)
   222  	require.Equal(t, teamID, res)
   223  
   224  	// Try to get subteam id, should still fail.
   225  	_, err = GetTeamIDByNameRPC(mctx, subteamName.String())
   226  	require.Error(t, err)
   227  }
   228  
   229  func teamGet(t *testing.T) {
   230  	tc := SetupTest(t, "team", 1)
   231  	defer tc.Cleanup()
   232  
   233  	_, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
   234  	require.NoError(t, err)
   235  
   236  	name := createTeam(tc)
   237  
   238  	_, err = GetForTestByStringName(context.TODO(), tc.G, name)
   239  	if err != nil {
   240  		t.Fatal(err)
   241  	}
   242  }
   243  
   244  func createTeam(tc libkb.TestContext) string {
   245  	b, err := libkb.RandBytes(4)
   246  	require.NoError(tc.T, err)
   247  
   248  	name := hex.EncodeToString(b)
   249  	_, err = CreateRootTeam(context.TODO(), tc.G, name, keybase1.TeamSettings{})
   250  	require.NoError(tc.T, err)
   251  
   252  	return name
   253  }
   254  
   255  func createTeam2(tc libkb.TestContext) (keybase1.TeamName, keybase1.TeamID) {
   256  	teamNameS := createTeam(tc)
   257  	teamName, err := keybase1.TeamNameFromString(teamNameS)
   258  	require.NoError(tc.T, err)
   259  	id := teamName.ToPrivateTeamID()
   260  	tc.T.Logf("created team %s: %s", id, teamName)
   261  	return teamName, id
   262  }
   263  
   264  func createSubteam(tc *libkb.TestContext, parent keybase1.TeamName, subteamNamePart string) (keybase1.TeamName, keybase1.TeamID) {
   265  	subteamName, err := parent.Append(subteamNamePart)
   266  	require.NoError(tc.T, err)
   267  	subteamID, err := CreateSubteam(context.TODO(), tc.G, subteamNamePart, parent, keybase1.TeamRole_NONE /* addSelfAs */)
   268  	require.NoError(tc.T, err)
   269  	return subteamName, *subteamID
   270  }