/* * Copyright (C) 2026 Fluxer Contributors * * This file is part of Fluxer. * * Fluxer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fluxer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Fluxer. If not, see . */ import EmojiStore from '@app/stores/EmojiStore'; import type {GuildReadyData} from '@app/types/gateway/GatewayGuildTypes'; import type {GuildEmoji} from '@fluxer/schema/src/domains/guild/GuildEmojiSchemas'; import type {Guild} from '@fluxer/schema/src/domains/guild/GuildResponseSchemas'; import {beforeEach, describe, expect, test} from 'vitest'; function createGuildBase(guildId: string): Guild { return { id: guildId, name: `Guild ${guildId}`, icon: null, vanity_url_code: null, owner_id: '1000', system_channel_id: null, features: [], unavailable: false, }; } function createGuildReadyData(guildId: string, emojis: ReadonlyArray): GuildReadyData { return { id: guildId, properties: createGuildBase(guildId), channels: [], emojis, stickers: [], members: [], member_count: 0, presences: [], voice_states: [], roles: [], joined_at: '2026-01-01T00:00:00.000Z', unavailable: false, }; } describe('EmojiStore', () => { beforeEach(() => { EmojiStore.handleConnectionOpen({guilds: []}); }); test('keeps guild emojis on metadata-only guild update payloads', () => { const guildId = '1'; EmojiStore.handleConnectionOpen({ guilds: [ createGuildReadyData(guildId, [ { id: '11', name: 'party', animated: false, }, ]), ], }); expect(EmojiStore.getGuildEmoji(guildId)).toHaveLength(1); EmojiStore.handleGuildUpdate({ guild: { ...createGuildBase(guildId), name: 'Guild renamed', }, }); const emojisAfterGuildUpdate = EmojiStore.getGuildEmoji(guildId); expect(emojisAfterGuildUpdate).toHaveLength(1); expect(emojisAfterGuildUpdate[0]?.id).toBe('11'); }); test('replaces guild emojis when a payload includes an explicit emoji list', () => { const guildId = '2'; EmojiStore.handleConnectionOpen({ guilds: [ createGuildReadyData(guildId, [ { id: '21', name: 'old', animated: false, }, ]), ], }); EmojiStore.handleGuildUpdate({ guild: createGuildReadyData(guildId, [ { id: '22', name: 'new', animated: false, }, ]), }); const emojisAfterExplicitUpdate = EmojiStore.getGuildEmoji(guildId); expect(emojisAfterExplicitUpdate).toHaveLength(1); expect(emojisAfterExplicitUpdate[0]?.id).toBe('22'); }); });