fix(social): complete shared listening request lifecycle
This commit is contained in:
1 parent
cb22f15912
commit
59983ed1b3
14 files changed
+302
-18
No files matched your search
@@ -85,6 +85,18 @@ func TestActivityRoomsAndChatPrivacy(t *testing.T) {
|
||||
require.NoError(t, s.publishActivity(ctx, owner, activity))
|
||||
join := gen.ListeningAction{Id: uuid.New(), Action: "join", TargetId: owner}
|
||||
require.Error(t, s.listeningAction(ctx, friend, join)) // default nobody
|
||||
_, e = pool.Exec(ctx, `UPDATE users SET listening_requests='friends',listening_auto_accept='nobody' WHERE id=$1`, owner)
|
||||
require.NoError(t, e)
|
||||
require.NoError(t, s.listeningAction(ctx, friend, join))
|
||||
pendingJoin, e := s.listeningState(ctx, friend)
|
||||
require.NoError(t, e)
|
||||
require.Nil(t, pendingJoin.Room, "sending a request is not admission")
|
||||
require.Len(t, pendingJoin.Requests, 1)
|
||||
pendingHost, e := s.listeningState(ctx, owner)
|
||||
require.NoError(t, e)
|
||||
require.Len(t, pendingHost.Room.Participants, 1)
|
||||
require.NoError(t, s.listeningAction(ctx, friend, gen.ListeningAction{Id: uuid.New(), Action: "cancel", TargetId: join.Id}))
|
||||
join.Id = uuid.New()
|
||||
_, e = pool.Exec(ctx, `UPDATE users SET listening_requests='friends',listening_auto_accept='everyone' WHERE id=$1`, owner)
|
||||
require.NoError(t, e)
|
||||
require.Error(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "join", TargetId: owner}))
|
||||
@@ -94,6 +106,12 @@ func TestActivityRoomsAndChatPrivacy(t *testing.T) {
|
||||
require.NotNil(t, state.Room)
|
||||
require.Equal(t, owner, state.Room.OwnerId)
|
||||
require.Len(t, state.Room.Participants, 2)
|
||||
// Reopening the dialog must not create another pending request for an
|
||||
// already admitted listener, even with a new action ID.
|
||||
require.NoError(t, s.listeningAction(ctx, friend, gen.ListeningAction{Id: uuid.New(), Action: "join", TargetId: owner}))
|
||||
state, e = s.listeningState(ctx, friend)
|
||||
require.NoError(t, e)
|
||||
require.Empty(t, state.Requests)
|
||||
hostctx := auth.WithPrincipal(ctx, auth.Principal{UserID: owner})
|
||||
badctx := auth.WithPrincipal(ctx, auth.Principal{UserID: friend})
|
||||
input := gen.ListeningRoomInput{RoomId: state.Room.Id, DeviceId: device, Sequence: 1, Playing: false, TrackId: &track, PositionMs: 3000}
|
||||
@@ -113,11 +131,50 @@ func TestActivityRoomsAndChatPrivacy(t *testing.T) {
|
||||
require.NoError(t, e)
|
||||
require.Len(t, state.Requests, 1)
|
||||
require.Nil(t, state.Room)
|
||||
reserved, e := s.listeningState(ctx, owner)
|
||||
require.NoError(t, e)
|
||||
require.NotNil(t, reserved.Room)
|
||||
require.Len(t, reserved.Room.Participants, 1, "pending invite must not admit the guest")
|
||||
require.NoError(t, s.listeningAction(ctx, owner, invite), "network retry is idempotent")
|
||||
duplicate := invite
|
||||
duplicate.Id = uuid.New()
|
||||
require.ErrorContains(t, s.listeningAction(ctx, owner, duplicate), "listening_pending")
|
||||
require.Error(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "cancel", TargetId: invite.Id}))
|
||||
require.NoError(t, s.listeningAction(ctx, owner, gen.ListeningAction{Id: uuid.New(), Action: "cancel", TargetId: invite.Id}))
|
||||
state, e = s.listeningState(ctx, other)
|
||||
require.NoError(t, e)
|
||||
require.Empty(t, state.Requests)
|
||||
require.Nil(t, state.Room)
|
||||
invite.Id = uuid.New()
|
||||
require.NoError(t, s.listeningAction(ctx, owner, invite))
|
||||
_, e = pool.Exec(ctx, `UPDATE listening_requests SET expires_at=now()-interval '1 second' WHERE id=$1`, invite.Id)
|
||||
require.NoError(t, e)
|
||||
require.ErrorContains(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "accept", TargetId: invite.Id}), "listening_expired")
|
||||
state, e = s.listeningState(ctx, other)
|
||||
require.NoError(t, e)
|
||||
require.Empty(t, state.Requests)
|
||||
require.Nil(t, state.Room)
|
||||
invite.Id = uuid.New()
|
||||
require.NoError(t, s.listeningAction(ctx, owner, invite))
|
||||
require.NoError(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "decline", TargetId: invite.Id}))
|
||||
state, e = s.listeningState(ctx, other)
|
||||
require.NoError(t, e)
|
||||
require.Empty(t, state.Requests)
|
||||
require.Nil(t, state.Room)
|
||||
invite.Id = uuid.New()
|
||||
require.NoError(t, s.listeningAction(ctx, owner, invite))
|
||||
_, e = pool.Exec(ctx, `UPDATE users SET listening_requests='nobody' WHERE id=$1`, other)
|
||||
require.NoError(t, e)
|
||||
require.ErrorContains(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "accept", TargetId: invite.Id}), "listening_unavailable")
|
||||
_, e = pool.Exec(ctx, `UPDATE users SET listening_requests='everyone' WHERE id=$1`, other)
|
||||
require.NoError(t, e)
|
||||
require.Error(t, s.listeningAction(ctx, friend, gen.ListeningAction{Id: uuid.New(), Action: "accept", TargetId: invite.Id}))
|
||||
require.NoError(t, s.listeningAction(ctx, other, gen.ListeningAction{Id: uuid.New(), Action: "accept", TargetId: invite.Id}))
|
||||
state, e = s.listeningState(ctx, other)
|
||||
require.NoError(t, e)
|
||||
require.Equal(t, owner, state.Room.OwnerId)
|
||||
require.Len(t, state.Room.Participants, 2)
|
||||
require.ErrorContains(t, s.listeningAction(ctx, friend, gen.ListeningAction{Id: uuid.New(), Action: "invite", TargetId: other, DeviceId: &device, TrackId: &track}), "listening_busy")
|
||||
_, e = pool.Exec(ctx, `UPDATE listening_rooms SET updated_at=now()-interval '31 seconds' WHERE id=$1`, state.Room.Id)
|
||||
require.NoError(t, e)
|
||||
state, e = s.listeningState(ctx, other)
|
||||
|
||||
Reference in new issue
Block a user