1package teams
2
3import (
4	"testing"
5
6	"golang.org/x/net/context"
7
8	"github.com/keybase/client/go/kbtest"
9	"github.com/keybase/client/go/libkb"
10	"github.com/keybase/client/go/protocol/keybase1"
11
12	"github.com/stretchr/testify/require"
13)
14
15func TestShowcaseTeam(t *testing.T) {
16	tc := SetupTest(t, "team", 1)
17	defer tc.Cleanup()
18
19	user, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
20	require.NoError(t, err)
21
22	notifications := kbtest.NewTeamNotifyListener()
23	tc.G.SetService()
24	tc.G.NotifyRouter.AddListener(notifications)
25
26	namex, teamID := createTeam2(tc)
27	name := namex.String()
28	t.Logf("Created team %q", name)
29
30	isShowcased := true
31	err = SetTeamShowcase(context.TODO(), tc.G, teamID, &isShowcased, nil, nil)
32	require.NoError(t, err)
33	kbtest.CheckTeamMiscNotifications(tc, notifications)
34
35	showcase, err := GetTeamShowcase(context.TODO(), tc.G, teamID)
36	require.NoError(t, err)
37	require.Equal(t, true, showcase.IsShowcased)
38	require.NotNil(t, showcase.SetByUID)
39	require.Equal(t, user.User.GetUID(), *showcase.SetByUID)
40	require.Nil(t, nil, showcase.Description)
41
42	description := "Hello world"
43	err = SetTeamShowcase(context.TODO(), tc.G, teamID, nil, &description, nil)
44	require.NoError(t, err)
45	kbtest.CheckTeamMiscNotifications(tc, notifications)
46
47	showcase, err = GetTeamShowcase(context.TODO(), tc.G, teamID)
48	require.NoError(t, err)
49	require.Equal(t, true, showcase.IsShowcased)
50	require.NotNil(t, showcase.SetByUID)
51	require.Equal(t, user.User.GetUID(), *showcase.SetByUID)
52	require.NotNil(t, showcase.Description)
53	require.Equal(t, "Hello world", *showcase.Description)
54
55	isShowcased = false
56	err = SetTeamShowcase(context.TODO(), tc.G, teamID, &isShowcased, nil, nil)
57	require.NoError(t, err)
58	kbtest.CheckTeamMiscNotifications(tc, notifications)
59
60	showcase, err = GetTeamShowcase(context.TODO(), tc.G, teamID)
61	require.NoError(t, err)
62
63	require.Equal(t, false, showcase.IsShowcased)
64	require.NotNil(t, showcase.SetByUID)
65	require.Equal(t, user.User.GetUID(), *showcase.SetByUID)
66	require.NotNil(t, showcase.Description)
67	require.Equal(t, "Hello world", *showcase.Description)
68
69	tmShowcase, err := GetTeamAndMemberShowcase(context.TODO(), tc.G, teamID)
70	require.NoError(t, err)
71	require.Equal(t, showcase, tmShowcase.TeamShowcase)
72	require.Equal(t, false, tmShowcase.IsMemberShowcased)
73}
74
75func TestShowcaseMember(t *testing.T) {
76	tc := SetupTest(t, "team", 1)
77	defer tc.Cleanup()
78
79	user, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
80	require.NoError(t, err)
81
82	notifications := kbtest.NewTeamNotifyListener()
83	tc.G.SetService()
84	tc.G.NotifyRouter.AddListener(notifications)
85
86	name, id := createTeam2(tc)
87	t.Logf("Created team %q", name)
88
89	var defaultTeamShowcase = keybase1.TeamShowcase{IsShowcased: false, Description: nil, SetByUID: nil, AnyMemberShowcase: true}
90
91	tmShowcase, err := GetTeamAndMemberShowcase(context.TODO(), tc.G, id)
92	require.NoError(t, err)
93	require.Equal(t, false, tmShowcase.IsMemberShowcased)
94	require.Equal(t, defaultTeamShowcase, tmShowcase.TeamShowcase)
95
96	err = SetTeamMemberShowcase(context.TODO(), tc.G, id, true)
97	require.NoError(t, err)
98
99	tmShowcase, err = GetTeamAndMemberShowcase(context.TODO(), tc.G, id)
100	require.NoError(t, err)
101	require.Equal(t, true, tmShowcase.IsMemberShowcased)
102	require.Equal(t, defaultTeamShowcase, tmShowcase.TeamShowcase)
103
104	isShowcased := true
105	description := "Hello Team!"
106	err = SetTeamShowcase(context.TODO(), tc.G, id, &isShowcased, &description, nil)
107	require.NoError(t, err)
108	kbtest.CheckTeamMiscNotifications(tc, notifications)
109
110	tmShowcase, err = GetTeamAndMemberShowcase(context.TODO(), tc.G, id)
111	require.NoError(t, err)
112	require.Equal(t, true, tmShowcase.IsMemberShowcased)
113
114	showcase := tmShowcase.TeamShowcase
115	require.Equal(t, true, showcase.IsShowcased)
116	require.NotNil(t, showcase.SetByUID)
117	require.Equal(t, user.User.GetUID(), *showcase.SetByUID)
118	require.NotNil(t, showcase.Description)
119	require.Equal(t, "Hello Team!", *showcase.Description)
120}
121
122func TestShowcasePermissions(t *testing.T) {
123	tc := SetupTest(t, "team", 1)
124	defer tc.Cleanup()
125
126	user, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
127	require.NoError(t, err)
128
129	notifications := kbtest.NewTeamNotifyListener()
130	tc.G.SetService()
131	tc.G.NotifyRouter.AddListener(notifications)
132
133	_, err = kbtest.CreateAndSignupFakeUser("team", tc.G)
134	require.NoError(t, err)
135
136	namex, teamID := createTeam2(tc)
137	team := namex.String()
138	t.Logf("Created team %q", team)
139
140	isShowcased := true
141	description := "This team is showcased"
142	anyMemberShowcase := false
143	err = SetTeamShowcase(context.TODO(), tc.G, teamID, &isShowcased, &description, &anyMemberShowcase)
144	require.NoError(t, err)
145	kbtest.CheckTeamMiscNotifications(tc, notifications)
146
147	err = SetTeamMemberShowcase(context.TODO(), tc.G, teamID, true)
148	require.NoError(t, err)
149
150	_, err = AddMember(context.TODO(), tc.G, team, user.Username, keybase1.TeamRole_WRITER, nil)
151	require.NoError(t, err)
152
153	err = tc.Logout()
154	require.NoError(t, err)
155	err = user.Login(tc.G)
156	require.NoError(t, err)
157
158	// Set- functions should check membership and not issue request
159	// when user is not an admin or higher.
160	isShowcased = false
161	err = SetTeamShowcase(context.TODO(), tc.G, teamID, &isShowcased, nil, nil)
162	require.Error(t, err)
163
164	// AppStatusErrors means we bounced off server instead of being
165	// stopped by API helper code.
166	_, ok := err.(libkb.AppStatusError)
167	require.False(t, ok)
168
169	// But we expect to hit server error here: because server checks
170	// anyMemberShowcase, not us.
171	err = SetTeamMemberShowcase(context.TODO(), tc.G, teamID, true)
172	require.Error(t, err)
173	_, ok = err.(libkb.AppStatusError)
174	require.True(t, ok)
175
176	// Get- functions should still work.
177	ret, err := GetTeamAndMemberShowcase(context.TODO(), tc.G, teamID)
178	require.NoError(t, err)
179	require.False(t, ret.IsMemberShowcased) // false by default
180	require.NotNil(t, ret.TeamShowcase.Description)
181	require.Equal(t, description, *ret.TeamShowcase.Description)
182	require.True(t, ret.TeamShowcase.IsShowcased)
183
184	ret2, err := GetTeamShowcase(context.TODO(), tc.G, teamID)
185	require.NoError(t, err)
186	require.Equal(t, ret.TeamShowcase, ret2)
187}
188
189func TestShowcaseAnyMember(t *testing.T) {
190	tc := SetupTest(t, "team", 1)
191	defer tc.Cleanup()
192
193	user, err := kbtest.CreateAndSignupFakeUser("team", tc.G)
194	require.NoError(t, err)
195
196	_, err = kbtest.CreateAndSignupFakeUser("team", tc.G)
197	require.NoError(t, err)
198
199	team, teamID := createTeam2(tc)
200	t.Logf("Created team %q", team)
201
202	_, err = AddMember(context.TODO(), tc.G, team.String(), user.Username, keybase1.TeamRole_READER, nil)
203	require.NoError(t, err)
204
205	err = tc.Logout()
206	require.NoError(t, err)
207	err = user.Login(tc.G)
208	require.NoError(t, err)
209
210	t.Logf("Logged in as %q (reader)", user.Username)
211
212	ret, err := GetTeamAndMemberShowcase(context.TODO(), tc.G, teamID)
213	require.NoError(t, err)
214	require.False(t, ret.IsMemberShowcased) // false by default
215
216	err = SetTeamMemberShowcase(context.TODO(), tc.G, teamID, true)
217	require.NoError(t, err)
218
219	ret, err = GetTeamAndMemberShowcase(context.TODO(), tc.G, teamID)
220	require.NoError(t, err)
221	require.True(t, ret.IsMemberShowcased) // membership is true and we are a reader
222}
223