fix(web): DM_CHANNEL_UPDATE и DM_CHANNEL_DELETE обновляют список бесед
Сервер присылал эти события и раньше, но клиент перечитывал список бесед только по `DM_CHANNEL_CREATE` и READY: добавление участника, переименование группы и выход из неё не появлялись в сайдбаре до перезагрузки, а удалённая беседа оставалась открытой. Теперь все три события перечитывают список (`DM_CHANNEL_UPDATE` меняет состав, имя и аватар группы сразу), а `DM_CHANNEL_DELETE` дополнительно убирает беседу из стора сессии и закрывает её, если она была открыта. Тесты в `web/tests/friends.test.tsx` падают на старом коде: переименование группы видно второму участнику, удалённая беседа исчезает и закрывается.
This commit is contained in:
@@ -743,6 +743,64 @@ describe('события шлюза о друзьях', () => {
|
||||
expect(screen.getByTestId('dm-status-dm-1')).toHaveAttribute('data-status', 'online');
|
||||
});
|
||||
|
||||
it('DM_CHANNEL_UPDATE перечитывает список бесед', async () => {
|
||||
// Состав и имя группы меняются событием: сервер шлёт только channel_id,
|
||||
// поэтому список бесед перечитывается целиком (AGENT.md 7.8).
|
||||
let renamed = false;
|
||||
installFetch(
|
||||
baseRoutes(empty, [
|
||||
{
|
||||
match: '/api/v1/users/@me/channels',
|
||||
response: () =>
|
||||
json({
|
||||
channels: renamed ? [directChannel('dm-1', 'Аня и Борис')] : [],
|
||||
}),
|
||||
},
|
||||
]),
|
||||
);
|
||||
const gateway = installGatewaySocket(makeReadySnapshot([]));
|
||||
|
||||
renderApp('/app/friends');
|
||||
await screen.findByTestId('guild-rail');
|
||||
await gateway.greet();
|
||||
expect(await screen.findByText('Личных бесед пока нет.')).toBeVisible();
|
||||
|
||||
renamed = true;
|
||||
await dispatchEvent(gateway, 'DM_CHANNEL_UPDATE', { channel_id: 'dm-1' });
|
||||
|
||||
expect(await screen.findByTestId('dm-link-dm-1')).toHaveTextContent('Аня и Борис');
|
||||
});
|
||||
|
||||
it('DM_CHANNEL_DELETE убирает беседу и закрывает её', async () => {
|
||||
let removed = false;
|
||||
installFetch(
|
||||
baseRoutes(empty, [
|
||||
{
|
||||
match: '/api/v1/users/@me/channels',
|
||||
response: () => json({ channels: removed ? [] : [directChannel('dm-1')] }),
|
||||
},
|
||||
]),
|
||||
);
|
||||
const gateway = installGatewaySocket(
|
||||
makeReadySnapshot(
|
||||
[],
|
||||
[{ id: 'dm-1', name: 'Боб', recipient_id: 'user-2', status: 'online' }],
|
||||
),
|
||||
);
|
||||
|
||||
renderApp('/app/friends/dm-1');
|
||||
await screen.findByTestId('guild-rail');
|
||||
await gateway.greet();
|
||||
expect(await screen.findByTestId('dm-link-dm-1')).toBeVisible();
|
||||
|
||||
removed = true;
|
||||
await dispatchEvent(gateway, 'DM_CHANNEL_DELETE', { channel_id: 'dm-1' });
|
||||
|
||||
// Беседа исчезла из списка, а открытая беседа закрылась: показываем список.
|
||||
await waitFor(() => expect(screen.queryByTestId('dm-link-dm-1')).not.toBeInTheDocument());
|
||||
expect(await screen.findByText('Личных бесед пока нет.')).toBeVisible();
|
||||
});
|
||||
|
||||
it('RELATIONSHIP_UPDATE перечитывает друзей', async () => {
|
||||
let hasFriend = false;
|
||||
installFetch(baseRoutes(() => (hasFriend ? { ...empty, friends: [bob] } : empty)));
|
||||
|
||||
Reference in New Issue
Block a user