5180 fichiers 38.5 Mo 0 téléchargements 290 vues mis à jour il y a 6 heures ui
NewsWindow.test.tsx 3 Ko Télécharger le fichier
import { act, cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { loginWindowStorageKey } from '../hooks/useDraggableLoginWindow';
import { NewsWindow } from './NewsWindow';

const NEWS_WINDOW_OFFSET_KEY = loginWindowStorageKey('news');

vi.mock('../utils/i18n', () => ({
    interpolate: (value: string) => value,
    t: (_key: string, fallback: string) => fallback
}));

const newsResponse = () => ({
    ok: true,
    json: async () => ({ news: [{ id: 1, title: 'Grand opening', body: 'Come and see.' }] })
});

const renderNews = async () => {
    render(<NewsWindow newsUrl="https://hotel.test/news.json" />);

    await screen.findByText('Grand opening');

    const handle = screen.getByText('Hotel News').parentElement as HTMLElement;
    const stack = handle.closest('.login-news-stack') as HTMLElement;

    return { handle, stack };
};

describe('NewsWindow dragging', () => {
    beforeEach(() => {
        window.localStorage.clear();
        vi.stubGlobal('fetch', vi.fn(async () => newsResponse()));
    });

    afterEach(() => {
        cleanup();
        vi.unstubAllGlobals();
    });

    it('moves with the title bar and remembers the spot', async () => {
        const { handle, stack } = await renderNews();

        fireEvent.pointerDown(handle, { button: 0, pointerId: 1, clientX: 100, clientY: 100 });
        fireEvent.pointerMove(handle, { pointerId: 1, clientX: 140, clientY: 75 });

        expect(stack.classList.contains('is-dragging')).toBe(true);
        expect(stack.style.getPropertyValue('--login-drag-x')).toBe('40px');
        expect(stack.style.getPropertyValue('--login-drag-y')).toBe('-25px');

        fireEvent.pointerUp(handle, { pointerId: 1, clientX: 140, clientY: 75 });

        expect(stack.classList.contains('is-dragging')).toBe(false);
        expect(JSON.parse(window.localStorage.getItem(NEWS_WINDOW_OFFSET_KEY))).toEqual({ x: 40, y: -25 });
    });

    it('starts from the remembered spot and resets on double click', async () => {
        window.localStorage.setItem(NEWS_WINDOW_OFFSET_KEY, JSON.stringify({ x: 12, y: 34 }));

        const { handle, stack } = await renderNews();

        expect(stack.style.getPropertyValue('--login-drag-x')).toBe('12px');
        expect(stack.style.getPropertyValue('--login-drag-y')).toBe('34px');

        await act(async () => {
            fireEvent.doubleClick(handle);
        });

        expect(stack.style.getPropertyValue('--login-drag-x')).toBe('0px');
        expect(window.localStorage.getItem(NEWS_WINDOW_OFFSET_KEY)).toBeNull();
    });

    it('ignores non-primary buttons', async () => {
        const { handle, stack } = await renderNews();

        fireEvent.pointerDown(handle, { button: 2, pointerId: 1, clientX: 100, clientY: 100 });
        fireEvent.pointerMove(handle, { pointerId: 1, clientX: 140, clientY: 75 });

        expect(stack.style.getPropertyValue('--login-drag-x')).toBe('0px');
    });
});
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser