feat(cosmetics): оформление «для друзей» в друзьях и личных беседах

- API: список друзей отдаёт вычисленное оформление «для друзей» одним запросом
  на весь список (AGENT.md 7.2)
- клиент: рамка, иконка, цвет и эффект ника в списке друзей, в ленте личных
  бесед — из профиля собеседника
- тесты: Go на список друзей, Vitest на отрисовку в друзьях
This commit is contained in:
2026-09-21 01:48:56 +03:00
parent 75b71da7b7
commit a36ee9527b
8 changed files with 192 additions and 5 deletions
+38
View File
@@ -13,6 +13,7 @@ import {
recordedRequests,
renderApp,
resetStores,
waitForPage,
type FetchRoute,
} from './helpers';
@@ -284,3 +285,40 @@ describe('галерея оформления сервера', () => {
});
});
});
describe('оформление «для друзей»', () => {
it('показывает рамку, иконку и эффект в списке друзей', async () => {
const friend = {
user_id: 'u-2',
username: 'bob',
display_name: 'Боб',
status: 'online',
visible_status: 'online',
is_instance_admin: false,
badges: [],
timezone: 'Europe/Moscow',
relationship: 'friend',
cosmetics: { frame_id: 'f-9', badge_id: 'b-9', nick_color: 0x2ecc71, nick_effect: 'glow' },
};
installFetch([
{
match: '/api/v1/users/@me/relationships',
response: () => json({ friends: [friend], incoming: [], outgoing: [], blocked: [] }),
},
{ match: '/api/v1/users/@me/channels', response: () => json({ channels: [] }) },
{ match: '/api/v1/users/@me', response: () => json({ user }) },
{ match: '/api/v1/instance', response: () => json({ instance: { name: 'glchat-test' } }) },
{ match: '/api/v1/users/@me/guilds', response: () => json({ guilds: [] }) },
]);
renderApp('/app/friends');
await waitForPage('Друзья');
// Список друзей свёрнут по умолчанию: раскрываем его перед проверкой.
await userEvent.click(await screen.findByTestId('friends-list-toggle'));
const row = await screen.findByTestId('friend-name-u-2');
expect(within(row).getByTestId('avatar-frame')).toBeInTheDocument();
expect(within(row).getByTestId('nick-badge').getAttribute('src')).toBe('/files/b-9');
expect(within(row).getByTestId('nick-name')).toHaveClass('gl-nick-glow');
expect(within(row).getByTestId('nick-name')).toHaveStyle({ color: '#2ecc71' });
});
});