fix(web): возврат в сервер после кика виден в рейке без перезагрузки
По GUILD_CREATE клиент забирал сводку серверов через fetchQuery, а список myGuilds кэшируется на 30 секунд: после кика и повторного входа сервер возвращался на сервере, но плитка в рейке не появлялась до перезагрузки (AGENT.md 11.6). Теперь обработчик GUILD_CREATE сначала помечает список серверов устаревшим и только потом читает его, поэтому запрос уходит в REST даже при свежем кэше. Сценарий кика в пункте 11 матрицы проверяет плитку в рейке, а не только состав участников по ответу сервера. Тест: «GUILD_CREATE перечитывает список серверов, а не берёт свежий кэш».
This commit is contained in:
@@ -4,6 +4,7 @@ import { QueryClient } from '@tanstack/react-query';
|
|||||||
|
|
||||||
import { GatewayOp, parseGatewaySnapshot } from '@/api/gateway';
|
import { GatewayOp, parseGatewaySnapshot } from '@/api/gateway';
|
||||||
import { guildMembersQueryKey, guildQueryKey, guildRolesQueryKey } from '@/api/guilds';
|
import { guildMembersQueryKey, guildQueryKey, guildRolesQueryKey } from '@/api/guilds';
|
||||||
|
import { fetchMyGuilds, myGuildsQueryKey } from '@/api/users';
|
||||||
import { setQueryClient } from '@/lib/queryClient';
|
import { setQueryClient } from '@/lib/queryClient';
|
||||||
import { dispatchGatewayEvent, useGatewayStore } from '@/stores/gateway';
|
import { dispatchGatewayEvent, useGatewayStore } from '@/stores/gateway';
|
||||||
import { useSessionStore } from '@/stores/session';
|
import { useSessionStore } from '@/stores/session';
|
||||||
@@ -330,6 +331,41 @@ describe('диспетчер событий шлюза', () => {
|
|||||||
).toBe(true);
|
).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('GUILD_CREATE перечитывает список серверов, а не берёт свежий кэш', async () => {
|
||||||
|
// Возврат в сервер после кика: список серверов уже читался меньше 30 секунд
|
||||||
|
// назад, поэтому fetchQuery вернул бы устаревший кэш без нового сервера.
|
||||||
|
const { client } = makeRecordingClient();
|
||||||
|
const guild = {
|
||||||
|
id: 'g-5',
|
||||||
|
name: 'Вернулся',
|
||||||
|
owner_id: 'user-1',
|
||||||
|
is_main: false,
|
||||||
|
member_count: 1,
|
||||||
|
my_role_ids: [],
|
||||||
|
my_permissions: [],
|
||||||
|
};
|
||||||
|
const fetchMock = installFetch([
|
||||||
|
{
|
||||||
|
match: '/api/v1/users/@me/guilds',
|
||||||
|
response: () => json({ guilds: [guild] }),
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
await client.fetchQuery({
|
||||||
|
queryKey: myGuildsQueryKey,
|
||||||
|
queryFn: () => fetchMyGuilds(),
|
||||||
|
});
|
||||||
|
|
||||||
|
dispatchGatewayEvent({ op: 0, t: 'GUILD_CREATE', s: 14, d: { guild_id: 'g-5' } });
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(useSessionStore.getState().guilds.some((item) => item.id === 'g-5')).toBe(true);
|
||||||
|
});
|
||||||
|
expect(
|
||||||
|
recordedRequests(fetchMock).filter((request) => request.url.includes('/users/@me/guilds')),
|
||||||
|
'список серверов перечитан по REST',
|
||||||
|
).toHaveLength(2);
|
||||||
|
});
|
||||||
|
|
||||||
it('неизвестные и повреждённые события не ломают диспетчер', () => {
|
it('неизвестные и повреждённые события не ломают диспетчер', () => {
|
||||||
seedSession();
|
seedSession();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user