aboutsummaryrefslogtreecommitdiff
path: root/clientapi/clientapi_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'clientapi/clientapi_test.go')
-rw-r--r--clientapi/clientapi_test.go127
1 files changed, 127 insertions, 0 deletions
diff --git a/clientapi/clientapi_test.go b/clientapi/clientapi_test.go
index 2ff4b650..1b2f1358 100644
--- a/clientapi/clientapi_test.go
+++ b/clientapi/clientapi_test.go
@@ -2151,3 +2151,130 @@ func TestKeyBackup(t *testing.T) {
}
})
}
+
+func TestGetMembership(t *testing.T) {
+ alice := test.NewUser(t)
+ bob := test.NewUser(t)
+
+ testCases := []struct {
+ name string
+ roomID string
+ user *test.User
+ additionalEvents func(t *testing.T, room *test.Room)
+ request func(t *testing.T, room *test.Room, accessToken string) *http.Request
+ wantOK bool
+ wantMemberCount int
+ }{
+
+ {
+ name: "/joined_members - Bob never joined",
+ user: bob,
+ request: func(t *testing.T, room *test.Room, accessToken string) *http.Request {
+ return test.NewRequest(t, "GET", fmt.Sprintf("/_matrix/client/v3/rooms/%s/joined_members", room.ID), test.WithQueryParams(map[string]string{
+ "access_token": accessToken,
+ }))
+ },
+ wantOK: false,
+ },
+ {
+ name: "/joined_members - Alice joined",
+ user: alice,
+ request: func(t *testing.T, room *test.Room, accessToken string) *http.Request {
+ return test.NewRequest(t, "GET", fmt.Sprintf("/_matrix/client/v3/rooms/%s/joined_members", room.ID), test.WithQueryParams(map[string]string{
+ "access_token": accessToken,
+ }))
+ },
+ wantOK: true,
+ wantMemberCount: 1,
+ },
+ {
+ name: "/joined_members - Alice leaves, shouldn't be able to see members ",
+ user: alice,
+ request: func(t *testing.T, room *test.Room, accessToken string) *http.Request {
+ return test.NewRequest(t, "GET", fmt.Sprintf("/_matrix/client/v3/rooms/%s/joined_members", room.ID), test.WithQueryParams(map[string]string{
+ "access_token": accessToken,
+ }))
+ },
+ additionalEvents: func(t *testing.T, room *test.Room) {
+ room.CreateAndInsert(t, alice, spec.MRoomMember, map[string]interface{}{
+ "membership": "leave",
+ }, test.WithStateKey(alice.ID))
+ },
+ wantOK: false,
+ },
+ {
+ name: "/joined_members - Bob joins, Alice sees two members",
+ user: alice,
+ request: func(t *testing.T, room *test.Room, accessToken string) *http.Request {
+ return test.NewRequest(t, "GET", fmt.Sprintf("/_matrix/client/v3/rooms/%s/joined_members", room.ID), test.WithQueryParams(map[string]string{
+ "access_token": accessToken,
+ }))
+ },
+ additionalEvents: func(t *testing.T, room *test.Room) {
+ room.CreateAndInsert(t, bob, spec.MRoomMember, map[string]interface{}{
+ "membership": "join",
+ }, test.WithStateKey(bob.ID))
+ },
+ wantOK: true,
+ wantMemberCount: 2,
+ },
+ }
+
+ test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
+
+ cfg, processCtx, close := testrig.CreateConfig(t, dbType)
+ routers := httputil.NewRouters()
+ cm := sqlutil.NewConnectionManager(processCtx, cfg.Global.DatabaseOptions)
+ caches := caching.NewRistrettoCache(128*1024*1024, time.Hour, caching.DisableMetrics)
+ defer close()
+ natsInstance := jetstream.NATSInstance{}
+ jsctx, _ := natsInstance.Prepare(processCtx, &cfg.Global.JetStream)
+ defer jetstream.DeleteAllStreams(jsctx, &cfg.Global.JetStream)
+
+ // Use an actual roomserver for this
+ rsAPI := roomserver.NewInternalAPI(processCtx, cfg, cm, &natsInstance, caches, caching.DisableMetrics)
+ rsAPI.SetFederationAPI(nil, nil)
+ userAPI := userapi.NewInternalAPI(processCtx, cfg, cm, &natsInstance, rsAPI, nil, caching.DisableMetrics, testIsBlacklistedOrBackingOff)
+
+ // We mostly need the rsAPI for this test, so nil for other APIs/caches etc.
+ AddPublicRoutes(processCtx, routers, cfg, &natsInstance, nil, rsAPI, nil, nil, nil, userAPI, nil, nil, caching.DisableMetrics)
+
+ accessTokens := map[*test.User]userDevice{
+ alice: {},
+ bob: {},
+ }
+ createAccessTokens(t, accessTokens, userAPI, processCtx.Context(), routers)
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ room := test.NewRoom(t, alice)
+ t.Cleanup(func() {
+ t.Logf("running cleanup for %s", tc.name)
+ })
+ // inject additional events
+ if tc.additionalEvents != nil {
+ tc.additionalEvents(t, room)
+ }
+ if err := api.SendEvents(context.Background(), rsAPI, api.KindNew, room.Events(), "test", "test", "test", nil, false); err != nil {
+ t.Fatalf("failed to send events: %v", err)
+ }
+
+ w := httptest.NewRecorder()
+ routers.Client.ServeHTTP(w, tc.request(t, room, accessTokens[tc.user].accessToken))
+ if w.Code != 200 && tc.wantOK {
+ t.Logf("%s", w.Body.String())
+ t.Fatalf("got HTTP %d want %d", w.Code, 200)
+ }
+ t.Logf("[%s] Resp: %s", tc.name, w.Body.String())
+
+ // check we got the expected events
+ if tc.wantOK {
+ memberCount := len(gjson.GetBytes(w.Body.Bytes(), "joined").Map())
+ if memberCount != tc.wantMemberCount {
+ t.Fatalf("expected %d members, got %d", tc.wantMemberCount, memberCount)
+ }
+ }
+ })
+ }
+ })
+}