import { describe, it, expect } from 'vitest' import { loadLib } from './helpers/loadLib.js' const { chipState, chipLabel, discordPanelDefaults, discordAddRequest } = loadLib('chip.js', [ 'chipState', 'chipLabel', 'discordPanelDefaults', 'discordAddRequest' ]) const discord = (extra = {}) => ({ platform: 'discord', slug: '111/222', discord: { server_id: '111', channel_id: '222', server_name: 'Studio', channel_name: 'drops', server_url: 'https://discord.com/channels/111', channel_url: 'https://discord.com/channels/111/222' }, ...extra }) describe('chip state and label', () => { it('keeps the one-click wording on creator platforms', () => { expect(chipLabel({ state: 'new', platform: 'patreon' }, 'Patreon')).toBe('+ Add to FabledCurator') expect( chipLabel({ state: 'artist_match', platform: 'patreon', artist: { name: 'Atole' } }, 'Patreon') ).toBe('+ Add Patreon source to Atole') expect(chipLabel({ state: 'source_match', platform: 'patreon' }, 'Patreon')).toBe( '✓ In FabledCurator · Patreon' ) }) it('offers the channel by name on Discord, whatever the suggestion', () => { expect(chipLabel(discord({ state: 'new' }), 'Discord')).toBe('+ Add #drops to FabledCurator') expect(chipLabel(discord({ state: 'artist_match', artist: { name: 'A' } }), 'Discord')).toBe( '+ Add #drops to FabledCurator' ) }) it('says "this channel" when the token could not read the name', () => { const p = discord({ state: 'new' }) p.discord.channel_name = null expect(chipLabel(p, 'Discord')).toBe('+ Add this channel to FabledCurator') }) it('says whose source a Discord channel already is, and when the server covers it', () => { const artist = { name: 'Tamada', slug: 'tamada' } expect(chipLabel(discord({ state: 'source_match', artist, covered_by_server: false }), 'Discord')).toBe( '✓ In FabledCurator · Tamada' ) expect(chipLabel(discord({ state: 'source_match', artist, covered_by_server: true }), 'Discord')).toBe( '✓ Whole server in FabledCurator · Tamada' ) }) it('falls back to the generic add when the probe failed', () => { expect(chipState({ error: 'x' })).toBe('new') expect(chipLabel({ error: 'x' }, '')).toBe('+ Add to FabledCurator') expect(chipState({ state: 'source_match' })).toBe('source-match') }) }) describe('Discord Add panel', () => { it('opens on the channel with the suggested artist preselected', () => { const d = discordPanelDefaults(discord({ state: 'artist_match', artist: { id: 7, name: 'Tamada' } })) expect(d.scope).toBe('channel') expect(d.artist).toEqual({ id: 7, name: 'Tamada' }) expect(d.artistName).toBe('Tamada') }) it('proposes a new artist named after the server when nothing is suggested', () => { const d = discordPanelDefaults(discord({ state: 'new' })) expect(d.artist).toBe(null) expect(d.artistName).toBe('Studio') }) it('sends a picked artist by id', () => { const choice = discordPanelDefaults(discord({ state: 'artist_match', artist: { id: 7, name: 'Tamada' } })) expect(discordAddRequest(choice)).toEqual({ url: 'https://discord.com/channels/111/222', artistId: 7 }) }) it('sends a typed name once the picked artist has been edited away', () => { const choice = discordPanelDefaults(discord({ state: 'artist_match', artist: { id: 7, name: 'Tamada' } })) choice.artistName = 'Tamada Alt' expect(discordAddRequest(choice)).toEqual({ url: 'https://discord.com/channels/111/222', artistName: 'Tamada Alt' }) }) it('adds the whole server when the operator picks it', () => { const choice = discordPanelDefaults(discord({ state: 'new' })) choice.scope = 'server' expect(discordAddRequest(choice).url).toBe('https://discord.com/channels/111') }) it('has nothing to send without an artist', () => { const choice = discordPanelDefaults(discord({ state: 'new' })) choice.artistName = ' ' expect(discordAddRequest(choice)).toBe(null) }) })